Node3D

继承: Node < Object

派生: AudioListener3D, AudioStreamPlayer3D, BoneAttachment3D, Camera3D, CollisionObject3D, CollisionPolygon3D, CollisionShape3D, GridMap, ImporterMeshInstance3D, Joint3D, LightmapProbe, Marker3D, NavigationLink3D, NavigationObstacle3D, NavigationRegion3D, OpenXRCompositionLayer, OpenXRHand, OpenXRRenderModel, OpenXRRenderModelManager, Path3D, PathFollow3D, RayCast3D, RemoteTransform3D, ShapeCast3D, Skeleton3D, SkeletonModifier3D, SpringArm3D, SpringBoneCollision3D, VehicleWheel3D, VisualInstance3D, XRFaceModifier3D, XRNode3D, XROrigin3D

3D 空间中的基础对象,所有 3D 节点都会继承。

描述

Node3D 节点是对位于 3D 空间中的节点基础表示,所有其他 3D 节点都继承自该类。

除非该 Node3Dtop_leveltrue,仿射操作(旋转、缩放、平移)的计算都使用相对于父节点的坐标系。在这一坐标系中,放射操作对应于该 Node3Dtransform 的直接仿射运算。术语父空间指的就是这个坐标系。附加到 Node3D 本身的坐标系被称为对象本地坐标系,即局部空间

注意:除非另行说明,所有需要提供角度参数的方法收到的角度都必须以弧度为单位。请使用 @GlobalScope.deg_to_rad() 将度数转换为弧度。

注意:Godot 3 及更早版本中,Node3D 的名字叫 Spatial(空间节点)。

教程

属性

Basis

basis

Basis

global_basis

Vector3

global_position

Vector3

global_rotation

Vector3

global_rotation_degrees

Transform3D

global_transform

Vector3

position

Vector3(0, 0, 0)

Quaternion

quaternion

Vector3

rotation

Vector3(0, 0, 0)

Vector3

rotation_degrees

RotationEditMode

rotation_edit_mode

0

EulerOrder

rotation_order

2

Vector3

scale

Vector3(1, 1, 1)

bool

top_level

false

Transform3D

transform

Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)

NodePath

visibility_parent

NodePath("")

bool

visible

true

方法

void

add_gizmo(gizmo: Node3DGizmo)

void

clear_gizmos()

void

clear_subgizmo_selection()

void

force_update_transform()

Array[Node3DGizmo]

get_gizmos() const

Transform3D

get_global_transform_interpolated()

Node3D

get_parent_node_3d() const

World3D

get_world_3d() const

void

global_rotate(axis: Vector3, angle: float)

void

global_scale(scale: Vector3)

void

global_translate(offset: Vector3)

void

hide()

bool

is_local_transform_notification_enabled() const

bool

is_scale_disabled() const

bool

is_transform_notification_enabled() const

bool

is_visible_in_tree() const

void

look_at(target: Vector3, up: Vector3 = Vector3(0, 1, 0), use_model_front: bool = false)

void

look_at_from_position(position: Vector3, target: Vector3, up: Vector3 = Vector3(0, 1, 0), use_model_front: bool = false)

void

orthonormalize()

void

rotate(axis: Vector3, angle: float)

void

rotate_object_local(axis: Vector3, angle: float)

void

rotate_x(angle: float)

void

rotate_y(angle: float)

void

rotate_z(angle: float)

void

scale_object_local(scale: Vector3)

void

set_disable_scale(disable: bool)

void

set_identity()

void

set_ignore_transform_notification(enabled: bool)

void

set_notify_local_transform(enable: bool)

void

set_notify_transform(enable: bool)

void

set_subgizmo_selection(gizmo: Node3DGizmo, id: int, transform: Transform3D)

void

show()

Vector3

to_global(local_point: Vector3) const

Vector3

to_local(global_point: Vector3) const

void

translate(offset: Vector3)

void

translate_object_local(offset: Vector3)

void

update_gizmos()


信号

visibility_changed() 🔗

该节点的可见性发生改变时发出(见 visibleis_visible_in_tree())。

这个信号会在相关的 NOTIFICATION_VISIBILITY_CHANGED 通知之后触发。


枚举

enum RotationEditMode: 🔗

RotationEditMode ROTATION_EDIT_MODE_EULER = 0

旋转量以 Vector3 欧拉角的形式编辑。

RotationEditMode ROTATION_EDIT_MODE_QUATERNION = 1

旋转量以 Quaternion 的形式编辑。

RotationEditMode ROTATION_EDIT_MODE_BASIS = 2

旋转量以 Basis 的形式编辑。该模式下可以自由修改 basis 的轴,但 scale 属性不可用。


常量

NOTIFICATION_TRANSFORM_CHANGED = 2000 🔗

如果 is_transform_notification_enabled()true,该节点的 global_transform 发生改变时收到的通知。另见 set_notify_transform()

注意:VisualInstance3DCollisionObject3D 等大多数 3D 节点都会自动启用,从而正常工作。

注意:在编辑器中,如果节点附加了小工具,就会将该通知传播给子节点(见 add_gizmo())。

NOTIFICATION_ENTER_WORLD = 41 🔗

当该节点注册至新 World3D 时收到的通知(见 get_world_3d())。

NOTIFICATION_EXIT_WORLD = 42 🔗

当该节点从当前 World3D 中注销时收到的通知(见 get_world_3d())。

该通知会以反向顺序发送。

NOTIFICATION_VISIBILITY_CHANGED = 43 🔗

节点的可见性发生改变时收到的通知(见 visibleis_visible_in_tree())。

该通知会在相关 visibility_changed 信号之前收到。

NOTIFICATION_LOCAL_TRANSFORM_CHANGED = 44 🔗

如果 is_local_transform_notification_enabled()true,该节点的 transform 发生改变时收到的通知。父级 Node3D 节点的 transform 发生改变时不会受到该通知。另见 set_notify_local_transform()

注意:CSGShape3DCollisionShape3D 等部分节点会自动启用,从而正常工作。


属性说明

Basis basis 🔗

transform 属性的基。代表该节点在父空间中的旋转、缩放、倾斜(相对于父节点)。


Basis global_basis 🔗

  • void set_global_basis(value: Basis)

  • Basis get_global_basis()

global_transform 属性的基。代表该节点在全局空间中的旋转、缩放、倾斜(相对于世界)。

注意:如果该节点不在树中,则获取该属性会失败并返回 Basis.IDENTITY


Vector3 global_position 🔗

  • void set_global_position(value: Vector3)

  • Vector3 get_global_position()

该节点的全局位置(平移),使用全局空间(相对于世界)。等价于 global_transformTransform3D.origin

注意:如果该节点不在树中,则获取该属性会失败并返回 Vector3.ZERO


Vector3 global_rotation 🔗

  • void set_global_rotation(value: Vector3)

  • Vector3 get_global_rotation()

该节点的全局旋转欧拉角,单位为弧度,使用全局空间(相对于世界)。该值获取自 global_basis 的旋转。

  • Vector3.x 包含围绕全局 X 轴的角度(俯仰)。

  • Vector3.y 包含围绕全局 Y 轴的角度(偏摆)。

  • Vector3.z 包含围绕全局 Z 轴的角度(翻滚)。

注意:rotation 不同,该属性始终使用 YXZ 约定(@GlobalScope.EULER_ORDER_YXZ)。

注意:如果该节点不在树中,则获取该属性会失败并返回 Vector3.ZERO


Vector3 global_rotation_degrees 🔗

  • void set_global_rotation_degrees(value: Vector3)

  • Vector3 get_global_rotation_degrees()

该节点的 global_rotation,但单位为角度而非弧度。

注意:如果该节点不在树中,则获取该属性会失败并返回 Vector3.ZERO


Transform3D global_transform 🔗

该节点的变换,使用全局空间(相对于世界)。包含并代表该节点的 global_positionglobal_rotation 以及全局缩放。

注意:如果该节点不在树中,则获取该属性会失败并返回 Transform3D.IDENTITY


Vector3 position = Vector3(0, 0, 0) 🔗

该节点的位置(平移),使用父空间(相对于父节点)。等价于 transformTransform3D.origin


Quaternion quaternion 🔗

该节点的旋转,以父空间中的四元数 Quaternion 的形式显示(相对于父节点)。该值获取自 basis 的旋转。

注意:四元数更适合 3D 数学运算,但相对不那么直观。设置该属性可能适用于插值(见 Quaternion.slerp())。


Vector3 rotation = Vector3(0, 0, 0) 🔗

该节点的旋转欧拉角,单位为弧度,使用父空间(相对于父节点)。该值获取自 basis 的旋转。

  • Vector3.x 包含围绕局部 X 轴的角度(俯仰)。

  • Vector3.y 包含围绕局部 Y 轴的角度(偏摆)。

  • Vector3.z 包含围绕局部 Z 轴的角度(翻滚)。

连续旋转的顺序可以通过 rotation_order 修改(见 EulerOrder 常量)。默认使用 YXZ 约定(@GlobalScope.EULER_ORDER_YXZ)。

注意:该属性在检查器中以度数为单位进行编辑。如果你想要在脚本中使用度数,请使用 rotation_degrees


Vector3 rotation_degrees 🔗

  • void set_rotation_degrees(value: Vector3)

  • Vector3 get_rotation_degrees()

该节点的 rotation,但单位为角度而非弧度。

注意:不是检查器面板中的那个属性。


RotationEditMode rotation_edit_mode = 0 🔗

该节点的旋转和缩放在检查器面板中的显示方式。


EulerOrder rotation_order = 2 🔗

rotation 属性的轴旋转顺序。最终的朝向是通过按此处指定的顺序对局部 X 轴、局部 Y 轴、局部 Z 轴进行旋转来计算的。


Vector3 scale = Vector3(1, 1, 1) 🔗

该节点的缩放,使用局部空间(相对于该节点)。该值获取自 basis 的缩放。

注意:部分 3D 节点类型的行为不受该属性的影响。例如 Light3DCamera3DAudioStreamPlayer3D 等。

警告:各缩放分量的正负必须一致,并且不能完全等于 0.0。否则无法从 basis 获取该缩放值,可能导致所需的缩放在从磁盘重新加载后丢失,以及其他潜在的不稳定行为。


bool top_level = false 🔗

  • void set_as_top_level(value: bool)

  • bool is_set_as_top_level()

如果为 true,则该节点不会继承其父节点的变换。因此,节点的变换只会在全局空间中进行,同时也意味着 global_transformtransform 完全一致。


Transform3D transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 🔗

该节点的局部变换,使用父空间(相对于父节点)。包含并代表该节点的 positionrotation 以及 scale


NodePath visibility_parent = NodePath("") 🔗

该节点及其子级的可见性范围父级。可见性父级必须是一个 GeometryInstance3D

仅当可见性父级节点(及其所有可见性祖级节点)因为与相机的距离比其自身 GeometryInstance3D.visibility_range_begin 更近而被隐藏时,视觉实例才会可见。通过 visible 属性隐藏的节点,可以看作被从可见性依赖树中移除,因此依赖实例不会考虑隐藏节点或其祖级节点。


bool visible = true 🔗

  • void set_visible(value: bool)

  • bool is_visible()

如果为 true,则该节点能否显示。只有当所有祖先节点都是可见的时候,这个节点才可见。换句话说,is_visible_in_tree() 必须返回 true


方法说明

void add_gizmo(gizmo: Node3DGizmo) 🔗

将小工具 gizmo 附加至该节点。仅在编辑器中有效。

注意:gizmo 应为 EditorNode3DGizmo。参数类型使用 Node3DGizmo 是为了避免在 Node3D 中对编辑器类产生依赖。


void clear_gizmos() 🔗

清空所有附加到该节点的 EditorNode3DGizmo 对象。仅在编辑器中生效。


void clear_subgizmo_selection() 🔗

取消选中该节点的所有子小工具。适用于选中的子小工具在属性发生改变后不再存在的情况。仅在编辑器中有效。


void force_update_transform() 🔗

发送 NOTIFICATION_TRANSFORM_CHANGED,强制更新该节点的 global_transform。如果该节点不在树中则失败。

注意:出于性能原因,变换的更改通常会累积到一帧的末尾进行单次应用。更新还会传播至 Node3D 子节点。因此,请仅在需要最新变换时使用该方法(例如在物理操作期间)。


Array[Node3DGizmo] get_gizmos() const 🔗

返回附加于该节点的所有 EditorNode3DGizmo 对象。仅在编辑器中有效。


Transform3D get_global_transform_interpolated() 🔗

使用物理插值时,你可能会想要了解节点插值后(显示)的变换而不是标准变换(标准变换可能仅在最近的物理周期中准确)。

如果是在 Node._process() 中进行的基于帧的操作,而不是在 Node._physics_process() 中进行,这一点就尤为重要。例如让 Camera3D 聚焦某个节点,或在帧中而不是在物理周期中找到激光发射的位置。

注意:第一次对 Node2D 调用该函数时会产生插值跳跃,重置物理插值后也会产生这样的现象。如果在最初跟随 Node3D 时遇到“拖影”问题,请确保在重置 Node3D 的物理插值之前至少调用一次 get_global_transform_interpolated()


Node3D get_parent_node_3d() const 🔗

返回直接对该节点的 global_transform 产生影响的父级 Node3D 节点。如果不存在父节点、父节点不是 Node3Dtop_leveltrue 则返回 null

注意:该方法并不总是等价于 Node.get_parent(),后者不会考虑 top_level


World3D get_world_3d() const 🔗

返回该节点注册到的 World3D

通常与该节点视口的世界一致(见 Node.get_viewport()Viewport.find_world_3d())。


void global_rotate(axis: Vector3, angle: float) 🔗

将该节点的 global_basis 绕全局轴 axis 旋转,旋转弧度为 angle。该操作所涉及的计算在全局空间中进行(相对于世界),global_position 保持不变。


void global_scale(scale: Vector3) 🔗

使用 scale 中给定的缩放系数对该节点的 global_basis 进行缩放。该操作所设计的计算在全局空间中进行(相对于世界),global_position 保持不变。

注意:请勿将该方法与 scale 属性混淆。


void global_translate(offset: Vector3) 🔗

向该节点的 global_position 添加 offset 中指定的全局空间平移偏移量(相对于世界)。


void hide() 🔗

阻止渲染该节点。等价于将 visible 设置为 false。该方法与 show() 相对。


bool is_local_transform_notification_enabled() const 🔗

如果该节点会在 transform 改变时收到 NOTIFICATION_LOCAL_TRANSFORM_CHANGED 则返回 true。可以通过 set_notify_local_transform() 启用这一行为。


bool is_scale_disabled() const 🔗

如果该节点的 global_transform 会自动进行正交归一化,则返回 true。正交归一化的节点不会变形,效果与全局缩放为 Vector3.ONE(或对应的负值)一致。另见 is_scale_disabled()orthonormalize()

注意:该设置不影响 transform


bool is_transform_notification_enabled() const 🔗

如果该节点会在 global_transform 改变时收到 NOTIFICATION_TRANSFORM_CHANGED 则返回 true。可以通过 set_notify_transform() 启用这一行为。


bool is_visible_in_tree() const 🔗

如果该节点位于场景树中且该节点及其所有连续的 Node3D 祖先节点的 visible 属性均为 true,则返回 true。其他类型的祖先节点(例如 NodeNode2D)都会打断连续。另见 Node.get_parent()

注意:该方法无法考虑 VisualInstance3D.layers,因此即便该方法返回 true,也可能不渲染该节点。


void look_at(target: Vector3, up: Vector3 = Vector3(0, 1, 0), use_model_front: bool = false) 🔗

旋转该节点,让局部向前的轴(-Z,Vector3.FORWARD)指向 target 的位置。该操作所涉及的运算在全局空间中进行(相对于世界)。

局部向上的轴(+Y)在保持与局部向前的轴垂直的前提下,尽可能接近 up 向量。最终的变换是正交变换,并且保留了原有缩放。非统一缩放可能无法正常工作。

target 位置不能和该节点的位置相同,up 向量不能为 Vector3.ZERO。此外,节点位置到 target 位置的方向不能与 up 向量平行,这样可以避免围绕局部 Z 轴发生预料之外的旋转。

如果 use_model_fronttrue,则会将 +Z 轴(资产正面)作为向前的轴(此时 +X 为左),指向 target 的位置。默认情况下会将 -Z 轴(相机前方)作为向前的轴(此时 +X 为右)。

注意:如果该节点不在场景树中,则该方法失败。必要时请改用 look_at_from_position()


void look_at_from_position(position: Vector3, target: Vector3, up: Vector3 = Vector3(0, 1, 0), use_model_front: bool = false) 🔗

将该节点移动到 position 位置,然后旋转至指向 target 位置,类似于 look_at()。操作发生在全局空间中(相对于世界)。


void orthonormalize() 🔗

将该节点的 basis 进行正交归一化。该方法会将该节点的 scale 设置为 Vector3.ONE(或对应的负值),保持 positionrotation 不变。另见 Transform3D.orthonormalized()


void rotate(axis: Vector3, angle: float) 🔗

将节点的 basisaxis 轴旋转,旋转角 angle 的单位为弧度。该操作在父空间中进行计算(相对于父节点),position 保持不变。


void rotate_object_local(axis: Vector3, angle: float) 🔗

将节点的 basisaxis 轴旋转,旋转角 angle 的单位为弧度。该操作在局部空间中进行计算(相对于该节点),position 保持不变。


void rotate_x(angle: float) 🔗

将节点的 basis 绕 X 轴旋转,旋转角 angle 的单位为弧度。该操作在父空间中进行计算(相对于父节点),position 保持不变。


void rotate_y(angle: float) 🔗

将节点的 basis 绕 Y 轴旋转,旋转角 angle 的单位为弧度。该操作在父空间中进行计算(相对于父节点),position 保持不变。


void rotate_z(angle: float) 🔗

将节点的 basis 绕 Z 轴旋转,旋转角 angle 的单位为弧度。该操作在父空间中进行计算(相对于父节点),position 保持不变。


void scale_object_local(scale: Vector3) 🔗

将节点的 basis 进行缩放,缩放系数为 scale。该操作在局部空间中进行计算(相对于该节点),position 保持不变。


void set_disable_scale(disable: bool) 🔗

如果为 true,则该节点的 global_transform 会自动进行正交归一化。正交归一化的节点不会变形,效果与全局缩放为 Vector3.ONE(或对应的负值)一致。另见 is_scale_disabled()orthonormalize()

注意:该设置不影响 transform


void set_identity() 🔗

将该节点的 transform 设置为 Transform3D.IDENTITY,会重置父空间中的所有变换(positionrotationscale)。


void set_ignore_transform_notification(enabled: bool) 🔗

如果为 true,则该节点不会收到 NOTIFICATION_TRANSFORM_CHANGEDNOTIFICATION_LOCAL_TRANSFORM_CHANGED

适用于在处理这些通知时阻止无限递归。


void set_notify_local_transform(enable: bool) 🔗

如果为 true,则该节点会在 transform 发生变化时收到 NOTIFICATION_LOCAL_TRANSFORM_CHANGED

注意:CSGShape3DCollisionShape3D 等部分 3D 节点会自动启用,从而正常工作。


void set_notify_transform(enable: bool) 🔗

如果为 true,则该节点会在 global_transform 发生变化时收到 NOTIFICATION_TRANSFORM_CHANGED

注意:VisualInstance3DCollisionObject3D 等大多数 3D 节点会自动启用,从而正常工作。

注意:在编辑器中,如果节点附加了小工具,就会将该通知传播给子节点(见 add_gizmo())。


void set_subgizmo_selection(gizmo: Node3DGizmo, id: int, transform: Transform3D) 🔗

选中小工具 gizmo 的 ID 为 id 的子小工具,并设置其变换。仅在编辑器中有效。

注意:小工具对象通常是 EditorNode3DGizmo 的实例,但参数类型保持通用以避免在 Node3D 中创建对编辑器类的依赖。


void show() 🔗

允许渲染该节点。等价于将 visible 设置为 true。该方法与 hide() 相对。


Vector3 to_global(local_point: Vector3) const 🔗

返回将 local_point 从该节点的局部空间转换至全局空间的结果。该方法与 to_local() 相对。


Vector3 to_local(global_point: Vector3) const 🔗

返回将 global_point 从全局空间转换至该节点的局部空间的结果。该方法与 to_global() 相对。


void translate(offset: Vector3) 🔗

向该节点的位置添加平移偏移量 offset,使用局部空间(相对于该节点)。

注意:请优先使用 translate_object_local(),因为本方法可能在后续版本中发生改变。

注意:该操作所涉及的运算不是在父空间中进行的,这与该方法的命名方式不一致是处于兼容考虑。要在父空间中进行平移请向 position 添加 offsetnode_3d.position += offset)。


void translate_object_local(offset: Vector3) 🔗

向该节点的位置添加平移偏移量 offset,使用局部空间(相对于该节点)。


void update_gizmos() 🔗

更新附加于该节点的所有 EditorNode3DGizmo 小工具。仅在编辑器中有效。