SkeletonIK3D

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

继承: SkeletonModifier3D < Node3D < Node < Object

可以将 Skeleton3D 骨骼链中的所有骨骼进行旋转,从而将末端骨骼放置在正确的 3D 位置的节点。

描述

SkeletonIK3D 可以将 Skeleton3D 骨骼链中的所有骨骼进行旋转,从而将末端骨骼放置在正确的 3D 位置。游戏中 IK 的典型场景是将角色的脚放在地面上,或者将角色的手放在当前持有的物体上。SkeletonIK 在内部使用 FabrikInverseKinematic 来解决骨骼链,并将结果应用于 Skeleton3D bones_global_pose_override 属性中所有受影响的骨骼链。如果完全应用,这将覆盖任何来自 Animation 的骨骼变换或用户设置的骨骼自定义姿势。应用量可以用 SkeletonModifier3D.influence 属性来控制。

  1. # 在每一个新的帧上自动应用 IK 效果(不是当前的)。
  2. skeleton_ik_node.start()
  3. # 只在当前帧上应用 IK 效果
  4. skeleton_ik_node.start(true)
  5. # 停止 IK 效果并重置骨骼上的 bones_global_pose_override
  6. skeleton_ik_node.stop()
  7. # 应用完整的 IK 效果
  8. skeleton_ik_node.set_influence(1.0)
  9. # 应用一半的 IK 效果
  10. skeleton_ik_node.set_influence(0.5)
  11. # 应用零 IK 效果(数值为 0.01 或低于 0.01 也会移除 Skeleton 上的 bones_global_pose_override)
  12. 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)

NodePath

target_node

NodePath(“”)

StringName

tip_bone

&””

bool

use_magnet

false

方法

Skeleton3D

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

已弃用: Use SkeletonModifier3D.influence instead.

IK 效果被应用于当前骨架骨骼链的程度的插值。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()

如果为 true,则用 target(或者如果定义了 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 路径可用,则使用节点变换,并忽略此属性。


NodePath target_node = NodePath("") 🔗

IK 链的目标节点 NodePath。如果有的话,将使用节点当前的 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 链的弯曲。


方法说明

Skeleton3D get_parent_skeleton() const 🔗

返回 SkeletonIK 进入 SceneTree 时存在的父级 Skeleton3D 节点。如果 SkeletonIK3D 进入 SceneTree 时父节点不是 Skeleton3D 节点,则返回 null。


bool is_running() 🔗

如果 SkeletonIK 正将 IK 效果应用到 Skeleton3D 骨骼的连续帧上,则返回 true。如果 SkeletonIK 被停止或 start 被使用时 one_time 参数被设置为 true,则返回 false


void start(one_time: bool = false) 🔗

开始将 IK 效果应用到每一帧的 Skeleton3D 骨骼,但只会在下一帧开始生效。如果 one_timetrue 则将立即生效,但仍会在下一帧重置。


void stop() 🔗

停止将 IK 效果应用到每帧的 Skeleton3D 骨骼,并调用 Skeleton3D.clear_bones_global_pose_override 来移除所有骨骼上的现有覆盖。