Orillusion / orillusion

Orillusion is a pure Web3D rendering engine which is fully developed based on the WebGPU standard.
https://www.orillusion.com
MIT License
4.7k stars 614 forks source link

feat(physics): Refactor physics plugin with extensive enhancements and new features #440

Closed ID-Emmett closed 4 weeks ago

ID-Emmett commented 1 month ago

概要

此PR重构了Orillusion的物理插件,加入了大量新功能,以提供更强大和全面的物理系统。

主要更改

  1. 刚体组件:

    • 添加了许多新的属性和方法,以扩展功能。
    • 支持图形对象直接控制刚体变换。详见 issue #328
    • 支持碰撞事件。
  2. 软体组件:

    • 实现了布料模拟,并提供了多种自定义选项。
  3. 约束组件:

    • 增加了当前版本中所有Ammo.js约束(包括所有重载)的支持,包括但不限于 btGeneric6DofSpringConstraint, btConeTwistConstraintbtHingeConstraint
  4. 调试物理渲染:

    • 引入了一个新功能,用于实时可视化物理实体和约束,有助于调试和开发。
  5. 工具类:

    • 提供了一组用于常见物理操作和计算的工具类。
  6. 碰撞事件:

    • 利用 ContactProcessedCallback 监听碰撞事件。只需为刚体注册碰撞回调,即可在碰撞时触发。且对全局碰撞事件进行了高效过滤优化。
  7. 碰撞形状:

    • 封装了十余种碰撞形状,包括复杂形状如高度场、凸包和三角网格等。
    • 形状配置简化,大部分情况下只需提供 3D 对象即可构建匹配的碰撞体。
  8. 碰撞组件:

    • 刚体不再依赖原先的 ColliderComponent,但已作兼容。
  9. 物理系统更新函数:

    • 修改 update 函数中 stepSimulation 的 timeStep 参数,默认值改为 Time.delta / 1000,以秒为单位传递时间步长。此更改避免了物理模拟速度依赖帧率,确保了更一致的物理行为。此更改直接影响到所有先前使用本插件的项目。
  10. 示例:

    • 更新了现有示例并新增了多个示例,以展示物理插件的新功能。

影响

这些更改较为广泛,可能会影响使用先前版本物理插件的现有项目。建议在项目中进行全面测试,并根据需要调整配置。

测试

所有新功能和修改均已测试,但可能并不全面。

向后兼容性

尽管已经尽力保持向后兼容性,但某些更改可能需要在现有项目中进行调整。

lslzl3000 commented 1 month ago

Awesome! We will do some tests later.

lslzl3000 commented 1 month ago

能帮忙总结一下哪些 BREAKINGCHANGES 吗? 比如 物理系统更新函数 算是直接影响旧版本用法的改变,除此之外,还有哪些API的变化?

lslzl3000 commented 1 month ago

_initedFunctions 的用法弃用了,统一用 _initializationPromise 来处理初始化 callback https://github.com/Orillusion/orillusion/pull/440/commits/49b371cad9ee339040bd87f766d16045f7eb3dd9

ID-Emmett commented 1 month ago

能帮忙总结一下哪些 BREAKINGCHANGES 吗? 比如 物理系统更新函数 算是直接影响旧版本用法的改变,除此之外,还有哪些API的变化?

除了 Physics.update() 函数的变更外,还有两处更改:

  1. Rigidbody.update() :出于性能考虑,现在仅对激活状态的刚体进行变换同步,如果刚体为非激活状态且未开启新增的 enablePhysicsTransformSync 功能(默认关闭),那么修改3D对象的位置、旋转、缩放后,将不会更新物理刚体,导致图形与物理变换不同步。在旧版本中对于添加 Rigidbody Component 的对象是无法手动修改其位置和旋转的。

  2. Rigidbody.btRigidbodyInitedbtRigidbodyInited 属性已更名为 btBodyInited

关于 Physics.update() 的调整,这对物理模拟有较大影响。为确保准确性,timeStep 已正确调整为秒单位(Time.delta / 1000)。这一更改确保了物理模拟的速率不会因帧率变化而改变,但也可能导致物理模拟的更新频率降低,尤其在大尺度物体的情况下,物体每帧的位移可能变小,从而导致视觉上看起来速度变慢。

建议提供相关说明和指导,帮助开发者在模拟中考虑物体尺寸对视觉效果的影响。可以通过调整物体的尺寸、初速度、力或加速度,或调整摄像机视角来优化运动表现。