SpringBoneSimulator3D

继承: SkeletonModifier3D < Node3D < Node < Object

对骨骼链应用惯性摆动的 SkeletonModifier3D

描述

这种 SkeletonModifier3D 可以用来扭动头发、布料和尾巴,其行为与 PhysicalBoneSimulator3D 不同,修改后会尝试返回到原始姿势。

如果设置了 set_root_bone()set_end_bone() 就会将其视为骨骼链。请注意,不支持像 Y 形链那样的分支链。

创建骨骼链时会根据首尾之间的骨骼生成数组,在关节列表中展示。

每个关节都有许多属性可以应用,例如 set_joint_stiffness()set_joint_drag()set_joint_gravity()

为了简化操作,你可以使用 Curve 同时设置所有关节的值。如果你想单独指定详细值,请将 set_individual_config() 设置为 true

物理模拟时,SpringBoneSimulator3D 可以有子对象作为独立的碰撞体,这些碰撞体与 PhysicsServer3D 无关,另见 SpringBoneCollision3D

警告:缩放后的 SpringBoneSimulator3D 可能不会按预期行为。请确保父级 Skeleton3D 及其骨骼没有缩放。

属性

Vector3

external_force

Vector3(0, 0, 0)

bool

mutable_bone_axes

true

int

setting_count

0

方法

bool

are_all_child_collisions_enabled(index: int) const

void

clear_collisions(index: int)

void

clear_exclude_collisions(index: int)

void

clear_settings()

int

get_center_bone(index: int) const

String

get_center_bone_name(index: int) const

CenterFrom

get_center_from(index: int) const

NodePath

get_center_node(index: int) const

int

get_collision_count(index: int) const

NodePath

get_collision_path(index: int, collision: int) const

float

get_drag(index: int) const

Curve

get_drag_damping_curve(index: int) const

int

get_end_bone(index: int) const

BoneDirection

get_end_bone_direction(index: int) const

float

get_end_bone_length(index: int) const

String

get_end_bone_name(index: int) const

int

get_exclude_collision_count(index: int) const

NodePath

get_exclude_collision_path(index: int, collision: int) const

float

get_gravity(index: int) const

Curve

get_gravity_damping_curve(index: int) const

Vector3

get_gravity_direction(index: int) const

int

get_joint_bone(index: int, joint: int) const

String

get_joint_bone_name(index: int, joint: int) const

int

get_joint_count(index: int) const

float

get_joint_drag(index: int, joint: int) const

float

get_joint_gravity(index: int, joint: int) const

Vector3

get_joint_gravity_direction(index: int, joint: int) const

float

get_joint_radius(index: int, joint: int) const

RotationAxis

get_joint_rotation_axis(index: int, joint: int) const

Vector3

get_joint_rotation_axis_vector(index: int, joint: int) const

float

get_joint_stiffness(index: int, joint: int) const

float

get_radius(index: int) const

Curve

get_radius_damping_curve(index: int) const

int

get_root_bone(index: int) const

String

get_root_bone_name(index: int) const

RotationAxis

get_rotation_axis(index: int) const

Vector3

get_rotation_axis_vector(index: int) const

float

get_stiffness(index: int) const

Curve

get_stiffness_damping_curve(index: int) const

bool

is_config_individual(index: int) const

bool

is_end_bone_extended(index: int) const

void

reset()

void

set_center_bone(index: int, bone: int)

void

set_center_bone_name(index: int, bone_name: String)

void

set_center_from(index: int, center_from: CenterFrom)

void

set_center_node(index: int, node_path: NodePath)

void

set_collision_count(index: int, count: int)

void

set_collision_path(index: int, collision: int, node_path: NodePath)

void

set_drag(index: int, drag: float)

void

set_drag_damping_curve(index: int, curve: Curve)

void

set_enable_all_child_collisions(index: int, enabled: bool)

void

set_end_bone(index: int, bone: int)

void

set_end_bone_direction(index: int, bone_direction: BoneDirection)

void

set_end_bone_length(index: int, length: float)

void

set_end_bone_name(index: int, bone_name: String)

void

set_exclude_collision_count(index: int, count: int)

void

set_exclude_collision_path(index: int, collision: int, node_path: NodePath)

void

set_extend_end_bone(index: int, enabled: bool)

void

set_gravity(index: int, gravity: float)

void

set_gravity_damping_curve(index: int, curve: Curve)

void

set_gravity_direction(index: int, gravity_direction: Vector3)

void

set_individual_config(index: int, enabled: bool)

void

set_joint_drag(index: int, joint: int, drag: float)

void

set_joint_gravity(index: int, joint: int, gravity: float)

void

set_joint_gravity_direction(index: int, joint: int, gravity_direction: Vector3)

void

set_joint_radius(index: int, joint: int, radius: float)

void

set_joint_rotation_axis(index: int, joint: int, axis: RotationAxis)

void

set_joint_rotation_axis_vector(index: int, joint: int, vector: Vector3)

void

set_joint_stiffness(index: int, joint: int, stiffness: float)

void

set_radius(index: int, radius: float)

void

set_radius_damping_curve(index: int, curve: Curve)

void

set_root_bone(index: int, bone: int)

void

set_root_bone_name(index: int, bone_name: String)

void

set_rotation_axis(index: int, axis: RotationAxis)

void

set_rotation_axis_vector(index: int, vector: Vector3)

void

set_stiffness(index: int, stiffness: float)

void

set_stiffness_damping_curve(index: int, curve: Curve)


枚举

enum CenterFrom: 🔗

CenterFrom CENTER_FROM_WORLD_ORIGIN = 0

将世界原点定义为中心。

CenterFrom CENTER_FROM_NODE = 1

set_center_node() 指定的 Node3D 定义为中心。

如果未找到 Node3D,则将父 Skeleton3D 作为中心。

CenterFrom CENTER_FROM_BONE = 2

set_center_bone() 指定的父 Skeleton3D 的骨骼姿势原点定义为中心。

如果未找到 Node3D,则将父 Skeleton3D 作为中心。


属性说明

Vector3 external_force = Vector3(0, 0, 0) 🔗

  • void set_external_force(value: Vector3)

  • Vector3 get_external_force()

始终作用于骨骼的恒定力。当父级 Skeleton3D 以相反方向以此速度移动时,该力等于其结果。

对于风和反重力等效果非常有用。


bool mutable_bone_axes = true 🔗

  • void set_mutable_bone_axes(value: bool)

  • bool are_bone_axes_mutable()

If 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 🔗

  • void set_setting_count(value: int)

  • int get_setting_count()

设置的数量。


方法说明

bool are_all_child_collisions_enabled(index: int) const 🔗

如果所有子 SpringBoneCollision3D 都包含在设置中索引为 index 的碰撞列表中,则返回 true


void clear_collisions(index: int) 🔗

are_all_child_collisions_enabled()false 时,清空设置中索引为 index 的碰撞列表中的所有碰撞。


void clear_exclude_collisions(index: int) 🔗

are_all_child_collisions_enabled()true 时,清空设置中索引为 index 的碰撞列表中的所有排除碰撞。


void clear_settings() 🔗

清空所有设置。


int get_center_bone(index: int) const 🔗

返回骨骼链中间骨骼的索引。


String get_center_bone_name(index: int) const 🔗

返回骨骼链中间骨骼的名称。


CenterFrom get_center_from(index: int) const 🔗

返回骨骼链中心的来源。


NodePath get_center_node(index: int) const 🔗

返回骨骼链中心节点的路径。


int get_collision_count(index: int) const 🔗

are_all_child_collisions_enabled()false 时,返回骨骼链的碰撞列表中的碰撞数量。


NodePath get_collision_path(index: int, collision: int) const 🔗

are_all_child_collisions_enabled()false 时,返回骨骼链的碰撞列表中 collisionSpringBoneCollision3D 节点路径。


float get_drag(index: int) const 🔗

返回骨骼链的阻力阻尼曲线。


Curve get_drag_damping_curve(index: int) const 🔗

返回骨骼链的阻力阻尼曲线。


int get_end_bone(index: int) const 🔗

返回骨骼链末尾骨骼的索引。


BoneDirection get_end_bone_direction(index: int) const 🔗

Returns the tail direction of the end bone of the bone chain when is_end_bone_extended() is true.


float get_end_bone_length(index: int) const 🔗

Returns the end bone tail length of the bone chain when is_end_bone_extended() is true.


String get_end_bone_name(index: int) const 🔗

返回骨骼链末尾骨骼的名称。


int get_exclude_collision_count(index: int) const 🔗

are_all_child_collisions_enabled()true 时,返回骨骼链的排除碰撞列表中的排除碰撞数量。


NodePath get_exclude_collision_path(index: int, collision: int) const 🔗

are_all_child_collisions_enabled()true 时,返回骨骼链的排除碰撞列表中 collisionSpringBoneCollision3D 节点路径。


float get_gravity(index: int) const 🔗

返回骨骼链的重力强度。


Curve get_gravity_damping_curve(index: int) const 🔗

返回骨骼链的重力强度阻尼曲线。


Vector3 get_gravity_direction(index: int) const 🔗

返回骨骼链的重力方向。


int get_joint_bone(index: int, joint: int) const 🔗

返回骨骼链关节列表中位于 joint 的骨骼的索引。


String get_joint_bone_name(index: int, joint: int) const 🔗

返回骨骼链关节列表中位于 joint 的骨骼的名称。


int get_joint_count(index: int) const 🔗

返回骨骼链关节列表中的关节数量。


float get_joint_drag(index: int, joint: int) const 🔗

返回骨骼链关节列表中 joint 关节的阻力。


float get_joint_gravity(index: int, joint: int) const 🔗

返回骨骼链关节列表中 joint 关节的重力强度。


Vector3 get_joint_gravity_direction(index: int, joint: int) const 🔗

返回骨骼链关节列表中 joint 关节的重力方向。


float get_joint_radius(index: int, joint: int) const 🔗

返回骨骼链关节列表中 joint 关节的半径。


RotationAxis get_joint_rotation_axis(index: int, joint: int) const 🔗

返回骨骼链关节列表中 joint 关节的旋转轴。


Vector3 get_joint_rotation_axis_vector(index: int, joint: int) const 🔗

Returns 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(index: int, joint: int) const 🔗

返回骨骼链关节列表中 joint 关节的刚度力。


float get_radius(index: int) const 🔗

返回骨骼链的关节半径。


Curve get_radius_damping_curve(index: int) const 🔗

返回骨骼链的关节半径阻尼曲线。


int get_root_bone(index: int) const 🔗

返回骨骼链根骨骼的索引。


String get_root_bone_name(index: int) const 🔗

返回骨骼链根骨骼的名称。


RotationAxis get_rotation_axis(index: int) const 🔗

返回骨骼链的旋转轴。


Vector3 get_rotation_axis_vector(index: int) const 🔗

Returns 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(index: int) const 🔗

返回骨骼链的刚度力。


Curve get_stiffness_damping_curve(index: int) const 🔗

返回骨骼链的刚度力阻尼曲线。


bool is_config_individual(index: int) const 🔗

如果可以为每个关节单独编辑配置,则返回 true


bool is_end_bone_extended(index: int) const 🔗

Returns true if the end bone is extended to have a tail.


void reset() 🔗

重置与当前骨骼姿势相关的模拟状态。

这样做有助于防止模拟结果变得剧烈。例如在不带渐变调用 AnimationPlayer.play() 之后立即调用该方法,或者在前一个 SkeletonModifier3D.modification_processed 信号中当条件发生显著变化时调用。


void set_center_bone(index: int, bone: int) 🔗

设置骨骼链中心骨骼的索引。


void set_center_bone_name(index: int, bone_name: String) 🔗

设置骨骼链中心骨骼的名称。


void set_center_from(index: int, center_from: CenterFrom) 🔗

设置骨骼链中心的来源。

骨骼的移动是基于中心与骨骼在前后帧之间相对距离的变化来计算的。

例如将父级 Skeleton3D 用作中心,那么 Skeleton3D 在世界中移动时,骨骼就会被视为没有移动。

在这种情况下,只有骨骼姿势的变化才被视为骨骼的移动。


void set_center_node(index: int, node_path: NodePath) 🔗

设置骨骼链中心节点的路径。


void set_collision_count(index: int, count: int) 🔗

are_all_child_collisions_enabled()false 时,设置索引为 index 的碰撞列表中的碰撞数量。


void set_collision_path(index: int, collision: int, node_path: NodePath) 🔗

are_all_child_collisions_enabled()false 时,设置骨骼链的碰撞列表中 collisionSpringBoneCollision3D 节点路径。


void set_drag(index: int, drag: float) 🔗

设置骨骼链的阻力。值越大,摆动越受到抑制。

该值由 set_drag_damping_curve() 进行缩放,并缓存到关节列表中每个关节的设置中。


void set_drag_damping_curve(index: int, curve: Curve) 🔗

设置骨骼链的阻力阻尼曲线。


void set_enable_all_child_collisions(index: int, enabled: bool) 🔗

如果 enabledtrue,则所有子级 SpringBoneCollision3D 都会发生碰撞,set_exclude_collision_path() 在设置中的 index 处启用作为排除列表。

如果 enabledfalse,则需要手动使用 set_collision_path() 注册所有有效的碰撞。


void set_end_bone(index: int, bone: int) 🔗

设置骨骼链中末端骨骼的索引。


void set_end_bone_direction(index: int, bone_direction: BoneDirection) 🔗

is_end_bone_extended()true 时,设置骨骼链中末端骨骼的尾部方向。


void set_end_bone_length(index: int, length: float) 🔗

is_end_bone_extended()true 时,设置骨骼链中末端骨骼的尾部长度。


void set_end_bone_name(index: int, bone_name: String) 🔗

设置骨骼链中末端骨骼的名称。

注意: 末端骨骼必须是根骨骼或根骨骼的子骨骼。如果相同,则必须通过 set_extend_end_bone() 扩展尾部,使骨骼产生摆动。


void set_exclude_collision_count(index: int, count: int) 🔗

are_all_child_collisions_enabled()true 时,设置索引为 index 的排除碰撞列表中的排除碰撞数量。


void set_exclude_collision_path(index: int, collision: int, node_path: NodePath) 🔗

are_all_child_collisions_enabled()true 时,设置骨骼链的排除碰撞列表中 collisionSpringBoneCollision3D 节点路径。


void set_extend_end_bone(index: int, enabled: bool) 🔗

如果 enabledtrue,则会延伸末端骨骼形成尾部。

扩展的尾部配置会分配给关节列表中的最后一个元素。换句话说,如果将 enabled 设置为 false,则关节列表中最后一个元素的配置对模拟结果没有影响。


void set_gravity(index: int, gravity: float) 🔗

设置骨骼链的重力强度。该值不是加速度,而是 set_gravity_direction() 的恒定运动速度。

如果 gravity 不为 0,则修改后的姿势将不会返回到原始姿势,因为它始终受到重力的影响。

该值会被 set_gravity_damping_curve() 缩放,并缓存到关节列表中的每个关节设置中。


void set_gravity_damping_curve(index: int, curve: Curve) 🔗

设置骨骼链的重力强度阻尼曲线。


void set_gravity_direction(index: int, gravity_direction: Vector3) 🔗

设置骨骼链的重力方向。内部会对该值进行归一化,然后乘以 set_gravity()

该值会被缓存到关节列表中的每个关节设置中。


void set_individual_config(index: int, enabled: bool) 🔗

如果 enabledtrue,则可以为每个关节单独编辑配置。


void set_joint_drag(index: int, joint: int, drag: float) 🔗

is_config_individual()true 时,设置骨骼链关节列表中 joint 关节的阻力。


void set_joint_gravity(index: int, joint: int, gravity: float) 🔗

is_config_individual()true 时,设置骨骼链关节列表中 joint 关节的重力强度。


void set_joint_gravity_direction(index: int, joint: int, gravity_direction: Vector3) 🔗

is_config_individual()true 时,设置骨骼链关节列表中 joint 关节的重力方向。


void set_joint_radius(index: int, joint: int, radius: float) 🔗

is_config_individual()true 时,设置骨骼链关节列表中 joint 关节的半径。


void set_joint_rotation_axis(index: int, joint: int, axis: RotationAxis) 🔗

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(index: int, joint: int, vector: Vector3) 🔗

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(index: int, joint: int, stiffness: float) 🔗

is_config_individual()true 时,设置骨骼链关节列表中 joint 关节的刚度力。


void set_radius(index: int, radius: float) 🔗

设置骨骼链的关节半径,用于在碰撞列表中与 SpringBoneCollision3D 一起移动和滑动。

该值由 set_radius_damping_curve() 进行缩放,并缓存到关节列表中每个关节的设置中。


void set_radius_damping_curve(index: int, curve: Curve) 🔗

设置骨骼链的关节半径阻尼曲线。


void set_root_bone(index: int, bone: int) 🔗

设置骨骼链中根骨骼的索引。


void set_root_bone_name(index: int, bone_name: String) 🔗

设置骨骼链中根骨骼的名称。


void set_rotation_axis(index: int, axis: RotationAxis) 🔗

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(index: int, vector: Vector3) 🔗

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(index: int, stiffness: float) 🔗

设置骨骼链的刚度力。值越大,恢复到初始姿势的速度越快。

如果 stiffness0,则修改后的姿势不会返回到原始姿势。

该值由 set_stiffness_damping_curve() 进行缩放,并缓存到关节列表中每个关节的设置中。


void set_stiffness_damping_curve(index: int, curve: Curve) 🔗

设置骨骼链的刚度力阻尼曲线。