three.js 实现围墙效果

import * as THREE from “three”;
import { OrbitControls } from “three/addons/controls/OrbitControls.js”;

const { innerWidth, innerHeight } = window;
const aspect = innerWidth / innerHeight;

class Base {
constructor() {
this.init();
this.main();
}
main() {
const geometry = new THREE.CylinderGeometry(30, 30, 20, 4, 64, true);
const material = new THREE.ShaderMaterial({
side: THREE.DoubleSide,
transparent: true,
depthWrite: false,
uniforms: {
uTime: this.deltaTime,
},
vertexShader: varying vec2 vUv; void main(){ vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); } ,
fragmentShader: `
uniform float uTime;
varying vec2 vUv;
#define PI 3.14159265

                    void main(){

                    vec4 baseColor = vec4(0.0,1.,0.5,1.);
					
                    vec4 finalColor;
                        
                    float amplitude = 1.;
                    float frequency = 10.;
                    
                    float x = vUv.x;

                    float y = sin(x * frequency) ;
                    float t = 0.01*(-uTime*130.0);
                    y += sin(x*frequency*2.1 + t)*4.5;
                    y += sin(x*frequency*1.72 + t*1.121)*4.0;
                    y += sin(x*frequency*2.221 + t*0.437)*5.0;
                    y += sin(x*frequency*3.1122+ t*4.269)*2.5;
                    y *= amplitude*0.06;
                    y /= 3.;
                    y += 0.55;

                    vec4 color = gl_FragColor.rgba;

                    float r = step(0.5, fract(vUv.y - uTime));

                    baseColor.a = step(vUv.y,y) * (y-vUv.y)/y;
                    
                    gl_FragColor = baseColor;

                    }
                    `,
    });
    const cylinder = new THREE.Mesh(geometry, material);
    cylinder.position.y += 10;
    this.scene.add(cylinder);
}
init() {
    this.clock = new THREE.Clock();

    this.renderer = new THREE.WebGLRenderer({
        antialias: true,
        logarithmicDepthBuffer: true,
    });
    this.renderer.setPixelRatio(window.devicePixelRatio);
    this.renderer.setSize(innerWidth, innerHeight);
    this.renderer.setAnimationLoop(this.animate.bind(this));
    document.body.appendChild(this.renderer.domElement);

    this.camera = new THREE.PerspectiveCamera(60, aspect, 0.01, 10000);
    this.camera.position.set(0, 40, 40);

    this.scene = new THREE.Scene();

    this.controls = new OrbitControls(this.camera, this.renderer.domElement);

    this.deltaTime = {
        value: 0,
    };

    const grid = new THREE.GridHelper(100);
    this.scene.add(grid);

    const light = new THREE.AmbientLight(0xffffff, 0.5);
    this.scene.add(light);
}
animate() {
    this.controls.update();
    this.renderer.render(this.scene, this.camera);
    this.deltaTime.value = this.clock.getElapsedTime();
}

}
new Base();

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Three.js实现星云效果,可以按照以下步骤进行: 1. 引入Three.js库文件和需要的插件 ``` <script src="https://threejs.org/build/three.min.js"></script> <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script> ``` 2. 创建场景、相机和渲染器 ``` var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); ``` 3. 创建星云材质 ``` var starMaterial = new THREE.PointsMaterial({ color: 0xffffff, size: 0.1, map: THREE.ImageUtils.loadTexture( "https://threejs.org/examples/textures/sprites/disc.png" ), blending: THREE.AdditiveBlending, transparent: true, depthWrite: false }); ``` 4. 创建星云模型 ``` var starGeometry = new THREE.Geometry(); for (var i = 0; i < 10000; i++) { var star = new THREE.Vector3(); star.x = THREE.Math.randFloatSpread(2000); star.y = THREE.Math.randFloatSpread(2000); star.z = THREE.Math.randFloatSpread(2000); starGeometry.vertices.push(star); } var stars = new THREE.Points(starGeometry, starMaterial); scene.add(stars); ``` 5. 创建控制器,实现交互操作 ``` var controls = new THREE.OrbitControls(camera, renderer.domElement); controls.enableDamping = true; controls.dampingFactor = 0.25; controls.enableZoom = false; ``` 6. 渲染场景 ``` function animate() { requestAnimationFrame(animate); controls.update(); renderer.render(scene, camera); } animate(); ``` 7. 完整代码示例 ``` <!DOCTYPE html> <html> <head> <title>Starfield Simulation</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> body { margin: 0; padding: 0; overflow: hidden; } </style> </head> <body> <script src="https://threejs.org/build/three.min.js"></script> <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script> <script> var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); var starMaterial = new THREE.PointsMaterial({ color: 0xffffff, size: 0.1, map: THREE.ImageUtils.loadTexture( "https://threejs.org/examples/textures/sprites/disc.png" ), blending: THREE.AdditiveBlending, transparent: true, depthWrite: false }); var starGeometry = new THREE.Geometry(); for (var i = 0; i < 10000; i++) { var star = new THREE.Vector3(); star.x = THREE.Math.randFloatSpread(2000); star.y = THREE.Math.randFloatSpread(2000); star.z = THREE.Math.randFloatSpread(2000); starGeometry.vertices.push(star); } var stars = new THREE.Points(starGeometry, starMaterial); scene.add(stars); var controls = new THREE.OrbitControls(camera, renderer.domElement); controls.enableDamping = true; controls.dampingFactor = 0.25; controls.enableZoom = false; function animate() { requestAnimationFrame(animate); controls.update(); renderer.render(scene, camera); } animate(); </script> </body> </html> ``` 这样就可以在Vue项目中使用Three.js实现星云效果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值