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.

IterateIK3D

继承: ChainIK3D < IKModifier3D < SkeletonModifier3D < Node3D < Node < Object

派生: CCDIK3D, FABRIK3D, JacobianIK3D

通过重复进行小幅度旋转来逐步接近目标的 SkeletonModifier3D

描述

这是 SkeletonModifier3D 的一个基类,它通过反复进行微小的旋转来逐步逼近目标位置。

每个骨骼链(也就是每个设置项)都有一个效应器(effector),这些效应器会按照设置列表的顺序依次进行处理。你可以为每个关节设置一些限制条件。

注意: 这个类里的所有方法都带有一个 index(索引)参数。这个参数用来指定当 IK 包含多个设置项时,具体返回哪一个(比如 settings//target_node)。

属性

float

angular_delta_limit

0.034906585

bool

deterministic

false

int

max_iterations

4

float

min_distance

0.001

int

setting_count

0

方法

JointLimitation3D

get_joint_limitation(index: int, joint: int) const

SecondaryDirection

get_joint_limitation_right_axis(index: int, joint: int) const

Vector3

get_joint_limitation_right_axis_vector(index: int, joint: int) const

Quaternion

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

NodePath

get_target_node(index: int) const

void

set_joint_limitation(index: int, joint: int, limitation: JointLimitation3D)

void

set_joint_limitation_right_axis(index: int, joint: int, direction: SecondaryDirection)

void

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

void

set_joint_limitation_rotation_offset(index: int, joint: int, offset: Quaternion)

void

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

void

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

void

set_target_node(index: int, target_node: NodePath)


属性说明

float angular_delta_limit = 0.034906585 🔗

  • void set_angular_delta_limit(value: float)

  • float get_angular_delta_limit()

单次迭代中每根骨骼可以旋转的最大角度。

注意:该限制在每次迭代中都会应用。例如,如果 max_iterations4angular_delta_limit5 度,则单帧中可能的最大旋转角度为 20 度。


bool deterministic = false 🔗

  • void set_deterministic(value: bool)

  • bool is_deterministic()

如果为 false,则结果将以前一帧的 IterateIK3D 结果作为初始状态进行计算。

如果为 true,则会丢弃前一帧的 IterateIK3D 结果。此时,新的结果将以除 IterateIK3D 之外的骨骼姿势作为初始状态进行计算。这意味着只要目标位置和之前的骨骼姿势相同,结果就始终相同。但是,如果 angular_delta_limitmax_iterations 设置得太小,骨骼链的末端骨骼将永远无法到达目标位置。


int max_iterations = 4 🔗

  • void set_max_iterations(value: int)

  • int get_max_iterations()

IK 求解器用于生成更精确结果的迭代循环次数。


float min_distance = 0.001 🔗

  • void set_min_distance(value: float)

  • float get_min_distance()

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


int setting_count = 0 🔗

  • void set_setting_count(value: int)

  • int get_setting_count()

设置的数量。


方法说明

JointLimitation3D get_joint_limitation(index: int, joint: int) const 🔗

返回骨骼链关节列表中 joint 的关节限制。


SecondaryDirection get_joint_limitation_right_axis(index: int, joint: int) const 🔗

返回骨骼链关节列表中 joint 处的关节限制右轴。


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

返回骨骼链关节列表中 joint 处关节的右轴限制向量。

如果 get_joint_limitation_right_axis()SkeletonModifier3D.SECONDARY_DIRECTION_NONE,则该方法返回 Vector3(0, 0, 0)


Quaternion get_joint_limitation_rotation_offset(index: int, joint: int) const 🔗

返回骨骼链关节列表中,指定 joint(关节)处的关节限制旋转偏移量。

该旋转是在局部空间中进行的,这个局部空间的构建规则如下:以骨骼的朝向(通常是从父节点指向子节点)作为 +Y 轴,以 get_joint_limitation_right_axis_vector() 作为 +X 轴。

如果 +X 轴和 +Y 轴不垂直(正交),系统会自动修改 +X 轴,使其与 +Y 轴保持垂直。

此外,如果 get_joint_limitation_right_axis_vector() 的长度为零,系统会通过“最短弧”旋转的方式,将参考姿态(reference pose)中原本的 +Y 轴旋转至与当前骨骼朝向一致,以此构建出该局部空间。

这里的“参考姿态”,指的是在处理 IK(反向运动学)之前的那一瞬间的骨骼姿态。


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)


NodePath get_target_node(index: int) const 🔗

返回末端骨骼试图到达的目标节点。


void set_joint_limitation(index: int, joint: int, limitation: JointLimitation3D) 🔗

设置骨骼链关节列表中 joint 处的关节限制。


void set_joint_limitation_right_axis(index: int, joint: int, direction: SecondaryDirection) 🔗

设置骨骼链关节列表中 joint 处的关节限制右轴。


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

设置骨骼链关节列表中 joint 处的可选关节限制右轴向量。


void set_joint_limitation_rotation_offset(index: int, joint: int, offset: Quaternion) 🔗

设置骨骼链关节列表中,指定 joint(关节)处的关节限制旋转偏移量。

旋转是在局部空间中进行的,这个局部空间的构建规则如下:以骨骼的朝向(通常是从父节点指向子节点)作为 +Y 轴,以 get_joint_limitation_right_axis_vector() 作为 +X 轴。

如果 +X 轴和 +Y 轴不垂直(正交),系统会自动修改 +X 轴,使其与 +Y 轴保持垂直。

此外,如果 get_joint_limitation_right_axis_vector() 的长度为零,系统会通过“最短弧”旋转的方式,将参考姿态(reference pose)中原本的 +Y 轴旋转至与当前骨骼朝向一致,以此构建出该局部空间。

这里的“参考姿态”,指的是在处理 IK(反向运动学)之前的那一瞬间的骨骼姿态。


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

设置骨骼链关节列表中,指定 joint(关节)处的旋转轴。

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

在这里,“参考姿态”指的是在处理 IK(反向运动学)之前的那一瞬间的骨骼姿态。

注意: 旋转轴和前进向量(forward vector)不应该共线(即不能在同一条直线上),否则会导致意外的旋转,因为 ChainIK3D 并不会计算扭力(twisting forces)。


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

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

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

如果向量长度为 0,则被视为等同于 SkeletonModifier3D.ROTATION_AXIS_ALL


void set_target_node(index: int, target_node: NodePath) 🔗

设置末端骨骼试图到达的目标节点。