1. 3D烟花效果的技术实现原理
用Canvas+JS实现3D烟花效果,本质上是在二维平面上模拟三维空间的视觉欺骗。这里的关键在于透视投影算法和粒子系统的配合。我当年第一次实现这个效果时,调试了整整三天才让烟花看起来有立体感。
透视投影的核心是这个公式:
function rasterizePoint(x,y,z){
x-=playerX; y-=playerY; z-=playerZ;
p=Math.atan2(x,z);
d=Math.sqrt(x*x+z*z);
x=Math.sin(p-yaw)*d;
z=Math.cos(p-yaw)*d;
p=Math.atan2(y,z);
d=Math.sqrt(y*y+z*z);
y=Math.sin(p-pitch)*d;
z=Math.cos(p-pitch)*d;
return {
x:cx+x/z*scale,
y:cy+y/z*scale,
d:z
};
}
这个函数将3D坐标(x,y,z)转换为2D画布坐标。其中playerX/Y/Z代表观察者位置,yaw/pitch是视角方向,scale是缩放系数。我建议初学者可以先用固定视角参数,等效果稳定后再考虑视角变换。
粒子系统的实现更考验细节处理。每个烟花爆炸后会产生50-100个火花粒子,每个粒子需要维护:
- 位置坐标(x,y,z)
- 运动速度(vx,vy,vz)
- 生命周期(从1.0衰减到0)
- 颜色和大小
实测发现,粒子数量超过300个时,普通手机浏览器就会出现明显卡顿。所以我在代码中做了这些优化:
- 使用对象池复用粒子对象
- 将粒子按深度排序后绘制(远处先画)
- 对不可见粒子提前终止计算

&spm=1001.2101.3001.5002&articleId=154371439&d=1&t=3&u=d2a6308e46364248b006994f12c34175)

被折叠的 条评论
为什么被折叠?



