Skip to content

170. 实战:躲避汽车(总结)

Published:

做完这个比较综合的实战之后,我们再从头梳理一遍思路。

首先我们用 PlaneGeometry 加上颜色贴图实现的公路:

2025-06-03 08.23.26.gif

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

2025-06-03 08.43.05.gif

分成了 4 条车道,用定时器每秒在随机车道放上一辆车,中间两条车道速度快,两边车道速度慢。

渲染循环里遍历渲染出来,并且修改车的位置:

2025-06-03 16.53.07.gif

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

2025-06-03 17.40.29.gif

直接修改位置不够丝滑,我们用 gsap 做的补间动画,每 200ms 移动一次,期间做节流。

然后用包围盒 Box3 做的碰撞检测。

它的 intersectsBox 可以判断两个 Box3 是否相交。

2025-06-03 20.40.29.gif

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

image.png

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

2025-06-03 21.27.34.gif

然后用 three.quarks 实现了血液喷溅的粒子效果。

用 PointEmitter 加上重力和反弹实现的:

2025-06-03 23.15.41.gif

2025-06-03 23.16.28.gif

这里用 intersect 计算了相交的包围盒,然后用 getCenter 拿到包围盒的中间位置。

这样就能在碰撞位置流血了。

最后,我们用 three-spritetext 加上了一些文字。

包括左右箭头:

image.png

ready go

2025-06-04 08.38.33.gif

game over

2025-06-04 08.43.55.gif

如果自己绘制需要用 Sprite + canvas 来画,不如直接用封装好的 SpriteText。

之后我们又加了一个从远到近的入场相机动画:

2025-06-04 08.50.52.gif

这样,整个实战就完成了。

虽然场景不复杂,但是比较综合:

经过这个实战后,对这些技术点就有更深的理解了。

案例代码上传了小册仓库

评论