一个物理接合是一组以逻辑树的形式组织而成的接合体,其中每个父子关系都反映了相互约束的相对运动。
物理接合的主要目的是为涉及关节的非游戏工业应用提供逼真的物理行为。相比常规关节,物理接合在模拟机械臂和运动链等方面要便捷很多。
在用一个关节连接两个物理体的最基本场景中,您可以构建一个接合或使用常规关节,如下表所述。
接合设置 | 使用常规关节设置 | |
---|---|---|
层级视图 | • 游戏对象 + 接合体 • 游戏对象 + 接合体 |
• 游戏对象 + 刚体 • 游戏对象 + 刚体 + 关节 |
关系 | 游戏对象具有层级关系(父子)。 注意:物理引擎使用 Unity 变换层级视图来表达父子关系。 |
游戏对象不一定具有层级关系。 注意:在更高级的场景中,您可以自由模拟运动环路。 |
物理体 | 两个游戏对象都有一个接合体组件,它定义了物理体属性(等等)。 | 两个游戏对象都有一个刚体组件,它定义了物理体属性(等等)。 |
Joint | 子游戏对象的接合体包含关节属性,您可以在其中选择关节类型。 | 其中一个游戏对象也有一个关节组件。关节属性取决于您添加的关节组件的类型。 |
但是,两种情况下的总体结果行为并不相同,尤其是如果您将此原则扩展到多个物理体和关节。
如果您尝试使用常规关节对运动链进行建模,例如在布娃娃、机械臂或具有多个并行铰链的机构中,物理引擎可能会遇到无法求解的情况并遗留一些无法满足的约束。这可能会导致卡顿和不切实际的运动。这些关节不仅看起来很怪异,而且也不可能将它们用于模拟真实设备,从而阻碍对工业设计进行建模或原型构建。
要在 Unity 中构建物理接合,您必须向构成接合的每个游戏对象添加一个接合体组件。每个接合体组件的配置都可以集中在一个位置进行:
对应的游戏对象的物理体属性。基本上,它的质量及其对物理环境的响应方式。
将游戏对象链接到其父游戏对象的关节的类型和属性(接合的根除外)。
下面的例子显示了一个简单的物理接合,涉及 3 个物理体和 2 个关节:
要在 Unity 中构建这样的接合:
创建 3 个游戏对象的线性层级结构。
分别为这 3 个游戏对象添加一个接合体组件。
配置每个接合体组件(根据上图):
GameObject | 接合体组件配置 |
---|---|
A(根) | 您只能为游戏对象 A 定义物理体属性。 |
B | 您可以定义: • 游戏对象 B 的物理体属性。 • 与游戏对象 A 连接的关节的类型和属性。 |
C | 您可以定义: • 游戏对象 C 的物理体属性。 • 与游戏对象 B 连接的关节的类型和属性。 |
注意:根据定义,一个接合只能有一个根,并且不允许有运动环路。如果您需要运动环路,请使用常规关节。
局限性:如果您想构建非常长的接合链,仍需注意 Unity 支持的最大层级深度为 64 个游戏对象。
通过接合体,您可以选择和配置四种类型的接合关节:
固定关节:在物理体之间设置刚性、牢不可破和不可拉伸的链接。
棱形关节:阻止除了沿特定轴滑动之外的所有运动。
旋转关节:允许绕特定轴旋转(如铰链)。
球形关节:解剖学关节,允许两个摆动和一个扭转。
接合中所有锁定的自由度在设计上都是牢不可破和不可拉伸的。为了实现这一点,物理引擎使用降维坐标空间,物理体只有关于未锁定运动轴的坐标。
相比之下,对于常规迭代关节,物理引擎采用最大坐标空间,只有当求解器能够在一组迭代后收敛,才能保证满足约束。
查看 Unity 的机器人演示项目试验带有接合关节的串联机械臂。