如何在 Godot 中制作一个会随着骨架变形的自定义对撞机

How to make a custom collider that will deform with a skeleton in Godot

我想为从搅拌机导入的网格制作碰撞检测器。网格是骨架的父级,我用它来使网格变形。我想给它附加一个对撞机以实现物理。我希望它不是将像立方体或球体这样的一般形状碰撞器附加到网格上,而是希望它是网格本身的精确副本。我已经尝试添加一个 Trimesh Static Body,它确实使对撞机的形状与网格相同,但是由于它是静态的,因此不会随骨架变形。有没有一种方法可以生成与网格形状相同的碰撞体,该碰撞体会随骨架变形并在网格移动时保持在网格周围?

您可以使用 BoneAttachement 节点(它是 Spatial 的子类别)使对撞机的形状与由骨架变形的骨架/网格相同class。通过使用此节点,您可以将原始形状碰撞器附加到骨架中的每个骨骼。这将导致由许多较小的碰撞体组成的最准确的碰撞体形状,这些碰撞体会变形并与骨架保持一致。


第 1 步:

在您的模型中添加一个 BoneAttachment 节点作为 Skeleton 节点的子节点。将骨骼名称 属性 设置为您希望碰撞形状遵循的任何骨骼。完成此操作后,此 BoneAttachment 节点的任何父节点都将复制它所设置的骨骼的变换。


第 2 步:

添加 KinematicBodyArea 节点作为 BoneAttachment 节点的子节点。不要添加 RigidBody,因为它们只能由物理控制,所以如果添加它就不起作用。

  • 如果你添加一个 KinematicBody 节点,你的对撞机将不会受到物理影响,但其他物体如 RigidBody 仍然会碰撞并从它反弹。

  • 如果你添加一个 Area 节点,你的对撞机不会直接影响任何与之接触的物理对象(对象会直接穿过它),但你可以写一个脚本,当对象接触它时会产生一些效果。例如,您可以这样设置,当物体进入该区域时,会对其施加力并将其推开。


第 3 步:

添加一个 CollisionShape 节点作为您在上一步中选择的任何 PhysicsBody 的子节点。选择形状并配置其变换,以便它复制您正在处理的网格部分的形状。然后,对骨架的每个骨骼重复这些步骤,直到你有一个形状准确的碰撞器。