--- title: Defold 中的物理系统 brief: Defold 包含 2D 和 3D 的物理引擎。它们允许您模拟不同类型碰撞对象之间的牛顿物理交互。 --- # 物理 Defold 包含一个修改版的 [Box2D](http://www.box2d.org) 物理引擎(版本 2.2.1)用于 2D 物理模拟和 Bullet 物理引擎(版本 2.77)用于 3D 物理。它允许您模拟不同类型 _碰撞对象_ 之间的牛顿物理交互。本手册解释了其工作原理。 Defold 中使用的物理引擎的主要概念是: * **碰撞对象** - 碰撞对象是您用来赋予游戏对象物理行为的组件。碰撞对象具有重量、摩擦力和形状等物理属性。[了解如何创建碰撞对象](/manuals/physics-objects)。 * **碰撞形状** - 碰撞对象可以使用多个基本形状或单个复杂形状来定义其空间范围。[了解如何向碰撞对象添加形状](/manuals/physics-shapes)。 * **碰撞组** - 所有碰撞对象必须属于预定义的组,每个碰撞对象可以指定它可以与之碰撞的其他组列表。[了解如何使用碰撞组](/manuals/physics-groups)。 * **碰撞消息** - 当两个碰撞对象碰撞时,物理引擎会向组件所属的游戏对象发送消息。[了解有关碰撞消息的更多信息](/manuals/physics-messages) 除了碰撞对象本身,您还可以定义碰撞对象 **约束**,更常称为 **关节**,以连接两个碰撞对象并限制或以其他方式施加力并影响它们在物理模拟中的行为。[了解有关关节的更多信息](/manuals/physics-joints)。 您还可以探测并沿着称为 **射线投射** 的线性射线读取物理世界。[了解有关射线投射的更多信息](/manuals/physics-ray-casts)。 ## 物理引擎模拟使用的单位 物理引擎模拟牛顿物理,它被设计为与米、千克和秒(MKS)单位一起使用良好。此外,物理引擎被调整为适用于大小在 0.1 到 10 米范围内的移动物体(静态物体可以更大),默认情况下,引擎将 1 单位(像素)视为 1 米。这种像素和米之间的转换在模拟级别上很方便,但从游戏创建的角度来看,它并不是很有用。使用默认设置时,大小为 200 像素的碰撞形状将被视为具有 200 米的大小,这超出了推荐范围,至少对于移动物体来说是如此。 通常,需要缩放物理模拟以使其与游戏中对象的典型大小良好配合。物理模拟的比例可以在 *game.project* 中通过 [物理比例设置](/manuals/project-settings/#physics) 进行更改。将此值设置为例如 0.02 将意味着 200 像素将被视为 4 米。请注意,重力(也在 *game.project* 中更改)必须增加以适应比例的变化。 ## 物理更新 建议以固定间隔更新物理引擎以确保稳定的模拟(而不是以可能不规则的帧率相关间隔更新)。您可以通过检查 *game.project* 文件中物理部分的 [使用固定时间步长设置](/manuals/project-settings/#physics) 来对物理使用固定更新。更新频率由 *game.project* 文件中引擎部分的 [固定更新频率设置](/manuals/project-settings/#engine) 控制。当对物理使用固定时间步长时,还建议使用 `fixed_update(self, dt)` 生命周期函数与游戏中的碰撞对象进行交互,例如在向它们施加力时。 ## 注意事项和常见问题 集合代理 : 通过集合代理,可以将多个顶级集合或 *游戏世界* 加载到引擎中。这样做时,重要的是要知道每个顶级集合都是一个独立的物理世界。物理交互([碰撞、触发器](/manuals/physics-messages) 和 [射线投射](/manuals/physics-ray-casts))只发生在属于同一世界的对象之间。因此,即使来自两个世界的碰撞对象在视觉上恰好彼此重叠,它们之间也不会有任何物理交互。 未检测到碰撞 : 如果您在碰撞未被正确处理或检测方面遇到问题,请务必阅读 [调试手册中的物理调试部分](/manuals/debugging/#debugging-problems-with-physics)。