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...
LookAtModifier3D
继承: SkeletonModifier3D < Node3D < Node < Object
LookAtModifier3D 会旋转骨骼,让它看向某个目标。
描述
该 SkeletonModifier3D 会旋转骨骼,让它看向某个目标。适用于让角色的头部看向玩家、让炮塔看向目标等需要让骨骼简单快速地旋转到指向某个物体的情况。
应用多个 LookAtModifier3D 时,分配给父骨骼的 LookAtModifier3D 在列表中必须放在分配给子骨骼的 LookAtModifier3D 上方,这样才能让子骨骼得到正确的结果。
属性
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
方法
get_interpolation_remaining() const |
|
is_interpolating() const |
|
is_target_within_limitation() const |
枚举
enum OriginFrom: 🔗
OriginFrom ORIGIN_FROM_SELF = 0
使用 bone 所指定骨骼的放松位置作为原点。
OriginFrom ORIGIN_FROM_SPECIFIC_BONE = 1
使用 origin_bone 所指定骨骼的全局姿势位置作为原点。
注意:除非你熟悉骨骼的处理流程,否则建议只选择父级骨骼。指定骨骼姿势在处理 LookAtModifier3D 时会用作参考。换句话说,如果你指定的是子级骨骼,而 LookAtModifier3D 导致该子级骨骼发生移动,那么渲染结果会与方向不一致。
OriginFrom ORIGIN_FROM_EXTERNAL_NODE = 2
使用 origin_external_node 所指定的 Node3D 的全局位置作为原点。
注意:与 ORIGIN_FROM_SPECIFIC_BONE 相同,如果指定的是分配了子级骨骼的 BoneAttachment3D,那么渲染结果会与方向不一致。
属性说明
父级 Skeleton3D 中 bone_name 的索引。
Skeleton3D 中要执行修改的骨骼名称。
基于时间的插值的持续时间。插值的触发条件有:
目标节点发生改变
由于角度限制导致轴发生翻转
注意:翻转的时机是目标超出角度限制范围,前进向量的内部次旋转轴发生翻转。视觉上,发生的时机是目标超出角度限制范围,越过 forward_axis 和 primary_rotation_axis 构成的平面。
基于时间的插值的缓动类型。另见 EaseType。
骨骼的前进轴。该 SkeletonModifier3D 对骨骼进行的修改会让该轴指向 target_node。
父级 Skeleton3D 中 origin_bone_name 的索引。
如果 origin_from 为 ORIGIN_FROM_SPECIFIC_BONE,则会将指定的骨骼全局姿势位置用作原点。
NodePath origin_external_node 🔗
如果 origin_from 为 ORIGIN_FROM_EXTERNAL_NODE,则会将指定的 Node3D 的全局位置用作原点。
OriginFrom origin_from = 0
🔗
void set_origin_from(value: OriginFrom)
OriginFrom get_origin_from()
该值决定了计算前进向量时从哪里获取原点。
Vector3 origin_offset = Vector3(0, 0, 0)
🔗
骨骼姿势原点的偏移。通过偏移量来对齐原点常用于多个骨骼必须始终朝向同一方向的情况,例如眼球。
注意:该值表示的是 origin_from 中设置的对象的局部位置。
float origin_safe_margin = 0.1
🔗
如果目标经过原点的距离小于该值,即使目标在角度限制范围内,也会使用基于时间的插值,从而防止角速度过高。
float primary_damp_threshold 🔗
开始对 primary_limit_angle 执行阻尼的阈值。提供的是非线性(B 样条)插值,会使得在旋转到边缘限制时感受到更多的阻力。适用于模拟人类运动的限制。
如果为 1.0
则不执行阻尼。如果为 0.0
则始终执行阻尼。
当 symmetry_limitation 为 true
时,主旋转的限制角度。
float primary_negative_damp_threshold 🔗
开始对 primary_negative_limit_angle 执行阻尼的阈值。
float primary_negative_limit_angle 🔗
当 symmetry_limitation 为 false
时,主旋转负方向的限制角度。
float primary_positive_damp_threshold 🔗
开始对 primary_positive_limit_angle 执行阻尼的阈值。
float primary_positive_limit_angle 🔗
当 symmetry_limitation 为 false
时,主旋转正方向的限制角度。
Axis primary_rotation_axis = 1
🔗
主旋转轴。该 SkeletonModifier3D 会使用欧拉角对旋转进行合成,防止围绕 forward_axis 旋转。
float secondary_damp_threshold 🔗
开始对 secondary_limit_angle 执行阻尼的阈值。
当 symmetry_limitation 为 true
时,次旋转的限制角度。
float secondary_negative_damp_threshold 🔗
void set_secondary_negative_damp_threshold(value: float)
float get_secondary_negative_damp_threshold()
开始对 secondary_negative_limit_angle 执行阻尼的阈值。
float secondary_negative_limit_angle 🔗
当 symmetry_limitation 为 false
时,次旋转负方向的限制角度。
float secondary_positive_damp_threshold 🔗
void set_secondary_positive_damp_threshold(value: float)
float get_secondary_positive_damp_threshold()
开始对 secondary_positive_limit_angle 执行阻尼的阈值。
float secondary_positive_limit_angle 🔗
当 symmetry_limitation 为 false
时,次旋转正方向的限制角度。
如果 true
,则限制对称地分布在骨骼两侧。
如果 false
,则可以为骨骼放松时的每一侧单独指定限制。
NodePath target_node = NodePath("")
🔗
朝向修改的目标节点的 NodePath。该节点是修改时骨骼旋转的目标。
TransitionType transition_type = 0
🔗
void set_transition_type(value: TransitionType)
TransitionType get_transition_type()
基于时间的插值的过渡类型。另见 TransitionType。
bool use_angle_limitation = false
🔗
如果为 true
则会限制旋转的角度。有助于防止角色的脖子发生 360 度旋转。
注意:与 AnimationTree 混合一样,插值时会优先考虑 Skeleton3D.get_bone_rest()。这意味着插值在某些情况下不会选择最短路径。
注意:某些 transition_type 可能会超出限制(例如 Back、Elastic 和 Spring)。如果在超出限制时发生插值,结果可能不会遵循骨骼的放松姿势。
bool use_secondary_rotation = true
🔗
如果为 true
就能够使用两个转轴。
方法说明
float get_interpolation_remaining() const 🔗
返回基于时间的插值的剩余秒数。
bool is_interpolating() const 🔗
返回是否正在执行基于时间的插值。如果为 true
,则等价于 get_interpolation_remaining() 为 0
。
适用于确定是否能够安全移除 LookAtModifier3D。
bool is_target_within_limitation() const 🔗
返回目标是否在角度限制范围内。适用于在目标超出角度限制范围后将 target_node 清空。
注意:该值在 SkeletonModifier3D._process_modification() 之后更新。为了获取正确的值,我们建议使用 SkeletonModifier3D.modification_processed 信号。