Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

SkeletonIK3D

继承: Node < Object

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

描述

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

# 在每一个新的帧上自动应用 IK 效果(不是当前的)。
skeleton_ik_node.start()

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

# 停止 IK 效果并重置骨骼上的 bones_global_pose_override
skeleton_ik_node.stop()

# 应用完整的 IK 效果
skeleton_ik_node.set_interpolation(1.0)

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

# 应用零 IK 效果(数值为 0.01 或低于 0.01 也会移除 Skeleton 上的 bones_global_pose_override)。
skeleton_ik_node.set_interpolation(0.0)

已弃用。这个类已废弃,可能在后续版本中移除。

教程

属性

float

interpolation

1.0

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 ( bool one_time=false )

void

stop ( )


属性说明

float interpolation = 1.0

  • void set_interpolation ( float value )

  • float get_interpolation ( )

IK 效果被应用于当前骨架骨骼链的程度的插值。1.0 的值将完全覆盖所有骨架骨骼变换,而 0.0 的值将在视觉上禁用 SkeletonIK。等于或低于 0.01 的值也会调用 Skeleton3D.clear_bones_global_pose_override


Vector3 magnet = Vector3(0, 0, 0)

  • void set_magnet_position ( Vector3 value )

  • Vector3 get_magnet_position ( )

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


int max_iterations = 10

  • void set_max_iterations ( int value )

  • int get_max_iterations ( )

IK解算器使用的迭代循环的数量,以产生更准确(和优雅)的骨链效果。


float min_distance = 0.01

  • void set_min_distance ( float value )

  • float get_min_distance ( )

骨骼与目标对象之间的最小距离。如果距离低于这个值,IK解算器将停止进一步的迭代。


bool override_tip_basis = true

  • void set_override_tip_basis ( bool value )

  • 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 ( bool value )

  • 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 ( bool one_time=false )

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


void stop ( )

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