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.
Checking the stable version of the documentation...
IterateIK3D
继承: ChainIK3D < IKModifier3D < SkeletonModifier3D < Node3D < Node < Object
派生: CCDIK3D, FABRIK3D, JacobianIK3D
通过重复进行小幅度旋转来逐步接近目标的 SkeletonModifier3D。
描述
这是 SkeletonModifier3D 的一个基类,它通过反复进行微小的旋转来逐步逼近目标位置。
每个骨骼链(也就是每个设置项)都有一个效应器(effector),这些效应器会按照设置列表的顺序依次进行处理。你可以为每个关节设置一些限制条件。
注意: 这个类里的所有方法都带有一个 index(索引)参数。这个参数用来指定当 IK 包含多个设置项时,具体返回哪一个(比如 settings//target_node)。
属性
|
||
|
||
|
||
|
||
|
方法
get_joint_limitation(index: int, joint: int) const |
|
get_joint_limitation_right_axis(index: int, joint: int) const |
|
get_joint_limitation_right_axis_vector(index: int, joint: int) const |
|
get_joint_limitation_rotation_offset(index: int, joint: int) const |
|
get_joint_rotation_axis(index: int, joint: int) const |
|
get_joint_rotation_axis_vector(index: int, joint: int) const |
|
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 🔗
单次迭代中每根骨骼可以旋转的最大角度。
注意:该限制在每次迭代中都会应用。例如,如果 max_iterations 为 4,angular_delta_limit 为 5 度,则单帧中可能的最大旋转角度为 20 度。
如果为 false,则结果将以前一帧的 IterateIK3D 结果作为初始状态进行计算。
如果为 true,则会丢弃前一帧的 IterateIK3D 结果。此时,新的结果将以除 IterateIK3D 之外的骨骼姿势作为初始状态进行计算。这意味着只要目标位置和之前的骨骼姿势相同,结果就始终相同。但是,如果 angular_delta_limit 和 max_iterations 设置得太小,骨骼链的末端骨骼将永远无法到达目标位置。
IK 求解器用于生成更精确结果的迭代循环次数。
末端骨骼与目标位置之间的最小距离。如果距离小于此值,IK 求解器将停止进一步迭代。
设置的数量。
方法说明
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) 🔗
设置末端骨骼试图到达的目标节点。