three实现三维带卫星的宇宙行星天体效果代码

代码语言:html

所属分类:三维

代码描述:three实现三维带卫星的宇宙行星天体效果代码

代码标签: three 三维 卫星 宇宙 行星 天体

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">

  
  
<style>
canvas {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  touch-action: none;
}
</style>

  
  
</head>

<body translate="no">
  
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.143.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/dat.gui-min.js"></script>

      <script >
const fovTmp = new THREE.Vector4();
const posTmp = new THREE.Vector3();
const spherical = new THREE.Spherical(5, Math.PI * 0.5, 0);
const zero = new THREE.Vector3(0, 0, 0);
const hp = Math.PI * 0.5;
const mouseRot = Math.PI * 0.1;
let autoMove = true;

function spaceScene() {
  const sky = new THREE.Group();

  const nStars = 5000;
  const points = new Float32Array(nStars * 3);
  const rand = new Float32Array(nStars);

  for (let i = 0; i < nStars; i++) {
    const theta = Math.random() * Math.PI * 2.0;
    const phi = Math.acos(Math.random() * 2.0 - 1.0);

    spherical.set(100, phi, theta);
    posTmp.setFromSpherical(spherical);
    posTmp.toArray(points, i * 3);

    rand[i] = Math.random();
  }

  const starsGeo = new THREE.BufferGeometry();
  starsGeo.setAttribute('position', new THREE.BufferAttribute(points, 3));
  starsGeo.setAttribute('random', new THREE.BufferAttribute(rand, 1));
  const starsMat = new THREE.ShaderMaterial({
    transparent: true,
    blending: THREE.AdditiveBlending,
    depthTest: true,
    depthWrite: false,
    vertexShader: `
    
attribute float random;
    
varying vec3 vPos;

void main() {
  vPos = position;
  vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
  gl_Position = projectionMatrix * mvPosition;
  gl_PointSize = 10.0 + random * 10.0;
}

`,
    fragmentShader: `

varying vec3 vPos;

float rand(vec2 co) {
    return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);
}

void main() {
  vec2 uv = vec2(gl_PointCoord.x, 1.0 - gl_PointCoord.y);
  vec2 centre = uv - 0.5;
  
  vec3 rgb = vec3(
    rand(vPos.xy),
    rand(vPos.xz),
    rand(vPos.yz)
  );

  vec3 col = vec3(0.5) + rgb * 0.5;
  
  float a = smoothstep(0.8, 1.0, 1.0 - length(centre) * 2.0);
  

  gl_FragColor = vec4(col, a);
}

` });


  const stars = new THREE.Points(starsGeo, starsMat);
  sky.add(stars);

  const planetGeo = new THREE.SphereGeometry(1, 64, 64);
  const planetMat = new THREE.ShaderMaterial({
    uniforms: {
      uTime: { value: 0 } },

    transparent: true,
    vertexShader: `

varying vec3 vPos;

void main() {
  vPos = position;
  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}

`,
    fragmentSh.........完整代码请登录后点击上方下载按钮下载查看

网友评论0