做完这个比较综合的实战之后,我们再从头梳理一遍思路。
首先我们用 PlaneGeometry 加上颜色贴图实现的公路:

然后从 sketchfab.com 找了车和人的模型:

分成了 4 条车道,用定时器每秒在随机车道放上一辆车,中间两条车道速度快,两边车道速度慢。
渲染循环里遍历渲染出来,并且修改车的位置:

我们换了一个有走路的骨骼动画的模型,按左右键的时候改变方向,并移动位置:

直接修改位置不够丝滑,我们用 gsap 做的补间动画,每 200ms 移动一次,期间做节流。
然后用包围盒 Box3 做的碰撞检测。
它的 intersectsBox 可以判断两个 Box3 是否相交。

但人物默认的包围盒有点大,我们用 expandByVector 做了裁剪,根据不同 rotation,裁剪不同方向上的包围盒。

我们加了一个 gameOver 状态,碰撞之后,不再产生汽车、不再移动汽车和人的位置,人走路的骨骼动画也暂停。

然后用 three.quarks 实现了血液喷溅的粒子效果。
用 PointEmitter 加上重力和反弹实现的:


这里用 intersect 计算了相交的包围盒,然后用 getCenter 拿到包围盒的中间位置。
这样就能在碰撞位置流血了。
最后,我们用 three-spritetext 加上了一些文字。
包括左右箭头:

ready go

game over

如果自己绘制需要用 Sprite + canvas 来画,不如直接用封装好的 SpriteText。
之后我们又加了一个从远到近的入场相机动画:

这样,整个实战就完成了。
虽然场景不复杂,但是比较综合:
- 包围盒 Box3:实现了碰撞检测、碰撞中心位置的计算
- 粒子动画库 three.quarks: 实现了流血的粒子效果
- 补间动画 gsap:实现了补间动画,并行、串行执行一系列动画,比如文字放大、相机移动、人物移动
- three-spritetext:绘制文字
- AnimationMixer:播放人物走路的骨骼动画
经过这个实战后,对这些技术点就有更深的理解了。
案例代码上传了小册仓库