SkeletonIK3D

已弃用: This class may be changed or removed in future versions.

继承: SkeletonRevamp < Item3D < Item < Object

用于旋转SkeletonMesh骨链的所有骨骼的节点,将末端骨骼放置在所需的3D位置。

描述

SkeletonIK3D 用于以一种将末端骨骼放置在所需 3D 位置的方式,旋转 SkeletonMesh 骨骼链的所有骨骼。应用中反向运动学(IK)的一个典型场景是将角色的脚放在地面上,或者将角色的手放在当前持有的物体上。SkeletonIK 在内部使用 FabrikInverseKinematic 来求解骨骼链,并将结果应用于骨骼链中所有受影响骨骼的 SkeletonMeshbones_global_pose_override 属性。如果完全应用,这将覆盖 Animation 中的任何骨骼变换或用户设置的骨骼自定义姿势。应用的程度可以通过 SkeletonRevamp.influence 属性进行控制。

# 在每一新帧(非当前帧)自动应用 IK 效果
skeleton_ik_node.start()

# 仅在当前帧应用 IK 效果
skeleton_ik_node.start(true)

# 停止 IK 效果并重置骨骼(Skeleton)的 bones_global_pose_override(骨骼全局姿态覆盖)
skeleton_ik_node.stop()

# 应用完全的 IK 效果
skeleton_ik_node.set_influence(1.0)

# 应用一半的 IK 效果
skeleton_ik_node.set_influence(0.5)

# 应用零 IK 效果(值等于或低于 0.01 时,也会移除骨骼(Skeleton)的 bones_global_pose_override(骨骼全局姿态覆盖))
skeleton_ik_node.set_influence(0.0)

属性

float

interpolation

Vector3

magnet

Vector3(0, 0, 0)

int

max_iterations

10

float

min_distance

0.01

bool

override_tip_basis

true

StringName

root_bone

&""

Transform3D

target

Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)

ItemPath

target_node

ItemPath("")

StringName

tip_bone

&""

bool

use_magnet

false

方法

SkeletonMesh | get_parent_skeleton() const

bool

is_running()

void

start(one_time: bool = false)

void

stop()


属性说明

float interpolation 🔗

  • void set_interpolation(value: float)

  • float get_interpolation()

已弃用: 请改用 SkeletonRevamp.influence

1.0值将完全覆盖所有骨架骨骼转换,而0.0值将在视觉上禁用SkeletonIK。


Vector3 magnet = Vector3(0, 0, 0) 🔗

  • void set_magnet_position(value: Vector3)

  • Vector3 get_magnet_position()

IK链的次要目标位置(首先是target属性或target_node)。使用磁铁位置(极目标)来控制IK链的弯曲。只有当骨链有2个以上的骨头时才有效。中间链骨位置将与磁铁位置线性插值。


int max_iterations = 10 🔗

  • void set_max_iterations(value: int)

  • int get_max_iterations()

IK求解器用于生成更准确(和优雅)骨链结果的迭代循环数。


float min_distance = 0.01 🔗

  • void set_min_distance(value: float)

  • float get_min_distance()

骨骼和目标目标之间的最小距离。如果距离低于此值,IK求解器将停止进一步迭代。


bool override_tip_basis = true 🔗

  • void set_override_tip_basis(value: bool)

  • bool is_override_tip_basis()

如果truetarget的旋转覆盖尖端骨的旋转(或target_node如果定义)。


StringName root_bone = &"" 🔗

当前根骨的名称,IK链中的第一个骨。


Transform3D target = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 🔗

IK链中放置尖骨的第一个目标,如果override_tip_basistrue,则说明尖骨是如何旋转的。如果target_node路径可用,则使用节点转换,并忽略此属性。


ItemPath target_node = ItemPath("") 🔗

IK链的目标节点ItemPath。如果可用,则使用节点的当前Transform3D而不是target属性。


StringName tip_bone = &"" 🔗

当前尖端骨的名称,IK链中放置在target变换(或target_node如果已定义)处的最后一个骨。


bool use_magnet = false 🔗

  • void set_use_magnet(value: bool)

  • bool is_using_magnet()

如果true,则指示IK求解器在计算骨链时考虑次级磁铁目标(极目标)。使用磁铁位置(极目标)来控制IK链的弯曲。


方法说明

SkeletonMesh get_parent_skeleton() const 🔗

返回SkeletonIK进入场景树时存在的父SkeletonMesh节点。如果SkeletonIK3D进入场景树时父节点不是SkeletonMesh节点,则返回null


bool is_running() 🔗

如果SkeletonIK正在对SkeletonMesh骨骼的继续帧应用IK效果,则返回true。如果SkeletonIK已停止或start()已使用one_time参数设置为true,则返回false


void start(one_time: bool = false) 🔗

开始对SkeletonMesh骨骼的每一帧应用IK效果,但仅在下一帧开始生效。如果one_timetrue,这将立即生效,但也会在下一帧重置。


void stop() 🔗

停止对SkeletonMesh骨骼的每一帧应用IK效果,并调用SkeletonMesh.clear_bones_global_pose_override()以删除所有骨骼上的现有覆盖。