three实现三维发光粒子宇宙银河系星体旋转动画效果代码

代码语言:html

所属分类:三维

代码描述:three实现三维发光粒子宇宙银河系星体旋转动画效果代码,结合lil-gui科修改参数呈现不同的效果。

代码标签: three 三维 发光 粒子 宇宙 银河 星体 旋转 动画

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

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

<head>
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <meta charset="UTF-8">

  
  
  
<style>
html,
body {
  margin: 0;
  overflow: hidden;
}


.webgl {
  position: fixed;
  outline: none;
  width: 100%;
  height: 100%;
}
</style>


</head>

<body  >

<canvas class="webgl"></canvas>
<script  type="importmap">{
	"imports": {
		"three": "//repo.bfw.wiki/bfwrepo/js/module/three/build/three.module.js"
	}
}</script>


  
      <script type="module">
		import GUI from '//repo.bfw.wiki/bfwrepo/js/lil-gui.esm.js';
import { Clock } from "three";
import { OrbitControls } from '//repo.bfw.wiki/bfwrepo/js/module/three/examples/jsm/controls/OrbitControls.js';
import * as THREE from "three";
import { Perlin } from "//repo.bfw.wiki/bfwrepo/js/module/three-noise.js";
const gui = new GUI();
gui.close();
const scene = new THREE.Scene();
/**
 * Galaxy
 */
const parameters = {
    branchCount: 25000,
    size: 0.01,
    galaxyRadius: 20,
    branches: 40,
    noiseScale: 0.2,
    turnTheta: Math.PI * 0.75,
    randomness: 2,
    randomnessPower: 4.8,
    insideColor: '#14ffd8',
    outsideColor: '#ff00f7'
};
let geometry = null;
let material = null;
let points = null;
const generateGalaxy = () => {
    /**
     * Destroy previous galaxy
     */
    if (points !== null) {
        geometry.dispose();
        material.dispose();
        scene.remove(points);
    }
    /**
     * Geometry
     */
    geometry = new THREE.BufferGeometry();
    const positions = new Float32Array(parameters.branchCount * 3 * parameters.branches);
    const colors = new Float32Array(parameters.branchCount * 3 * parameters.branches);
    const colorInside = new THREE.Color(parameters.insideColor);
    const outsideColor = new THREE.Color(parameters.outsideColor);
    const perlin = new Perlin(Math.random());
    for (let branch = 0; branch < parameters.branches; branch++) {
        const theta = branch * ((Math.PI * 2.0) / parameters.branches);
        let point = new THREE.Vector2(Math.cos(theta) * 0.01, Math.sin(theta) * 0.01);
        for (let index = 0; index < parameters.branchCount; index++) {
            // Spin Position
            // const radius = Math.random() * parameters.galaxyRadius
            // const spinTheta = radius * parameters.spin
            // const pointTheta = spinTheta + theta
            // Noise Position
            const radius = (parameters.galaxyRadius / parameters.branchCount);
            const thetaOffset = perlin.get2(point.clone().multiplyScalar(parameters.noiseScale)) * parameters.turnTheta;
            const pointTheta = (theta + thetaOffset);
            point = point.add(new THREE.Vector2(Math.cos(pointTheta) * radius, Math.sin(pointTheta) * radius));
            const randomX = Math.pow(Math.random(), parameters.randomnessPower) * (Math.random() < 0.5 ? 1 : -1) * parameters.randomness;
            const randomY = Math.pow(Math.random(), parameters.randomnessPower) * (Math.random() < 0.5 ? 1 : -1) * parameters.randomness;
            const randomZ = Math.pow(Math.random(), parameters.randomnessPower) * (Math.random() < 0.5 ? 1 : -1) * parameters.randomness;
            const i3 = (branch * parameters.branchCount * 3) + (index * 3);
            positions[i3 + 0] =.........完整代码请登录后点击上方下载按钮下载查看

网友评论0