Class reference
SpringBoneSimulator3D
Inherits SkeletonModifier3D
A SkeletonModifier3D to apply inertial wavering to bone chains.
Description
This SkeletonModifier3D can be used to wiggle hair, cloth, and tails. This modifier behaves differently from PhysicalBoneSimulator3D as it attempts to return the original pose after modification. If you setup set_root_bone() and set_end_bone(), it is treated as one bone chain. Note that it does not support a branched chain like Y-shaped chains. When a bone chain is created, an array is generated from the bones that exist in between and listed in the joint list. Several properties can be applied to each joint, such as set_joint_stiffness(), set_joint_drag(), and set_joint_gravity(). For simplicity, you can set values to all joints at the same time by using a Curve. If you want to specify detailed values individually, set set_individual_config() to true. For physical simulation, SpringBoneSimulator3D can have children as self-standing collisions that are not related to PhysicsServer3D, see also SpringBoneCollision3D. Warning: A scaled SpringBoneSimulator3D will likely not behave as expected. Make sure that the parent Skeleton3D and its bones are not scaled.
Properties
Vector3 external_force = Vector3(0, 0, 0)
Vector3 external_force = Vector3(0, 0, 0)The constant force that always affected bones. It is equal to the result when the parent Skeleton3D moves at this speed in the opposite direction. This is useful for effects such as wind and anti-gravity.
bool mutable_bone_axes = true
bool mutable_bone_axes = trueIf true, the solver retrieves the bone axis from the bone pose every frame. If false, the solver retrieves the bone axis from the bone rest and caches it, which increases performance slightly, but position changes in the bone pose made before processing this SpringBoneSimulator3D are ignored.
int setting_count = 0
int setting_count = 0The number of settings.
Methods
bool are_all_child_collisions_enabled(int index) const
bool are_all_child_collisions_enabled(int index) constReturns true if all child SpringBoneCollision3Ds are contained in the collision list at index in the settings.
void clear_collisions(int index)
int index)Clears all collisions from the collision list at index in the settings when are_all_child_collisions_enabled() is false.
void clear_exclude_collisions(int index)
int index)Clears all exclude collisions from the collision list at index in the settings when are_all_child_collisions_enabled() is true.
void clear_settings()
Clears all settings.
int get_center_bone(int index) const
int get_center_bone(int index) constReturns the center bone index of the bone chain.
String get_center_bone_name(int index) const
String get_center_bone_name(int index) constReturns the center bone name of the bone chain.
int get_center_from(int index) const
int get_center_from(int index) constReturns what the center originates from in the bone chain.
NodePath get_center_node(int index) const
NodePath get_center_node(int index) constReturns the center node path of the bone chain.
int get_collision_count(int index) const
int get_collision_count(int index) constReturns the collision count of the bone chain's collision list when are_all_child_collisions_enabled() is false.
NodePath get_collision_path(int index, int collision) const
NodePath get_collision_path(int index, int collision) constReturns the node path of the SpringBoneCollision3D at collision in the bone chain's collision list when are_all_child_collisions_enabled() is false.
float get_drag(int index) const
float get_drag(int index) constReturns the drag force damping curve of the bone chain.
Curve get_drag_damping_curve(int index) const
Curve get_drag_damping_curve(int index) constReturns the drag force damping curve of the bone chain.
int get_end_bone(int index) const
int get_end_bone(int index) constReturns the end bone index of the bone chain.
int get_end_bone_direction(int index) const
int get_end_bone_direction(int index) constReturns the tail direction of the end bone of the bone chain when is_end_bone_extended() is true.
float get_end_bone_length(int index) const
float get_end_bone_length(int index) constReturns the end bone tail length of the bone chain when is_end_bone_extended() is true.
String get_end_bone_name(int index) const
String get_end_bone_name(int index) constReturns the end bone name of the bone chain.
int get_exclude_collision_count(int index) const
int get_exclude_collision_count(int index) constReturns the exclude collision count of the bone chain's exclude collision list when are_all_child_collisions_enabled() is true.
NodePath get_exclude_collision_path(int index, int collision) const
NodePath get_exclude_collision_path(int index, int collision) constReturns the node path of the SpringBoneCollision3D at collision in the bone chain's exclude collision list when are_all_child_collisions_enabled() is true.
float get_gravity(int index) const
float get_gravity(int index) constReturns the gravity amount of the bone chain.
Curve get_gravity_damping_curve(int index) const
Curve get_gravity_damping_curve(int index) constReturns the gravity amount damping curve of the bone chain.
Vector3 get_gravity_direction(int index) const
Vector3 get_gravity_direction(int index) constReturns the gravity direction of the bone chain.
int get_joint_bone(int index, int joint) const
int get_joint_bone(int index, int joint) constReturns the bone index at joint in the bone chain's joint list.
String get_joint_bone_name(int index, int joint) const
String get_joint_bone_name(int index, int joint) constReturns the bone name at joint in the bone chain's joint list.
int get_joint_count(int index) const
int get_joint_count(int index) constReturns the joint count of the bone chain's joint list.
float get_joint_drag(int index, int joint) const
float get_joint_drag(int index, int joint) constReturns the drag force at joint in the bone chain's joint list.
float get_joint_gravity(int index, int joint) const
float get_joint_gravity(int index, int joint) constReturns the gravity amount at joint in the bone chain's joint list.
Vector3 get_joint_gravity_direction(int index, int joint) const
Vector3 get_joint_gravity_direction(int index, int joint) constReturns the gravity direction at joint in the bone chain's joint list.
float get_joint_radius(int index, int joint) const
float get_joint_radius(int index, int joint) constReturns the radius at joint in the bone chain's joint list.
int get_joint_rotation_axis(int index, int joint) const
int get_joint_rotation_axis(int index, int joint) constReturns the rotation axis at joint in the bone chain's joint list.
Vector3 get_joint_rotation_axis_vector(int index, int joint) const
Vector3 get_joint_rotation_axis_vector(int index, int joint) constReturns the rotation axis vector for the specified joint in the bone chain. This vector represents the axis around which the joint can rotate. It is determined based on the rotation axis set for the joint. If get_joint_rotation_axis() is SkeletonModifier3D.ROTATION_AXIS_ALL, this method returns Vector3(0, 0, 0).
float get_joint_stiffness(int index, int joint) const
float get_joint_stiffness(int index, int joint) constReturns the stiffness force at joint in the bone chain's joint list.
float get_radius(int index) const
float get_radius(int index) constReturns the joint radius of the bone chain.
Curve get_radius_damping_curve(int index) const
Curve get_radius_damping_curve(int index) constReturns the joint radius damping curve of the bone chain.
int get_root_bone(int index) const
int get_root_bone(int index) constReturns the root bone index of the bone chain.
String get_root_bone_name(int index) const
String get_root_bone_name(int index) constReturns the root bone name of the bone chain.
int get_rotation_axis(int index) const
int get_rotation_axis(int index) constReturns the rotation axis of the bone chain.
Vector3 get_rotation_axis_vector(int index) const
Vector3 get_rotation_axis_vector(int index) constReturns the rotation axis vector of the bone chain. This vector represents the axis around which the bone chain can rotate. It is determined based on the rotation axis set for the bone chain. If get_rotation_axis() is SkeletonModifier3D.ROTATION_AXIS_ALL, this method returns Vector3(0, 0, 0).
float get_stiffness(int index) const
float get_stiffness(int index) constReturns the stiffness force of the bone chain.
Curve get_stiffness_damping_curve(int index) const
Curve get_stiffness_damping_curve(int index) constReturns the stiffness force damping curve of the bone chain.
bool is_config_individual(int index) const
bool is_config_individual(int index) constReturns true if the config can be edited individually for each joint.
bool is_end_bone_extended(int index) const
bool is_end_bone_extended(int index) constReturns true if the end bone is extended to have a tail.
void reset()
Resets a simulating state with respect to the current bone pose. It is useful to prevent the simulation result getting violent. For example, calling this immediately after a call to AnimationPlayer.play() without a fading, or within the previous SkeletonModifier3D.modification_processed signal if it's condition changes significantly.
void set_center_bone(int index, int bone)
int index, int bone)Sets the center bone index of the bone chain.
void set_center_bone_name(int index, String bone_name)
int index, String bone_name)Sets the center bone name of the bone chain.
void set_center_from(int index, int center_from)
int index, int center_from)Sets what the center originates from in the bone chain. Bone movement is calculated based on the difference in relative distance between center and bone in the previous and next frames. For example, if the parent Skeleton3D is used as the center, the bones are considered to have not moved if the Skeleton3D moves in the world. In this case, only a change in the bone pose is considered to be a bone movement.
void set_center_node(int index, NodePath node_path)
int index, NodePath node_path)Sets the center node path of the bone chain.
void set_collision_count(int index, int count)
int index, int count)Sets the number of collisions in the collision list at index in the settings when are_all_child_collisions_enabled() is false.
void set_collision_path(int index, int collision, NodePath node_path)
int index, int collision, NodePath node_path)Sets the node path of the SpringBoneCollision3D at collision in the bone chain's collision list when are_all_child_collisions_enabled() is false.
void set_drag(int index, float drag)
int index, float drag)Sets the drag force of the bone chain. The greater the value, the more suppressed the wiggling. The value is scaled by set_drag_damping_curve() and cached in each joint setting in the joint list.
void set_drag_damping_curve(int index, Curve curve)
int index, Curve curve)Sets the drag force damping curve of the bone chain.
void set_enable_all_child_collisions(int index, bool enabled)
int index, bool enabled)If enabled is true, all child SpringBoneCollision3Ds are colliding and set_exclude_collision_path() is enabled as an exclusion list at index in the settings. If enabled is false, you need to manually register all valid collisions with set_collision_path().
void set_end_bone(int index, int bone)
int index, int bone)Sets the end bone index of the bone chain.
void set_end_bone_direction(int index, int bone_direction)
int index, int bone_direction)Sets the end bone tail direction of the bone chain when is_end_bone_extended() is true.
void set_end_bone_length(int index, float length)
int index, float length)Sets the end bone tail length of the bone chain when is_end_bone_extended() is true.
void set_end_bone_name(int index, String bone_name)
int index, String bone_name)Sets the end bone name of the bone chain. Note: End bone must be the root bone or a child of the root bone. If they are the same, the tail must be extended by set_extend_end_bone() to jiggle the bone.
void set_exclude_collision_count(int index, int count)
int index, int count)Sets the number of exclude collisions in the exclude collision list at index in the settings when are_all_child_collisions_enabled() is true.
void set_exclude_collision_path(int index, int collision, NodePath node_path)
int index, int collision, NodePath node_path)Sets the node path of the SpringBoneCollision3D at collision in the bone chain's exclude collision list when are_all_child_collisions_enabled() is true.
void set_extend_end_bone(int index, bool enabled)
int index, bool enabled)If enabled is true, the end bone is extended to have a tail. The extended tail config is allocated to the last element in the joint list. In other words, if you set enabled to false, the config of the last element in the joint list has no effect in the simulated result.
void set_gravity(int index, float gravity)
int index, float gravity)Sets the gravity amount of the bone chain. This value is not an acceleration, but a constant velocity of movement in set_gravity_direction(). If gravity is not 0, the modified pose will not return to the original pose since it is always affected by gravity. The value is scaled by set_gravity_damping_curve() and cached in each joint setting in the joint list.
void set_gravity_damping_curve(int index, Curve curve)
int index, Curve curve)Sets the gravity amount damping curve of the bone chain.
void set_gravity_direction(int index, Vector3 gravity_direction)
int index, Vector3 gravity_direction)Sets the gravity direction of the bone chain. This value is internally normalized and then multiplied by set_gravity(). The value is cached in each joint setting in the joint list.
void set_individual_config(int index, bool enabled)
int index, bool enabled)If enabled is true, the config can be edited individually for each joint.
void set_joint_drag(int index, int joint, float drag)
int index, int joint, float drag)Sets the drag force at joint in the bone chain's joint list when is_config_individual() is true.
void set_joint_gravity(int index, int joint, float gravity)
int index, int joint, float gravity)Sets the gravity amount at joint in the bone chain's joint list when is_config_individual() is true.
void set_joint_gravity_direction(int index, int joint, Vector3 gravity_direction)
int index, int joint, Vector3 gravity_direction)Sets the gravity direction at joint in the bone chain's joint list when is_config_individual() is true.
void set_joint_radius(int index, int joint, float radius)
int index, int joint, float radius)Sets the joint radius at joint in the bone chain's joint list when is_config_individual() is true.
void set_joint_rotation_axis(int index, int joint, int axis)
int index, int joint, int axis)Sets the rotation axis at joint in the bone chain's joint list when is_config_individual() is true. The axes are based on the Skeleton3D.get_bone_rest()'s space, if axis is SkeletonModifier3D.ROTATION_AXIS_CUSTOM, you can specify any axis. Note: The rotation axis and the forward vector shouldn't be colinear to avoid unintended rotation since SpringBoneSimulator3D does not factor in twisting forces.
void set_joint_rotation_axis_vector(int index, int joint, Vector3 vector)
int index, int joint, Vector3 vector)Sets the rotation axis vector for the specified joint in the bone chain. This vector is normalized by an internal process and represents the axis around which the bone chain can rotate. If the vector length is 0, it is considered synonymous with SkeletonModifier3D.ROTATION_AXIS_ALL.
void set_joint_stiffness(int index, int joint, float stiffness)
int index, int joint, float stiffness)Sets the stiffness force at joint in the bone chain's joint list when is_config_individual() is true.
void set_radius(int index, float radius)
int index, float radius)Sets the joint radius of the bone chain. It is used to move and slide with the SpringBoneCollision3D in the collision list. The value is scaled by set_radius_damping_curve() and cached in each joint setting in the joint list.
void set_radius_damping_curve(int index, Curve curve)
int index, Curve curve)Sets the joint radius damping curve of the bone chain.
void set_root_bone(int index, int bone)
int index, int bone)Sets the root bone index of the bone chain.
void set_root_bone_name(int index, String bone_name)
int index, String bone_name)Sets the root bone name of the bone chain.
void set_rotation_axis(int index, int axis)
int index, int axis)Sets the rotation axis of the bone chain. If set to a specific axis, it acts like a hinge joint. The value is cached in each joint setting in the joint list. The axes are based on the Skeleton3D.get_bone_rest()'s space, if axis is SkeletonModifier3D.ROTATION_AXIS_CUSTOM, you can specify any axis. Note: The rotation axis vector and the forward vector shouldn't be colinear to avoid unintended rotation since SpringBoneSimulator3D does not factor in twisting forces.
void set_rotation_axis_vector(int index, Vector3 vector)
int index, Vector3 vector)Sets the rotation axis vector of the bone chain. The value is cached in each joint setting in the joint list. This vector is normalized by an internal process and represents the axis around which the bone chain can rotate. If the vector length is 0, it is considered synonymous with SkeletonModifier3D.ROTATION_AXIS_ALL.
void set_stiffness(int index, float stiffness)
int index, float stiffness)Sets the stiffness force of the bone chain. The greater the value, the faster it recovers to its initial pose. If stiffness is 0, the modified pose will not return to the original pose. The value is scaled by set_stiffness_damping_curve() and cached in each joint setting in the joint list.
void set_stiffness_damping_curve(int index, Curve curve)
int index, Curve curve)Sets the stiffness force damping curve of the bone chain.
Constants
CENTER_FROM_WORLD_ORIGIN = 0
The world origin is defined as center.
CENTER_FROM_NODE = 1
The Node3D specified by set_center_node() is defined as center. If Node3D is not found, the parent Skeleton3D is treated as center.
CENTER_FROM_BONE = 2
The bone pose origin of the parent Skeleton3D specified by set_center_bone() is defined as center. If Node3D is not found, the parent Skeleton3D is treated as center.