你好!我是Gemini 3.0。
这是一个使用 **HTML5 Canvas** 和 **原生JavaScript** 实现的单文件3D汽车爆炸动画。我编写了一个轻量级的3D粒子引擎,不依赖任何外部库(如Three.js),以确保代码简洁且完全符合你的要求。
### 核心功能特点:
1. **真3D投影**:使用透视投影算法将3D坐标映射到2D Canvas上。
2. **体素化汽车模型**:通过代码构建了一个由数百个“体素”(立方体粒子)组成的汽车,包含车身、车窗和轮子。
3. **物理爆炸效果**:爆炸时,粒子会根据中心点向外飞溅,包含重力、摩擦力和地面碰撞反弹效果。
4. **交互控制**:包含重播按钮和自动旋转展示。
你可以直接将以下代码保存为 `.html` 文件并在浏览器中打开。
```html
3D Car Explosion Animation - Gemini 3.0
```
### 代码说明与实现细节:
1. **Canvas 3D 引擎**:
* 代码中 `Particle` 类的 `draw` 方法实现了一个微型的3D引擎。
* 它使用基本的三角函数 (`Math.cos`, `Math.sin`) 处理 Y 轴旋转。
* 使用透视投影公式 `scale = focalLength / (focalLength + z)` 将 3D 坐标 $(x,y,z)$ 转换为 2D 屏幕坐标。
* **深度排序**:为了让3D效果真实,在每一帧绘制前,我使用了 `particles.sort` 根据 Z 轴深度(离摄像机的距离)对粒子进行排序(画家算法),确保远处的方块被近处的方块遮挡。
2. **汽车建模 (`buildCar` 函数)**:
* 我没有加载外部模型文件,而是通过代码“堆积木”。
* 通过三层循环生成体素(Voxel):底盘是红色的长方体,驾驶舱是蓝色的玻璃和红色的顶,轮子是黑色的块。
* 这样汽车看起来像是一个像素风(Minecraft风格)的3D模型。
3. **物理爆炸 (`explodeCar` 与 `update` 方法)**:
* **速度向量**:当点击引爆时,给每个粒子赋予一个随机的 $(vx, vy, vz)$ 速度向量。为了效果更好,我让 $y$ 轴倾向于负值(向上飞溅)。
* **重力与阻力**:每一帧都会给 $vy$ 加上 `gravity`,并给所有速度乘以 `drag`(模拟空气阻力),使碎片最终慢下来。
* **地面碰撞**:检测 `y > CONFIG.floorY`,如果碰到地面,速度反转并衰减(模拟反弹)。
4. **复位动画**:
* 当点击“重置”时,并没有瞬间把粒子变回去,而是利用简单的线性插值(Lerp)算法:`current += (target - current) * 0.1`。这让碎片像时间倒流一样“吸”回原来的位置,视觉效果很酷。
你可以直接运行这段代码,点击红色的按钮查看效果。