using_jolt_physics.rst 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. .. _doc_using_jolt_physics:
  2. Using Jolt Physics
  3. ==================
  4. Introduction
  5. ------------
  6. The Jolt physics engine was added as an alternative to the existing Godot Physics
  7. physics engine in 4.4. Jolt is developed by Jorrit Rouwe with a focus on games and
  8. VR applications. Previously it was available as a extension but is now built into
  9. Godot.
  10. It is important to note that the built-in Jolt Physics module is considered
  11. **not finished**, **experimental**, and **lacks feature parity** with both
  12. Godot Physics and the Godot Jolt extension. Behavior may change as it is developed
  13. further. Please keep that in mind when choosing what to use for your project.
  14. The existing extension is now considered in maintenance mode. That means bug fixes
  15. will be merged, and it will be kept compatible with new versions of Godot until
  16. the built-in module has feature parity with the extension. The extension can be
  17. found `here on GitHub <https://github.com/godot-jolt/godot-jolt>`_ and in Godot's asset
  18. library.
  19. To change the 3D physics engine to be Jolt Physics, set
  20. :ref:`Project Settings > Physics > 3D > Physics Engine<class_ProjectSettings_property_physics/3D/Physics_Engine>`
  21. to ``Jolt Physics``. Once you've done that, click the **Save & Restart** button.
  22. When the editor opens again, 3D scenes should now be using Jolt for physics.
  23. Notable differences to Godot Physics
  24. ------------------------------------
  25. There are many differences between the existing Godot Physics engine and Jolt.
  26. Area3D and static bodies
  27. ~~~~~~~~~~~~~~~~~~~~~~~~
  28. When using Jolt, :ref:`class_Area3D` will not detect overlaps with :ref:`class_StaticBody3D`
  29. (nor a :ref:`class_RigidBody3D` frozen with ``FREEZE_MODE_STATIC``) by default, for
  30. performance reasons. If you have many/large :ref:`class_Area3D` overlapping with
  31. complex static geometry, such as :ref:`class_ConcavePolygonShape3D` or
  32. :ref:`class_HeightMapShape3D`, you can end up wasting a significant amount of CPU
  33. performance and memory without realizing it.
  34. For this reason this behavior is opt-in through the project setting
  35. :ref:`Physics > Jolt Physics 3D > Simulation > Areas Detect Static Bodies<class_ProjectSettings_property_physics/jolt_physics_3d/simulation/areas_detect_static_bodies>`,
  36. with the recommendation that you set up your collision layers and masks in such a
  37. way that only a few small :ref:`class_Area3D` are able to detect collisions with
  38. static bodies.
  39. Joint properties
  40. ~~~~~~~~~~~~~~~~
  41. The current interfaces for the 3D joint nodes don't quite line up with the interface
  42. of Jolt's own joints. As such, there are a number of joint properties that are not
  43. supported, mainly ones related to configuring the joint's soft limits.
  44. The unsupported properties are:
  45. - PinJoint3D: ``bias``, ``damping``, ``impulse_clamp``
  46. - HingeJoint3D: ``bias``, ``softness``, ``relaxation``
  47. - SliderJoint3D: ``angular_\*``, ``\*_limit/softness``, ``\*_limit/restitution``, ``\*_limit/damping``
  48. - ConeTwistJoint3D: ``bias``, ``relaxation``, ``softness``
  49. - Generic6DOFJoint3D: ``*_limit_*/softness``, ``*_limit_*/restitution``, ``*_limit_*/damping``, ``*_limit_*/erp``
  50. Currently a warning is emitted if you set these properties to anything but their
  51. default values.
  52. Single-body joints
  53. ~~~~~~~~~~~~~~~~~~
  54. You can, in Godot, omit one of the joint bodies for a two-body joint and effectively
  55. have "the world" be the other body. However, the node path that you assign your body
  56. to (:ref:`node_a<class_Joint3D_property_node_a>` vs :ref:`node_b<class_Joint3D_property_node_b>`)
  57. is ignored. Godot Physics will always behave as if you
  58. assigned it to ``node_a``, and since ``node_a`` is also what defines the frame of reference
  59. for the joint limits, you end up with inverted limits and a potentially strange
  60. limit shape, especially if your limits allow both linear and angular degrees of
  61. freedom.
  62. Jolt will behave as if you assigned the body to ``node_b`` instead, with ``node_a``
  63. representing "the world". There is a project setting called :ref:`Physics > Jolt Physics 3D > Joints > World Node<class_ProjectSettings_property_physics/jolt_physics_3d/joints/world_node>`
  64. that lets you toggle this behavior, if you need compatibility for an existing project.
  65. Collision margins
  66. ~~~~~~~~~~~~~~~~~
  67. Jolt (and other similar physics engines) uses something that Jolt refers to as
  68. "convex radius" to help improve the performance and behavior of the types of
  69. collision detection that Jolt relies on for convex shapes. Other physics engines
  70. (Godot included) might refer to these as "collision margins" instead. Godot exposes
  71. these as the ``margin`` property on every Shape3D-derived class, but Godot Physics
  72. itself does not use them for anything.
  73. What these collision margins sometimes do in other engines (as described in Godot's
  74. documentation) is effectively add a "shell" around the shape, slightly increasing
  75. its size while also rounding off any edges/corners. In Jolt however, these margins
  76. are first used to shrink the shape, and then the "shell" is applied, resulting in
  77. edges/corners being similarly rounded off, but without increasing the size of the
  78. shape.
  79. To prevent having to tweak this margin property manually, since its default value
  80. can be problematic for smaller shapes, the Jolt module exposes a project setting
  81. called :ref:`Physics > Jolt Physics 3D > Collisions > Collision Margin Fraction<class_ProjectSettings_property_physics/jolt_physics_3d/collisions/collision_margin_fraction>`
  82. which is multiplied with the smallest axis of the shape's AABB to calculate the
  83. actual margin. The margin property of the shape is then instead used as an upper
  84. bound.
  85. These margins should, for most use-cases, be more or less transparent, but can
  86. sometimes result in odd collision normals when performing shape queries. You can
  87. lower the above mentioned project setting to mitigate some of this, including
  88. setting it to ``0.0``, but too small of a margin can also cause odd collision results,
  89. so is generally not recommended.
  90. Baumgarte stabilization
  91. ~~~~~~~~~~~~~~~~~~~~~~~
  92. Baumgarte stabilization is a method to resolve penetrating bodies and push them to a
  93. state where they are just touching. In Godot Physics this works like a spring. This
  94. means that bodies can accelerate and may cause the bodies to overshoot and separate
  95. completely. With Jolt, the stabilization is only applied to the position and not to
  96. the velocity of the body. This means it cannot overshoot but it may take longer to
  97. resolve the penetration.
  98. The strength of this stabilization can be tweaked using the project setting
  99. :ref:`Physics > Jolt Physics 3D > Simulation > Baumgarte Stabilization Factor<class_ProjectSettings_property_physics/jolt_physics_3d/simulation/baumgarte_stabilization_factor>`.
  100. Setting this project setting to ``0.0`` will turn Baumgarte stabilization off.
  101. Setting it to ``1.0`` will resolve penetration in 1 simulation step. This is fast
  102. but often also unstable.
  103. Ghost collisions
  104. ~~~~~~~~~~~~~~~~
  105. Jolt employs two techniques to mitigate ghost collisions, meaning collisions with
  106. internal edges of shapes/bodies that result in collision normals that oppose the
  107. direction of movement.
  108. The first technique, called "active edge detection", marks edges of triangles in
  109. :ref:`class_ConcavePolygonShape3D` or :ref:`class_HeightMapShape3D` as either "active" or "inactive", based on
  110. the angle to the neighboring triangle. When a collision happens with an inactive
  111. edge the collision normal will be replaced with the triangle's normal instead, to
  112. lessen the effect of ghost collisions.
  113. The angle threshold for this active edge detection is configurable through the
  114. project setting :ref:`Physics >Jolt Physics 3D > Collisions > Active Edge Threshold<class_ProjectSettings_property_physics/jolt_physics_3d/collisions/active_edge_threshold>`.
  115. The second technique, called "enhanced internal edge removal", instead adds runtime
  116. checks to detect whether an edge is active or inactive, based on the contact points
  117. of the two bodies. This has the benefit of applying not only to collisions with
  118. :ref:`class_ConcavePolygonShape3D` and :ref:`class_HeightMapShape3D`, but also edges between any shapes within
  119. the same body.
  120. Enhanced internal edge removal can be toggled on and off for the various contexts to
  121. which it's applied, using the :ref:`Physics >Jolt Physics 3D > Simulation > Use Enhanced Internal Edge Removal<class_ProjectSettings_property_physics/jolt_physics_3d/simulation/use_enhanced_internal_edge_removal>`,
  122. project setting, and the similar settings for :ref:`queries<class_ProjectSettings_property_physics/jolt_physics_3d/queries/use_enhanced_internal_edge_removal>`
  123. and :ref:`motion queries<class_ProjectSettings_property_physics/jolt_physics_3d/motion_queries/use_enhanced_internal_edge_removal>`.
  124. Note that neither the active edge detection nor enhanced internal edge removal apply
  125. when dealing with ghost collisions between two different bodies.
  126. Memory usage
  127. ~~~~~~~~~~~~
  128. Jolt uses a stack allocator for temporary allocations within its simulation step.
  129. This stack allocator requires allocating a set amount of memory up front, which can
  130. be configured using the :ref:`Physics > Jolt Physics 3D > Limits > Temporary Memory Buffer Size<class_ProjectSettings_property_physics/jolt_physics_3d/limits/temporary_memory_buffer_size>`
  131. project setting.
  132. Ray-cast face index
  133. ~~~~~~~~~~~~~~~~~~~
  134. The ``face_index`` property returned in the results of :ref:`intersect_ray()<class_PhysicsDirectSpaceState3D_method_intersect_ray>`
  135. and RayCast3D will by default always be ``-1`` with Jolt. The project setting :ref:`Physics > Jolt Physics 3D > Queries > Enable Ray Cast Face Index<class_ProjectSettings_property_physics/jolt_physics_3d/queries/enable_ray_cast_face_index>`
  136. will enable them.
  137. Note that enabling this setting will increase the memory requirement of :ref:`class_ConcavePolygonShape3D`
  138. with about 25%.
  139. Kinematic RigidBody3D contacts
  140. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  141. When using Jolt, a :ref:`class_RigidBody3D` frozen with :ref:`FREEZE_MODE_KINEMATIC<class_RigidBody3D_constant_FREEZE_MODE_KINEMATIC>`
  142. will by default not report contacts from collisions with other static/kinematic
  143. bodies, for performance reasons, even when setting a non-zero :ref:`max_contacts_reported<class_RigidBody3D_property_max_contacts_reported>`.
  144. If you have many/large kinematic bodies overlapping with complex static geometry,
  145. such as :ref:`class_ConcavePolygonShape3D` or :ref:`class_HeightMapShape3D`, you can
  146. end up wasting a significant amount of CPU performance and memory without realizing
  147. it.
  148. For this reason this behavior is opt-in through the project setting
  149. :ref:`Physics > Jolt Physics 3D > Simulation > Generate All Kinematic Contacts<class_ProjectSettings_property_physics/jolt_physics_3d/simulation/generate_all_kinematic_contacts>`.
  150. Contact impulses
  151. ~~~~~~~~~~~~~~~~
  152. Due to limitations internal to Jolt, the contact impulses provided by :ref:`PhysicsDirectBodyState3D.get_contact_impulse()<class_physicsdirectbodystate3d_method_get_contact_impulse>`
  153. are estimated ahead of time based on things like the contact manifold and velocities
  154. of the colliding bodies. This means that the reported impulses will only be accurate
  155. in cases where the two bodies in question are not colliding with any other bodies.
  156. Area3D and SoftBody3D
  157. ~~~~~~~~~~~~~~~~~~~~~
  158. Jolt does not currently support any interactions between :ref:`class_SoftBody3D`
  159. and :ref:`class_Area3D`, such as overlap events, or the wind properties found on
  160. :ref:`class_Area3D`.
  161. WorldBoundaryShape3D
  162. ~~~~~~~~~~~~~~~~~~~~
  163. :ref:`class_WorldBoundaryShape3D`, which is meant to represent an infinite plane, is
  164. implemented a bit differently in Jolt compared to Godot Physics. Both engines have
  165. an upper limit for how big the effective size of this plane can be, but this size is
  166. much smaller when using Jolt, in order to avoid precision issues.
  167. You can configure this size using the :ref:`Physics > Jolt Physics 3D > Limits > World Boundary Shape Size<class_ProjectSettings_Property_physics/jolt_physics_3d/limits/world_boundary_shape_size>`
  168. project setting.
  169. Notable differences to the Godot Jolt extension
  170. -----------------------------------------------
  171. While the built-in Jolt module is largely a straight port of the Godot Jolt
  172. extension, there are a few things that are different.
  173. Project settings
  174. ~~~~~~~~~~~~~~~~
  175. All project settings have been moved from the ``physics/jolt_3d`` category to
  176. ``physics/jolt_physics_3d``.
  177. On top of that, there's been some renaming and refactoring of the individual project
  178. settings as well. These include:
  179. - ``sleep/enabled`` is now ``simulation/allow_sleep.``
  180. - ``sleep/velocity_threshold`` is now ``simulation/sleep_velocity_threshold.``
  181. - ``sleep/time_threshold`` is now ``simulation/sleep_time_threshold.``
  182. - ``collisions/use_shape_margins`` is now ``collisions/collision_margin_fraction``,
  183. where a value of 0 is equivalent to disabling it.
  184. - ``collisions/use_enhanced_internal_edge_removal`` is now ``simulation/use_enhanced_internal_edge_removal.``
  185. - ``collisions/areas_detect_static_bodies`` is now ``simulation/areas_detect_static_bodies.``
  186. - ``collisions/report_all_kinematic_contacts`` is now ``simulation/generate_all_kinematic_contacts.``
  187. - ``collisions/soft_body_point_margin`` is now ``simulation/soft_body_point_radius.``
  188. - ``collisions/body_pair_cache_enabled is now simulation/body_pair_contact_cache_enabled.``
  189. - ``collisions/body_pair_cache_distance_threshold`` is ``now simulation/body_pair_contact_cache_distance_threshold.``
  190. - ``collisions/body_pair_cache_angle_threshold is now simulation/body_pair_contact_cache_angle_threshold.``
  191. - ``continuous_cd/movement_threshold`` is now ``simulation/continuous_cd_movement_threshold``,
  192. but expressed as a fraction instead of a percentage.
  193. - ``continuous_cd/max_penetration`` is now ``simulation/continuous_cd_max_penetration``,
  194. but expressed as a fraction instead of a percentage.
  195. - ``kinematics/use_enhanced_internal_edge_removal`` is now ``motion_queries/use_enhanced_internal_edge_removal.``
  196. - ``kinematics/recovery_iterations`` is now ``motion_queries/recovery_iterations``,
  197. but expressed as a fraction instead of a percentage.
  198. - ``kinematics/recovery_amount`` is now ``motion_queries/recovery_amount.``
  199. - ``queries/use_legacy_ray_casting`` has been removed.
  200. - ``solver/position_iterations`` is now ``simulation/position_steps.``
  201. - ``solver/velocity_iterations`` is now ``simulation/velocity_steps.``
  202. - ``solver/position_correction`` is now ``simulation/baumgarte_stabilization_factor``,
  203. but expressed as a fraction instead of a percentage.
  204. - ``solver/active_edge_threshold`` is now ``collisions/active_edge_threshold.``
  205. - ``solver/bounce_velocity_threshold`` is now ``simulation/bounce_velocity_threshold.``
  206. - ``solver/contact_speculative_distance`` is now ``simulation/speculative_contact_distance.``
  207. - ``solver/contact_allowed_penetration`` is now ``simulation/penetration_slop.``
  208. - ``limits/max_angular_velocity`` is now stored as radians instead.
  209. - ``limits/max_temporary_memory`` is now ``limits/temporary_memory_buffer_size.``
  210. Joint nodes
  211. ~~~~~~~~~~~
  212. The joint nodes that are exposed in the Godot Jolt extension (JoltPinJoint3D,
  213. JoltHingeJoint3D, JoltSliderJoint3D, JoltConeTwistJoint3D, and JoltGeneric6DOFJoint)
  214. have not been included in the Jolt module.
  215. Thread safety
  216. ~~~~~~~~~~~~~
  217. Unlike the Godot Jolt extension, the Jolt module does have thread-safety,
  218. including support for the :ref:`Physics > 3D > Run On Separate Thread<class_ProjectSettings_Property_physics/3d/run_on_separate_thread>`
  219. project setting. However this has not been tested very thoroughly, so it should be
  220. considered experimental.