harfang3d/doc/doc/man.Physics.md

3.5 KiB

.title Physics

Use physics to enable physically plausible interactions with your scene content.

Different backends are supported such as Bullets Physics, NVIDIA PhysX and Newton Dynamics.

[TOC]

Declaring Physics

To turn a node into a rigid body, create a [RigidBody] component and assign it to the node using [Node_SetRigidBody].

To fully declare a rigid body you must attach at least one collision shape to its node. Create a [Collision] component and call [Node_SetCollision] to do so. You can attach multiple collision components to a single node.

A rigid body can be of the following type:

  • RBT_Dynamic: Responds in a physically plausible manner to interaction with other rigid bodies. Its motion is fully controlled by the physics engine. A dynamic rigid body will automatically go to sleep and stop consuming simulation resources when it stops moving for a long enough period of time.
  • RBT_Kinematic: Follows the transformation of the node it belongs to. A kinematic body never goes to sleep automatically.

See [RigidBody_SetType].

The rigid body intertia tensor is computed from its collision shape properties. A zero mass rigid body is considered infinitely heavy and cannot be moved.

Simulating Physics

Create a physics backend such as [SceneNewtonPhysics] and call [SceneBullet3Physics_SceneCreatePhysicsFromAssets] to create the physics states corresponding to the scene declaration.

Note: [SceneBullet3Physics_SceneCreatePhysicsFromAssets] means that if setting up the physics states requires access to an external resource, such as a mesh, it should be loaded from the assets system. If you are working from the filesystem, use [SceneBullet3Physics_SceneCreatePhysicsFromFile].

Running the Simulation

This involves 3 steps on each update:

  1. Synchronize physics state with the scene declaration using [SceneBullet3Physics_SceneCreatePhysicsFromAssets]. Alternatively, you can use a more fine-grained approach using [SceneBullet3Physics_NodeCreatePhysicsFromAssets] to improve performance.
  2. Step the simulation using [SceneBullet3Physics_StepSimulation].
  3. Synchronize the updated physics transformations to the scene using [SceneBullet3Physics_SyncDynamicBodiesToScene].

Note: If you are using kinematic bodies you will also need to synchronize them from their node transformation on each update using [SceneBullet3Physics_SyncKinematicBodiesFromScene].

The Easy Way

While the low-level API offers the most flexibility most projects will use a straightforward implementation which is provided by the [SceneUpdateSystems] function. This function handles all of the above steps and does the same for other systems you may use.

When using a script system, this function will also dispatch collision events to it.

Keeping the System Synchronized

Call the physics system garbage collect method (eg. [SceneBullet3Physics_GarbageCollect]) on each update to ensure that destroyed nodes or components are properly removed. If you know that no node or component was destroyed during a particular update, not calling the garbage collector will save on performance.

Reading Physics Transformation

When a node is assigned a dynamic rigid body its transformation matrix is overriden by the physics system. Its transform component however, is not. Transform methods such as [Transform_SetPos] or [Transform_SetRot] will have no effect unless you explicitely synchronize the node to the physics system after using them.

[Transform_GetWorld] will return the transformation matrix as set by the physics system.