feat(physics): Refactor physics plugin with extensive enhancements and new features
概要
此PR重构了Orillusion的物理插件,加入了大量新功能,以提供更强大和全面的物理系统。
主要更改
-
刚体组件:
- 添加了许多新的属性和方法,以扩展功能。
- 支持图形对象直接控制刚体变换。详见 issue #328。
- 支持碰撞事件。
-
软体组件:
- 实现了布料模拟,并提供了多种自定义选项。
-
约束组件:
- 增加了当前版本中所有Ammo.js约束(包括所有重载)的支持,包括但不限于
btGeneric6DofSpringConstraint,btConeTwistConstraint和btHingeConstraint。
- 增加了当前版本中所有Ammo.js约束(包括所有重载)的支持,包括但不限于
-
调试物理渲染:
- 引入了一个新功能,用于实时可视化物理实体和约束,有助于调试和开发。
-
工具类:
- 提供了一组用于常见物理操作和计算的工具类。
-
碰撞事件:
- 利用
ContactProcessedCallback监听碰撞事件。只需为刚体注册碰撞回调,即可在碰撞时触发。且对全局碰撞事件进行了高效过滤优化。
- 利用
-
碰撞形状:
- 封装了十余种碰撞形状,包括复杂形状如高度场、凸包和三角网格等。
- 形状配置简化,大部分情况下只需提供 3D 对象即可构建匹配的碰撞体。
-
碰撞组件:
- 刚体不再依赖原先的
ColliderComponent,但已作兼容。
- 刚体不再依赖原先的
-
物理系统更新函数:
- 修改 update 函数中 stepSimulation 的 timeStep 参数,默认值改为 Time.delta / 1000,以秒为单位传递时间步长。此更改避免了物理模拟速度依赖帧率,确保了更一致的物理行为。此更改直接影响到所有先前使用本插件的项目。
-
示例:
- 更新了现有示例并新增了多个示例,以展示物理插件的新功能。
影响
这些更改较为广泛,可能会影响使用先前版本物理插件的现有项目。建议在项目中进行全面测试,并根据需要调整配置。
测试
所有新功能和修改均已测试,但可能并不全面。
向后兼容性
尽管已经尽力保持向后兼容性,但某些更改可能需要在现有项目中进行调整。
Awesome! We will do some tests later.
能帮忙总结一下哪些 BREAKINGCHANGES 吗?
比如 物理系统更新函数 算是直接影响旧版本用法的改变,除此之外,还有哪些API的变化?
把 _initedFunctions 的用法弃用了,统一用 _initializationPromise 来处理初始化 callback https://github.com/Orillusion/orillusion/pull/440/commits/49b371cad9ee339040bd87f766d16045f7eb3dd9
能帮忙总结一下哪些
BREAKINGCHANGES吗? 比如物理系统更新函数算是直接影响旧版本用法的改变,除此之外,还有哪些API的变化?
除了 Physics.update() 函数的变更外,还有两处更改:
-
Rigidbody.update():出于性能考虑,现在仅对激活状态的刚体进行变换同步,如果刚体为非激活状态且未开启新增的enablePhysicsTransformSync功能(默认关闭),那么修改3D对象的位置、旋转、缩放后,将不会更新物理刚体,导致图形与物理变换不同步。在旧版本中对于添加Rigidbody Component的对象是无法手动修改其位置和旋转的。 -
Rigidbody.btRigidbodyInited:btRigidbodyInited属性已更名为btBodyInited。
关于 Physics.update() 的调整,这对物理模拟有较大影响。为确保准确性,timeStep 已正确调整为秒单位(Time.delta / 1000)。这一更改确保了物理模拟的速率不会因帧率变化而改变,但也可能导致物理模拟的更新频率降低,尤其在大尺度物体的情况下,物体每帧的位移可能变小,从而导致视觉上看起来速度变慢。
建议提供相关说明和指导,帮助开发者在模拟中考虑物体尺寸对视觉效果的影响。可以通过调整物体的尺寸、初速度、力或加速度,或调整摄像机视角来优化运动表现。