下面概述了在 MCG 中使用 节点构建刚体模拟的基本步骤。
创建世界
Bullet Physics 系统称为“世界”。需要在模拟过程中缓存和更新世界,并且世界应该包含参与模拟的所有刚体以及它们的约束和关系。
必须先创建世界本身,然后才能将刚体添加到世界。它需要一个初始时间,这通常是场景的开始时间。您还可以设置世界的重力。
添加动力学对象
动力学对象是变换由 Bullet Physics 引擎更新的刚体,而其他对象仅用作潜在碰撞对象。
- 对于动画控制器,您可以仅输出一个变换,这样便只有一个动力学对象。
- 在其他情况下,可以有多个动力学对象。例如,可以通过在一个体积内分布变换并使用这些变换来实例化网格的多个副本,创建一个几何体。在这种情况下,您可以使用 操作符与变换阵列来将多个具有相同动力学属性的刚体添加到世界。
将动力学对象添加到世界包括以下基本步骤:
- 设置刚体的动力学属性。
对于动力学对象,质量必须为非零的正数值。
- 使用动力学属性来创建刚体。
- 对于动力学对象,必须将 isKinematic 端口设置为 False。
- convexHull 是用于碰撞检测的网格。它应该无间隙,如果有凹度,则只使用它的凸面外壳。请注意,该网格无需与用于对象渲染图形的网格相同 — 例如,您可能要使用一个简化的网格以便更快地计算碰撞,或使用较小的网格以避免因密集的对象互相穿透而产生的爆炸力。
- 您也可以设置对象的初始速度并创建约束。
- 将动力学对象添加到世界。
稍后,您将需要使用动力学对象的索引从世界获取其变换值,因此请记录添加到世界的动力学对象的编号及其顺序。添加到世界中的第一个对象的索引为 0;第二个对象的索引为 1,依此类推。
添加碰撞对象
Bullet Physics 引擎使用碰撞对象来表示动力学对象的碰撞,但不会更新其变换。这些对象通常用于地板和墙壁等,但也可以设置动画。
添加碰撞对象与添加动力学对象类似,但更简单:
- isKinematic 必须为 true。这并不一定表示碰撞对象已设置动画,但如果已设置,您的图形将负责在使世界前进之前更新其变换。
- 质量将被忽略(始终为零)。
- 不会应用速度和约束。
同样,可以使用阵列来添加多个碰撞对象。
创建世界缓存
在添加完最后一个刚体后,可使用生成的函数来设置世界缓存的初始状态。
更新世界缓存
现在,您需要定义如何更新每个帧上的缓存。可能包含两个步骤:
- 如果碰撞对象已设置动画,则使用其新变换更新世界。
- 使世界在时间上前进。
更新碰撞对象变换
更新碰撞对象的变换包括从场景中的 INodes 获取其当前变换矩阵,然后按索引设置世界中相应刚体的变换。像上面一样,可以使用多个对象的阵列。
在时间上前进
根据场景的当前时间与上次模拟时间之间的差值使模拟前进。将生成的函数连接到 节点的 updateFunc 端口。
获取更新的变换
最后一步是通过索引从缓存的世界获取模拟的变换值,然后以某种方式使用它们。
- 对于控制器,输出单个变换。
- 对于几何体等,您可以实例化变换阵列上的网格的副本。