Threejs粒子(ts+vue版)

1、效果与技术原理

本案例实现了一个动态三维粒子场系统,具有以下典型特征:

  1. 空间随机性:5000个粒子在10单位立方体内服从均匀分布
  2. 视觉混合效果:采用加法混合(Additive Blending)实现光晕叠加
  3. 透视关系处理:通过sizeAttenuation实现粒子近大远小
  4. 交互响应:支持轨道控制器视角操作(旋转/缩放)

效果:在这里插入图片描述
核心原理图解:

场景Scene
相机Camera
粒子系统Points
几何体BufferGeometry
材质PointsMaterial
透视投影Perspective
纹理映射AlphaMap
颜色混合Blending

2、三维场景构初始化

// 1. 场景容器创建
scene = new THREE.Scene();

// 2. 透视相机配置
camera = new THREE.PerspectiveCamera(
  75, // FOV视角(人眼约120度)
  window.innerWidth / window.innerHeight, 
  0.1, // 近裁面(避免渲染过近物体)
  1000 // 远裁面(避免渲染过远物体)
);

// 3. 渲染器初始化
renderer = new THREE.WebGLRenderer({
  canvas: webglCanvas.value,
  alpha: true, // 启用透明通道
  antialias: true // 开启抗锯齿
});
renderer.setClearColor(0x000000, 0); // 全透明背景

3、构建粒子系统

const count = 5000; // 粒子数量
const positions = new Float32Array(count * 3); // XYZ坐标
const colors = new Float32Array(count * 3); // RGB颜色

for(let i=0; i<count; i++){
  // 位置范围[-5,5]
  positions[i*3] = (Math.random()-0.5)*10; 
  positions[i*3+1] = (Math.random()-0.5)*10;
  positions[i*3+2] = (Math.random()-0.5)*10;
  
  // 颜色随机生成
  colors[i*3] = Math.random(); // R
  colors[i*3+1] = Math.random(); // G
  colors[i*3+2] = Math.random(); // B
}

particleGeometry.setAttribute(
  'position', 
  new THREE.BufferAttribute(positions, 3)
);
particleGeometry.setAttribute(
  'color',
  new THREE.BufferAttribute(colors, 3)
);
const particlesMaterial = new THREE.PointsMaterial({
  size: 0.1, // 基础粒子尺寸
  sizeAttenuation: true, // 启用透视缩放
  transparent: true, // 允许透明
  alphaMap: particleTexture, // 透明贴图控制形状
  depthWrite: false, // 关闭深度缓冲写入
  blending: THREE.AdditiveBlending, // 加法混合模式
  vertexColors: true // 启用顶点颜色
});

4、交互与可视化进阶

轨道控制器优化:

controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true; // 启用惯性
controls.dampingFactor = 0.05; // 惯性系数
controls.rotateSpeed = 0.5; // 旋转灵敏度
controls.minDistance = 2; // 最近缩放距离
controls.maxDistance = 20; // 最远缩放距离

自适应响应方案:

window.addEventListener('resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix(); // 必须手动更新
  renderer.setSize(window.innerWidth, window.innerHeight);
});

5、常见问题

常见问题可能原因解决方案
粒子显示为黑色未启用顶点颜色检查vertexColors:true配置
边缘锯齿严重抗锯齿未开启启用antialias:true
移动卡顿帧率过高限制最大FPS:requestAnimationFrame节流
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小牛码495

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值