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.

LookAtModifier3D

继承: SkeletonModifier3D < Node3D < Node < Object

LookAtModifier3D 会旋转骨骼,让它看向某个目标。

描述

SkeletonModifier3D 会旋转骨骼,让它看向某个目标。适用于让角色的头部看向玩家、让炮塔看向目标等需要让骨骼简单快速地旋转到指向某个物体的情况。

应用多个 LookAtModifier3D 时,分配给父骨骼的 LookAtModifier3D 在列表中必须放在分配给子骨骼的 LookAtModifier3D 上方,这样才能让子骨骼得到正确的结果。

属性

int

bone

-1

String

bone_name

""

float

duration

0.0

EaseType

ease_type

0

BoneAxis

forward_axis

4

int

origin_bone

String

origin_bone_name

NodePath

origin_external_node

OriginFrom

origin_from

0

Vector3

origin_offset

Vector3(0, 0, 0)

float

origin_safe_margin

0.1

float

primary_damp_threshold

float

primary_limit_angle

float

primary_negative_damp_threshold

float

primary_negative_limit_angle

float

primary_positive_damp_threshold

float

primary_positive_limit_angle

Axis

primary_rotation_axis

1

float

secondary_damp_threshold

float

secondary_limit_angle

float

secondary_negative_damp_threshold

float

secondary_negative_limit_angle

float

secondary_positive_damp_threshold

float

secondary_positive_limit_angle

bool

symmetry_limitation

NodePath

target_node

NodePath("")

TransitionType

transition_type

0

bool

use_angle_limitation

false

bool

use_secondary_rotation

true

方法

float

get_interpolation_remaining() const

bool

is_interpolating() const

bool

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,那么渲染结果会与方向不一致。


属性说明

int bone = -1 🔗

  • void set_bone(value: int)

  • int get_bone()

父级 Skeleton3Dbone_name 的索引。


String bone_name = "" 🔗

Skeleton3D 中要执行修改的骨骼名称。


float duration = 0.0 🔗

  • void set_duration(value: float)

  • float get_duration()

基于时间的插值的持续时间。插值的触发条件有:

  • 目标节点发生改变

  • 由于角度限制导致轴发生翻转

注意:翻转的时机是目标超出角度限制范围,前进向量的内部次旋转轴发生翻转。视觉上,发生的时机是目标超出角度限制范围,越过 forward_axisprimary_rotation_axis 构成的平面。


EaseType ease_type = 0 🔗

基于时间的插值的缓动类型。另见 EaseType


BoneAxis forward_axis = 4 🔗

骨骼的前进轴。该 SkeletonModifier3D 对骨骼进行的修改会让该轴指向 target_node


int origin_bone 🔗

  • void set_origin_bone(value: int)

  • int get_origin_bone()

父级 Skeleton3Dorigin_bone_name 的索引。


String origin_bone_name 🔗

  • void set_origin_bone_name(value: String)

  • String get_origin_bone_name()

如果 origin_fromORIGIN_FROM_SPECIFIC_BONE,则会将指定的骨骼全局姿势位置用作原点。


NodePath origin_external_node 🔗

  • void set_origin_external_node(value: NodePath)

  • NodePath get_origin_external_node()

如果 origin_fromORIGIN_FROM_EXTERNAL_NODE,则会将指定的 Node3D 的全局位置用作原点。


OriginFrom origin_from = 0 🔗

该值决定了计算前进向量时从哪里获取原点。


Vector3 origin_offset = Vector3(0, 0, 0) 🔗

骨骼姿势原点的偏移。通过偏移量来对齐原点常用于多个骨骼必须始终朝向同一方向的情况,例如眼球。

注意:该值表示的是 origin_from 中设置的对象的局部位置。


float origin_safe_margin = 0.1 🔗

  • void set_origin_safe_margin(value: float)

  • float get_origin_safe_margin()

如果目标经过原点的距离小于该值,即使目标在角度限制范围内,也会使用基于时间的插值,从而防止角速度过高。


float primary_damp_threshold 🔗

  • void set_primary_damp_threshold(value: float)

  • float get_primary_damp_threshold()

开始对 primary_limit_angle 执行阻尼的阈值。提供的是非线性(B 样条)插值,会使得在旋转到边缘限制时感受到更多的阻力。适用于模拟人类运动的限制。

如果为 1.0 则不执行阻尼。如果为 0.0 则始终执行阻尼。


float primary_limit_angle 🔗

  • void set_primary_limit_angle(value: float)

  • float get_primary_limit_angle()

symmetry_limitationtrue 时,主旋转的限制角度。


float primary_negative_damp_threshold 🔗

  • void set_primary_negative_damp_threshold(value: float)

  • float get_primary_negative_damp_threshold()

开始对 primary_negative_limit_angle 执行阻尼的阈值。


float primary_negative_limit_angle 🔗

  • void set_primary_negative_limit_angle(value: float)

  • float get_primary_negative_limit_angle()

symmetry_limitationfalse 时,主旋转负方向的限制角度。


float primary_positive_damp_threshold 🔗

  • void set_primary_positive_damp_threshold(value: float)

  • float get_primary_positive_damp_threshold()

开始对 primary_positive_limit_angle 执行阻尼的阈值。


float primary_positive_limit_angle 🔗

  • void set_primary_positive_limit_angle(value: float)

  • float get_primary_positive_limit_angle()

symmetry_limitationfalse 时,主旋转正方向的限制角度。


Axis primary_rotation_axis = 1 🔗

  • void set_primary_rotation_axis(value: Axis)

  • Axis get_primary_rotation_axis()

主旋转轴。该 SkeletonModifier3D 会使用欧拉角对旋转进行合成,防止围绕 forward_axis 旋转。


float secondary_damp_threshold 🔗

  • void set_secondary_damp_threshold(value: float)

  • float get_secondary_damp_threshold()

开始对 secondary_limit_angle 执行阻尼的阈值。


float secondary_limit_angle 🔗

  • void set_secondary_limit_angle(value: float)

  • float get_secondary_limit_angle()

symmetry_limitationtrue 时,次旋转的限制角度。


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 🔗

  • void set_secondary_negative_limit_angle(value: float)

  • float get_secondary_negative_limit_angle()

symmetry_limitationfalse 时,次旋转负方向的限制角度。


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 🔗

  • void set_secondary_positive_limit_angle(value: float)

  • float get_secondary_positive_limit_angle()

symmetry_limitationfalse 时,次旋转正方向的限制角度。


bool symmetry_limitation 🔗

  • void set_symmetry_limitation(value: bool)

  • bool is_limitation_symmetry()

如果 true,则限制对称地分布在骨骼两侧。

如果 false,则可以为骨骼放松时的每一侧单独指定限制。


NodePath target_node = NodePath("") 🔗

朝向修改的目标节点的 NodePath。该节点是修改时骨骼旋转的目标。


TransitionType transition_type = 0 🔗

基于时间的插值的过渡类型。另见 TransitionType


bool use_angle_limitation = false 🔗

  • void set_use_angle_limitation(value: bool)

  • bool is_using_angle_limitation()

如果为 true 则会限制旋转的角度。有助于防止角色的脖子发生 360 度旋转。

注意:AnimationTree 混合一样,插值时会优先考虑 Skeleton3D.get_bone_rest()。这意味着插值在某些情况下不会选择最短路径。

注意:某些 transition_type 可能会超出限制(例如 BackElasticSpring)。如果在超出限制时发生插值,结果可能不会遵循骨骼的放松姿势。


bool use_secondary_rotation = true 🔗

  • void set_use_secondary_rotation(value: bool)

  • bool is_using_secondary_rotation()

如果为 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 信号。