Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

SpringBoneSimulator3D

继承: SkeletonModifier3D < Node3D < Node < Object

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

描述

这个 SkeletonModifier3D(3D骨骼修改器)可以用来让头发、布料和尾巴等物体产生自然的晃动效果。它与 PhysicalBoneSimulator3D(物理骨骼模拟器)的表现有所不同,因为它在模拟物理晃动后,会尝试让骨骼回归到原本的姿势。

如果你设置了 set_root_bone()(设置根骨骼)和 set_end_bone()(设置末端骨骼),它们会被视为一条单一的骨骼链。请注意,它不支持像 Y 字形那样的分支骨骼链。

当一条骨骼链被创建时,系统会生成一个数组,其中包含了介于根骨骼和末端骨骼之间、且列在关节列表中的所有骨骼。

你可以为每个关节应用多种物理属性,例如 set_joint_stiffness()(设置关节刚度/硬度)、set_joint_drag()(设置关节阻力/阻尼)以及 set_joint_gravity()(设置关节重力)。

为了简便起见,你可以通过一条 Curve(曲线)来同时为所有关节设置数值。如果你想要单独为每个关节指定更详细的数值,可以将 set_individual_config()(设置独立配置)设为 true

在物理模拟方面,SpringBoneSimulator3D 可以拥有子节点作为独立的碰撞体,这些碰撞体与 PhysicsServer3D(物理服务器3D)无关,具体可参考 SpringBoneCollision3D(弹簧骨骼碰撞3D)。

警告: 经过缩放(scaled)的 SpringBoneSimulator3D 很可能无法按预期运行。请确保其父节点 Skeleton3D 以及它的骨骼都没有被缩放。

注意: 该类中的大多数方法都带有一个 index(索引)参数。如果 IK(反向动力学)有多个条目(例如 settings//root_bone_name),该参数用于指定要返回哪一个设置列表条目。

属性

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()

如果为 true,则求解器会每帧从骨骼姿势中检索骨骼轴。

如果为 false,则求解器会从骨骼放松姿势中检索骨骼轴并进行缓存,这会略微提高性能,但在该 SpringBoneSimulator3D 处理之前对骨骼姿势进行的任何位置更改都将被忽略。


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 🔗

is_end_bone_extended()true 时,返回骨骼链末端骨骼的尾部方向。


float get_end_bone_length(index: int) const 🔗

is_end_bone_extended()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 🔗

返回骨骼链中指定关节的旋转轴向量。该向量表示关节可以绕其旋转的轴。它根据为该关节设置的旋转轴确定。

如果 get_joint_rotation_axis()SkeletonModifier3D.ROTATION_AXIS_ALL,则该方法返回 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 🔗

返回骨骼链的旋转轴向量。该向量表示骨骼链围绕哪个轴旋转,是根据为骨骼链设置的旋转轴确定的。

如果 get_rotation_axis()SkeletonModifier3D.ROTATION_AXIS_ALL,则该方法返回 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 🔗

如果末端骨骼被扩展形成尾部,则返回 true


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

is_config_individual()(独立配置)为 true 时,此方法用于设置骨骼链关节列表里指定 joint(关节)的旋转轴。

这些轴向是基于参考姿势的空间来确定的;如果 axis(轴向)被设为 SkeletonModifier3D.ROTATION_AXIS_CUSTOM(自定义旋转轴),你就可以指定任意轴向。

在这里,“参考姿势”指的是模拟开始前那一瞬间的骨骼姿势。

注意: 旋转轴和前进向量不应处于同一直线上(共线),否则会导致意外的旋转。这是因为 SpringBoneSimulator3D(弹簧骨骼模拟器)本身并不会计算扭转力。


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

设置骨骼链中指定关节的旋转轴向量。

该向量会经过内部处理进行归一化,并代表骨骼链可以围绕其旋转的轴。

如果向量长度为 0,则被视为等同于 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) 🔗

设置骨骼链的旋转轴。如果设置为特定轴,则其行为类似于铰链关节。该值会缓存在关节列表中的每个关节设置中。

坐标轴基于参考姿势的空间;如果参数轴常量 SkeletonModifier3D.ROTATION_AXIS_CUSTOM,则您可以指定任意轴。

在此处,参考姿势是模拟前的骨骼 姿势姿势。

注意:旋转轴向量与前向向量不应共线,以避免出现意外旋转,因为SpringBoneSimulator3D不会考虑扭转力。


void set_rotation_axis_vector(index: int, vector: Vector3) 🔗

设置骨骼链的旋转轴向量。该值会缓存到关节列表中的每个关节设置中。

该向量经过内部处理后会被归一化,表示骨骼链围绕哪个轴旋转。

如果向量长度为 0,则被视为与 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) 🔗

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