.. include:: definitions.rstinc .. _rigid-body-label: ========== Rigid Body ========== .. figure:: images/tutorials/rigid_bodies_and_shapes_tutorial_icon.jpg :width: 400 :alt: Video tutorial about Rigid Bodies and Shapes. :target: https://www.youtube.com/watch?v=s0LGSh_ASW4 The **RigidBodyComponent** infuses dynamics into an Actor. It signals that something is to be simulated with AGX Dynamics. A RigidBodyComponent has a set of properties, see description and screenshot below, and can be further configured by adding shapes components beneath it in the Component tree. .. figure:: images/components/components_rigidbody.jpg :alt: Properties of the RigidBodyComponent. :target: _images/components_rigidbody.jpg Properties of the RigidBodyComponent. .. csv-table:: :align: center :widths: 3, 1, 5, 1 :header: "Property", "Unit", "Description", "Default" "**Mass**", ":math:`kg`", "The mass of the rigid body.", "1.0" "**Inertia Tensor Diagonal**", ":math:`kg \cdot m^2`", "Inertia tensor of the rigid body.", "(1.0, 1.0, 1.0)" "**Velocity**", ":math:`cm/s`", "Initial linear velocity.", "(0.0, 0.0, 0.0)" "**Angular Velocity**", ":math:`degrees/s`", "Initial angular velocity.", "(0.0, 0.0, 0.0)" "**Motion Control**", "Static, Kinematic, Dynamic", "Whether the body should be static (never move, fixed in the world), kinematic (moved with a fixed velocity, not influenced by forces), or dynamic (fully simulated).", Dynamic "**Transform Root Component**", Boolean, "Whether updated transformations after each time step should be applied to the RigidBodyComponent or the owning actor's RootComponent.", False A single Actor may contain multiple instances of RigidBodyComponent. This means that the Actor contains multiple independent simulated objects. This is a mental model that is different from, but just as valid as, the mental model where the Actor *is* the simulated object. Consider a falling box and a vehicle. In the falling box case, the Actor contains a single RigidBodyComponent and the Actor and the RigidBodyComponent represents the same thing, a falling box. In this case the Actor's transformation should be updated from the simulation. In the vehicle case there is not a single RigidBodyComponent but a collection of them, but the entire vehicle is still a single Actor. The constituent bodies can have different velocities, for example wheels turning and doors opening, and we cannot apply all these new transformations to the actor at the end of a simulation step. Which of the two cases a particular RigidBodyComponent represents is selected with the **Transform Root Component** checkbox. If checked, then the RigidBodyComponent and the Actor represents the same thing and we're in a *falling box* kind of scenario. If **Transform Root Component** is unchecked then the RigidBodyComponent transformation is kept separate from the Actor's transformation and we're in the *vehicle* kind of scenario. There should be no more than a single RigidBodyComponent within an Actor that has the **Transform Root Component** property checked. A RigidBodyComponent has no shape of it's own, it has no volume. To give it one we add **ShapeComponents** to it. Any ShapeComponents that are in the RigidBodyComponent's attachment subtree make up the shape of the rigid body. ********************* Creating Rigid Bodies ********************* The **RigidBodyComponent** are created using the ``Add Component`` button in the Details panel. When moving things in the viewport, always ensure that the right component within the selected actor is being moved. A common mistake is to move a body or a shape when the intention was to move the entire Actor. Rigid Body with Primitive Shapes ================================ Let's create a wheel starting from an empty actor and adding a Rigid Body Component, a Cylinder Shape Component and a Box Shape Component. .. raw:: html Check that the ``DefaultSceneRoot`` has its Mobility set to Movable and that Motion Control on the Rigid Body Component is set to Dynamics. On the Rigid Body Component we enabled ``Transform Root Component``. |AGXUnreal| supports multiple Rigid Bodies per actor so normally the plugin only updates the Rigid Body Component's transform from the underlying AGX Dynamics simulation. With ``Transform Root Component`` checked the transformation synchronization is done on the actor's ``Root Component`` instead of on the Rigid Body Component. For the two shape components we use the properties in the AGX Shape category to specify the dimensions of each Shape and we use the Location attribute to position the Box on the surface of the Cylinder. ********************* Attached Rigid Bodies ********************* It is currently not supported to attach Rigid Body Components to each other within the Component hierarchy. Doing this causes Unreal Engine and |AGXUnreal| to fight each other for positioning of the attached Rigid Body since both want to be in control of the Component's location, which in turn leads to a mismatch between Unreal Engine's view and AGX Dynamics' view of the scene.