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.

Transform3D

代表 3D 变换的 3×4 矩阵。

描述

The Transform3D built-in Variant type is a 3×4 matrix representing a transformation in 3D space. It contains a Basis, which on its own can represent rotation, scale, and shear. Additionally, combined with its own origin, the transform can also represent a translation.

For a general introduction, see the Matrices and transforms tutorial.

Note: Godot uses a right-handed coordinate system, which is a common standard. For directions, the convention for built-in types like Camera3D is for -Z to point forward (+X is right, +Y is up, and +Z is back). Other objects may use different direction conventions. For more information, see the 3D asset direction conventions tutorial.

备注

通过 C# 使用该 API 时会有显著不同,详见 C# API 与 GDScript 的差异

教程

属性

Basis

basis

Basis(1, 0, 0, 0, 1, 0, 0, 0, 1)

Vector3

origin

Vector3(0, 0, 0)

构造函数

Transform3D

Transform3D()

Transform3D

Transform3D(from: Transform3D)

Transform3D

Transform3D(basis: Basis, origin: Vector3)

Transform3D

Transform3D(from: Projection)

Transform3D

Transform3D(x_axis: Vector3, y_axis: Vector3, z_axis: Vector3, origin: Vector3)

方法

Transform3D

affine_inverse() const

Transform3D

interpolate_with(xform: Transform3D, weight: float) const

Transform3D

inverse() const

bool

is_equal_approx(xform: Transform3D) const

bool

is_finite() const

Transform3D

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

Transform3D

orthonormalized() const

Transform3D

rotated(axis: Vector3, angle: float) const

Transform3D

rotated_local(axis: Vector3, angle: float) const

Transform3D

scaled(scale: Vector3) const

Transform3D

scaled_local(scale: Vector3) const

Transform3D

translated(offset: Vector3) const

Transform3D

translated_local(offset: Vector3) const

运算符

bool

operator !=(right: Transform3D)

AABB

operator *(right: AABB)

PackedVector3Array

operator *(right: PackedVector3Array)

Plane

operator *(right: Plane)

Transform3D

operator *(right: Transform3D)

Vector3

operator *(right: Vector3)

Transform3D

operator *(right: float)

Transform3D

operator *(right: int)

Transform3D

operator /(right: float)

Transform3D

operator /(right: int)

bool

operator ==(right: Transform3D)


常量

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

不含平移、旋转、缩放为 1 的变换。basis 等于 Basis.IDENTITY

AABBTransform3D 等其他 Variant 相乘时,不会进行任何变换。

FLIP_X = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 🔗

应用了垂直于 YZ 平面镜像操作的 Transform3D。其 basis 相当于 Basis.FLIP_X

FLIP_Y = Transform3D(1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0) 🔗

应用了垂直于 XZ 平面镜像操作的 Transform3D。其 basis 相当于 Basis.FLIP_Y

FLIP_Z = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0) 🔗

应用了垂直于 XY 平面镜像操作的 Transform3D。其 basis 相当于 Basis.FLIP_Z


属性说明

Basis basis = Basis(1, 0, 0, 0, 1, 0, 0, 0, 1) 🔗

该变换的 Basis。它由 3 个轴(Basis.xBasis.yBasis.z)组成。它们共同代表变换的旋转、缩放和错切。


Vector3 origin = Vector3(0, 0, 0) 🔗

该变换的平移偏移量。在 3D 空间中,这可以被看作是位置。


构造函数说明

Transform3D Transform3D() 🔗

构造与 IDENTITY 相同的 Transform3D


Transform3D Transform3D(from: Transform3D)

构造给定 Transform3D 的副本 Transform3D


Transform3D Transform3D(basis: Basis, origin: Vector3)

根据 BasisVector3 构造 Transform3D


Transform3D Transform3D(from: Projection)

根据 Projection 构造 Transform3D。因为 Transform3D 是 3×4 的矩阵,而 Projection 是 4×4 的矩阵,所以这个操作会削去投影矩阵的最后一行(新的变换中不包含 from.x.wfrom.y.wfrom.z.wfrom.w.w)。


Transform3D Transform3D(x_axis: Vector3, y_axis: Vector3, z_axis: Vector3, origin: Vector3)

根据四个 Vector3 值(也叫矩阵列)构造 Transform3D

前三个参数是 basis 的三个轴(Basis.xBasis.yBasis.z)。


方法说明

Transform3D affine_inverse() const 🔗

返回该变换的逆版本。与 inverse 不同,则该方法几乎适用于任何 basis,包括非均匀的,但速度较慢。另见 Basis.inverse

注意:为了使该方法正确返回,该变换的 basis 需要具有一个不完全是 0 的行列式(参见 Basis.determinant)。


Transform3D interpolate_with(xform: Transform3D, weight: float) const 🔗

返回将该变换和 xform 按照给定的权重 weight 进行线性插值结果。

weight 应该在 0.01.0(闭区间)的范围内。允许使用超出这个范围的值,表示进行外插


Transform3D inverse() const 🔗

返回该变换的逆版本。另见 Basis.inverse

注意:为了使该方法正确返回,该变换的 basis 需要是正交归一化的(请参阅 Basis.orthonormalized)。这意味着,该基应该只代表旋转。如果没有,请改用 affine_inverse


bool is_equal_approx(xform: Transform3D) const 🔗

如果通过在每个分量上运行 @GlobalScope.is_equal_approx,该变换和 xform 近似相等,则返回 true


bool is_finite() const 🔗

如果该变换是有限的,则返回 true,判断方法是在每个分量上调用 @GlobalScope.is_finite


Transform3D looking_at(target: Vector3, up: Vector3 = Vector3(0, 1, 0), use_model_front: bool = false) const 🔗

返回该变换的旋转副本,以便向前轴(-Z)指向 target 的位置。

向上的轴(+Y)在保持与向前的轴垂直的前提下,尽可能接近 up 向量。最终的变换是标准正交变换。变换中原有的旋转、缩放、偏斜信息会被丢弃。targetup 向量不能为零,不能互相平行,使用全局/父级空间。

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


Transform3D orthonormalized() const 🔗

返回该变换的副本,其 basis 已正交归一化。正交归一化的基既是正交的(轴彼此垂直)又是归一化的(轴长度为 1),这也意味着它只能代表旋转。另见 Basis.orthonormalized


Transform3D rotated(axis: Vector3, angle: float) const 🔗

返回该变换围绕给定 axis 旋转给定 angle(单位为弧度)的副本。

axis 必须为归一化的向量。

这个方法的结果和让 X 变换与相应的旋转变换 R 从左侧相乘一致,即 R * X,但进行了优化。

可以视作在全局/父级坐标系中的变换。


Transform3D rotated_local(axis: Vector3, angle: float) const 🔗

返回该变换围绕给定 axis 旋转给定 angle(单位为弧度)的副本。

axis 必须为归一化的向量。

这个方法的结果和让 X 变换与相应的旋转变换 R 从右侧相乘一致,即 R * X,但进行了优化。

可以视作在局部坐标系中的变换。


Transform3D scaled(scale: Vector3) const 🔗

返回该变换按给定的 scale 系数缩放的副本。

这个方法的结果和让 X 变换与相应的缩放变换 S 从左侧相乘一致,即 S * X,但进行了优化。

可以视作在全局/父级坐标系中的变换。


Transform3D scaled_local(scale: Vector3) const 🔗

返回该变换按给定的 scale 系数缩放的副本。

这个方法的结果和让 X 变换与相应的缩放变换 S 从右侧相乘一致,即 X * S,但进行了优化。

可以视作在局部坐标系中的变换。


Transform3D translated(offset: Vector3) const 🔗

返回该变换平移了给定 offset 的副本。

这个方法的结果和让 X 变换与相应的平移变换 T 从左侧相乘一致,即 T * X,但进行了优化。

可以视作在全局/父级坐标系中的变换。


Transform3D translated_local(offset: Vector3) const 🔗

返回该变化平移了给定 offset 的副本。

这个方法的结果和让 X 变换与相应的平移变换 T 从右侧相乘一致,即 X * T,但进行了优化。

可以视作在局部坐标系中的变换。


运算符说明

bool operator !=(right: Transform3D) 🔗

如果两个变换的分量不相等,则返回 true

注意:由于浮点精度误差,请考虑改用 is_equal_approx,这样更可靠。


AABB operator *(right: AABB) 🔗

使用该变换矩阵对 AABB 进行变换(相乘)。


PackedVector3Array operator *(right: PackedVector3Array) 🔗

由该变换矩阵变换(乘以)给定 PackedVector3Array 的每个 Vector3 元素。

在较大的数组上,该操作比单独变换每个 Vector3 要快得多。


Plane operator *(right: Plane) 🔗

使用该变换矩阵对 Plane 进行变换(相乘)。


Transform3D operator *(right: Transform3D) 🔗

right 变换来变换(乘以)该变换。

这是父级和子级 Node3D 之间执行的操作。

注意:如果你只需要修改该变换的一个属性,请考虑改用以下方法之一:


Vector3 operator *(right: Vector3) 🔗

使用该变换矩阵对 Vector3 进行变换(相乘)。


Transform3D operator *(right: float) 🔗

Transform3D 包括 origin 在内的所有分量乘以给定的 float。会均匀地影响该变换的缩放,对 basis 进行缩放。


Transform3D operator *(right: int) 🔗

Transform3D 包括 origin 在内的所有分量乘以给定的 int。会均匀地影响该变换的缩放,对 basis 进行缩放。


Transform3D operator /(right: float) 🔗

Transform3D 包括 origin 在内的所有分量除以给定的 float。会均匀地影响该变换的缩放,对 basis 进行缩放。


Transform3D operator /(right: int) 🔗

Transform3D 包括 origin 在内的所有分量除以给定的 int。会均匀地影响该变换的缩放,对 basis 进行缩放。


bool operator ==(right: Transform3D) 🔗

如果两个变换的分量完全相等,则返回 true

注意:由于浮点精度误差,请考虑改用 is_equal_approx,这样更可靠。