Three.js 下雪效果

提示词

PROMPT
1
使用 Three.js 创建下雪效果,粒子从上到下飘落,使用自定义着色器实现雪花形状。

效果描述

这是一个展示如何创建下雪效果的示例,粒子从上到下飘落。

效果特性

  • 下雪效果:创建 1000 个雪花粒子
  • 飘落动画:雪花从上到下飘落
  • 自定义着色器:使用自定义着色器实现雪花形状
  • 白色雪花:使用白色雪花
  • 加法混合:使用 AdditiveBlending
  • 循环动画:雪花循环飘落

核心参数

参数 说明
粒子数量 1000 粒子总数
粒子大小 5 粒子大小
飘落速度 0.1 飘落速度
飘落范围 -100 到 100 飘落范围
雪花颜色 #ffffff 白色

核心代码解析

创建雪花

JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
snowMaterial = new THREE.PointsMaterial({
    size: 5,
    blending: THREE.AdditiveBlending,
    transparent: true,
});

geometry = new THREE.BufferGeometry();

let positions = new Float32Array(particles * 3);

for (let i = 0; i < particles * 3; i += 3) {
    positions[i] = Math.random() * 200 - 100;
    positions[i + 1] = Math.random() * 200 - 100;
    positions[i + 2] = Math.random() * 200 - 100;
}
geometry.setAttribute("position", new THREE.Float32BufferAttribute(positions, 3));

snowMaterial.onBeforeCompile = (shader) => {
    shader.uniforms.uColor = {
        value: new THREE.Color(0xffffff),
    };

    shader.fragmentShader = shader.fragmentShader.replace(
        `#include <common>`,
        `
            #include <common>
                uniform vec3 uColor;
            `
    );

    shader.fragmentShader = shader.fragmentShader.replace(
        `#include <premultiplied_alpha_fragment>`,
        `
            #include <premultiplied_alpha_fragment>
                float distanceLen = distance(gl_PointCoord,vec2(0.5));
                distanceLen = 1.0 - distanceLen;
                distanceLen = pow(distanceLen,10.0);
                vec4 color = vec4(uColor,distanceLen);
                gl_FragColor = color;
            `
    );
};

mesh = new THREE.Points(geometry, snowMaterial);
scene.add(mesh);

更新雪花位置

JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function update(time, position) {
    if (snowMaterial) {
        const positions = mesh.geometry.getAttribute("position").array;
        for (let i = 0; i < positions.length; i += 3) {
            positions[i + 1] -= 0.1;
            positions[i] -= Math.sin(i) * 0.1;
            positions[i + 2] -= Math.sin(i) * 0.1;
            if (positions[i + 1] < -100) {
                positions[i + 1] = 100;
            }
        }

        mesh.geometry.getAttribute("position").needsUpdate = true;
    }
}

技术亮点

  1. 下雪效果:创建下雪效果
  2. 飘落动画:雪花从上到下飘落
  3. 自定义着色器:使用自定义着色器实现雪花形状
  4. 白色雪花:使用白色雪花
  5. 循环动画:雪花循环飘落

调试技巧

  1. 粒子数量:调整粒子数量测试性能
  2. 飘落速度:调整飘落速度
  3. 飘落范围:调整飘落范围
  4. 雪花大小:调整雪花大小
  5. 雪花颜色:调整雪花颜色

扩展方向

  1. 风力效果:添加风力效果
  2. 雪花大小:随机雪花大小
  3. 雪花旋转:添加雪花旋转
  4. 不同雪花:使用不同雪花形状
  5. 交互控制:添加交互控制

本文档由 ThreeLab 编辑整理,如需转载,请注明出处。