在 Cannon.js 中创建一种 "floor mat" 类型的对象,踩踏时会做出反应

Creating a "floor mat" type of object in Cannon.js that reacts when stepped on

我刚刚开始研究 Cannon.js 并且想知道如何实现这一点。

我的用例是我在地板上有一个圆形区域,如果玩家走进去,他们会触发一些互动。我不想为此进行光线投射,因为我已经在使用 Cannon.js 处理其他碰撞,并且觉得光线投射会增加另一层性能延迟。

现在我的播放器对象是一个简单的球形 RigidBody,我通过设置它的速度来移动它。我把交互区域做成一个高度很低的圆柱形。然而,当玩家越过这个物体时,碰撞被成功注册,但玩家旋转失控并且运动中有明显的颠簸。

是否有一种标准方法可以为 Cannon.js 注册这些类型的对象?我希望它没有碰撞,几乎就像玩家可以穿过的隐形物体一样,但它仍然会记录碰撞。

在游戏中解决此问题的典型方法是使用触发器。所以物理引擎与本主题无关。

触发器可以实现为一个简单的包围体,如包围球体。在three.js中是THREE.Sphere. Each simulation step, you test if the trigger was activated by the player. You can do this in various ways. For example by just testing if the player's position is inside the bounding sphere via Sphere.containsPoint(). Or you represent the player as another bounding volume like a bounding sphere or AABB (via THREE.Box3)的一个实例,然后进行交集测试。

这两种方法都非常快,不会明显影响应用的性能。即使您正在对更多可能激活触发器的游戏实体进行这些测试。

这里有一个简单的例子来演示 Yuka 中触发器的概念:

https://mugen87.github.io/yuka/examples/entity/trigger/