11.1 粒子系统基础
粒子系统是一种用于模拟某些种类“模糊”现象的计算机图形技术,如火、烟、雨、雪、星尘等。在 Three.js 中,粒子系统可以通过 Points
对象来实现。
11.2 创建自定义粒子系统
11.2.1 创建粒子几何体和材质
首先,我们需要创建一个粒子几何体和粒子材质。
// 创建粒子几何体
const particleCount = 5000;
const particles = new THREE.BufferGeometry();
const positions = new Float32Array(particleCount * 3);
for (let i = 0; i < particleCount * 3; i++) {
positions[i] = (Math.random() * 2 - 1) * 500;
}
particles.setAttribute('position', new THREE.BufferAttribute(positions, 3));
// 创建粒子材质
const particleMaterial = new THREE.PointsMaterial({
color: 0xffffff,
size: 5,
sizeAttenuation: true,
transparent: true,
opacity: 0.7
});
// 创建粒子系统
const particleSystem = new THREE.Points(particles, particleMaterial);
scene.add(particleSystem);
11.2.2 动画粒子系统
接下来,我们将为粒子系统添加动画效果。
function animateParticles() {
requestAnimationFrame(animateParticles);
const positions = particleSystem.geometry.attributes.position.array;
for (let i = 0; i < particleCount; i++) {
positions[i * 3 + 1] -= 2; // 让粒子沿 y 轴下落
if (positions[i * 3 + 1] < -250) {
positions[i * 3 + 1] = 250; // 重置粒子位置
}
}
particleSystem.geometry.attributes.position.needsUpdate = true;
// 渲染场景
renderer.render(scene, camera);
}
animateParticles();
11.3 粒子效果应用
示例:模拟雪花效果
下面我们将实现一个简单的雪花效果。
// 创建雪花粒子系统
const snowflakeCount = 10000;
const snowflakes = new THREE.BufferGeometry();
const snowflakePositions = new Float32Array(snowflakeCount * 3);
for (let i = 0; i < snowflakeCount * 3; i++) {
snowflakePositions[i] = (Math.random() * 2 - 1) * 500;
}
snowflakes.setAttribute('position', new THREE.BufferAttribute(snowflakePositions, 3));
const snowflakeMaterial = new THREE.PointsMaterial({
color: 0xffffff,
size: 2,
sizeAttenuation: true,
transparent: true,
opacity: 0.8
});
const snowflakeSystem = new THREE.Points(snowflakes, snowflakeMaterial);
scene.add(snowflakeSystem);
// 动画雪花粒子系统
function animateSnowflakes() {
requestAnimationFrame(animateSnowflakes);
const positions = snowflakeSystem.geometry.attributes.position.array;
for (let i = 0; i < snowflakeCount; i++) {
positions[i * 3 + 1] -= 1; // 让雪花沿 y 轴下落
if (positions[i * 3 + 1] < -250) {
positions[i * 3 + 1] = 250; // 重置雪花位置
}
}
snowflakeSystem.geometry.attributes.position.needsUpdate = true;
// 渲染场景
renderer.render(scene, camera);
}
animateSnowflakes();
11.4 后期处理简介
后期处理(Post-processing)是指在渲染图像生成后,对图像进行的进一步处理,以增强视觉效果。常见的后期处理效果有模糊、边缘检测、光晕、HDR 等。