Skip to content

Advanced Features

Hiroyuki Akasaki edited this page Jun 23, 2025 · 2 revisions

Angle Limitation

You can specify the maximum angle by which a joint can rotate from its initial pose (including any Rotation Offset). Enable Angle Limit and set the desired angle (range: 0°–360°). The restriction forms a cone-shaped region.

angle_limit

Angle limitation takes precedence over collision. As a result, depending on the pose, joints may penetrate colliders.

penetrated_in_colliders

Visualizing the Angle Limit
To visualize the angle limit, place an implicitCone node and a transform node at the same location as the joint, and connect their attributes as shown below:
visualize_angle
⚠️ If the joint's ty or tz attributes have nonzero values, the cone direction may not align correctly.

Specify Target Pose

The rotation value connected to Rotation Offset is reflected as the initial (target) pose.
To have dynamics follow a target pose, duplicate the joint chain used for simulation (referred to here as the "target" chain) and connect the target's Rotate value to the Rotation Offset. When rotate the target chain, the dynamics will follow the target.

Note

  • The twist component is not directly simulated and is applied instantly.
  • If Elasticity is set to 0, there will be no force returning the joint to the target pose, so this feature will have no effect.

The target chain can be keyframed. For example, this allows "the simulation to start from pose A, transition through pose B, and settle at pose C".

rotation_offset_connections
rotation_offset

Canceling Transform

To prevent certain nodes (such as a character's root controller) from affecting the simulation, connect their worldMatrix to the Offset Matrix attribute.

At each simulation step, the difference in this matrix is applied before physics calculations, effectively canceling only inertial motion. Collisions and other effects remain active. The Offset Matrix Weight attribute controls the influence. Important: All joints in the chain must have the same Offset Matrix Weight value to avoid unnatural behavior.

$o = p \cdot PrevOffsetMatrix^{-1} \cdot OffsetMatrix$
$p = lerp(p, o, weight)$

offset_matrix_connections
offset_matrix

💡For example, if a character moves at high speed, dynamic objects may be pulled back strongly (lagging behind). By connecting the character root to the Offset Matrix, you can cancel out this high-speed movement.

Per-Section Scaling

By connecting the following three scale-related attributes, scaling can be supported for each section. If per-section scaling is not needed, these connections are not required.

  • Parent joint's Scale → Bone Scale
  • Parent joint's Inverse Scale → Bone Inverse Scale
  • Child joint's Scale → End Scale

Non-uniform scaling is not recommended, as it may produce unexpected results.
The end joint receives the inverse scale from its parent, and "Segment Scale Compensate" must be enabled. This is usually satisfied if the joint was created using standard procedures.

scale_connections
scale

Note
If the target pose is controlled using a duplicate joint, it is convenient to connect the scale from the duplicate joint as well.
scale_from_target

Even if these three scale attributes are not connected, the entire joint chain can still be scaled from a higher-level parent. However, non-uniform scaling is still not recommended in this case.

scale_parent

Branching

A single boneDynamicsNode is designed to handle "one section" of dynamics. By connecting multiple sections in sequence, branching structures can be supported without issue.

branching

However, if a joint has multiple children with different positions, it will have area (or volume) and will no longer be stick-shaped, making collision detection less reliable.

branching_skeleton
branching_skeleton_no_col

Sample Script: advanced_usage.py

advanced_usage.py is a script for connecting boneDynamicsNode to any joint chain. Execute the script step-by-step from the root to the tip of the joint chain.

  • Enables per-section scaling.
  • A collider created by expcol will be connected automatically if placed as a child of collider_grp.
  • The target pose can be manipulated by duplicating the joint chain for simulation and appending _target to its name.
  • If a node named offset exists, it will be connected to cancel the transform.
  • If a node named wind exists, it will be connected to the Additional Force input.

Clone this wiki locally