Transform3D
代表 3D 变换的 3×4 矩阵。
描述
Transform3D 即 3D 变换,是一种内置的 Variant 类型,这种 3×4 矩阵代表的是 3D 空间中的变换。变换中包含了一个 Basis,表示的是旋转、缩放、倾斜。另外变换自身还提供了 origin,这样就能够表示平移。
通用的介绍见教程《矩阵和变换》。
注意:Godot 使用右手坐标系,这是一种普遍标准。方向方面,Camera3D 等内置类型的约定是 -Z 指向前方(+X 为右、+Y 为上、+Z 为后)。其他对象可能使用不同的方向约定。更多信息见教程《3D 资产方向约定》。
备注
通过 C# 使用该 API 时会有显著不同,详见 C# API 与 GDScript 的差异。
教程
属性
|
||
|
构造函数
Transform3D(from: Transform3D) |
|
Transform3D(basis: Basis, origin: Vector3) |
|
Transform3D(from: Projection) |
|
Transform3D(x_axis: Vector3, y_axis: Vector3, z_axis: Vector3, origin: Vector3) |
方法
affine_inverse() const |
|
interpolate_with(xform: Transform3D, weight: float) const |
|
inverse() const |
|
is_equal_approx(xform: Transform3D) const |
|
is_finite() const |
|
looking_at(target: Vector3, up: Vector3 = Vector3(0, 1, 0), use_model_front: bool = false) const |
|
orthonormalized() const |
|
rotated_local(axis: Vector3, angle: float) const |
|
scaled_local(scale: Vector3) const |
|
translated(offset: Vector3) const |
|
translated_local(offset: Vector3) const |
运算符
operator !=(right: Transform3D) |
|
operator *(right: AABB) |
|
operator *(right: PackedVector3Array) |
|
operator *(right: Plane) |
|
operator *(right: Transform3D) |
|
operator *(right: Vector3) |
|
operator *(right: float) |
|
operator *(right: int) |
|
operator /(right: float) |
|
operator /(right: int) |
|
operator ==(right: Transform3D) |
常量
IDENTITY = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 🔗
单位 Transform3D。这是一个没有平移和旋转的变换,缩放为 Vector3.ONE。basis 等于 Basis.IDENTITY。这意味着:
Basis.x 指向右侧(Vector3.RIGHT);
Basis.y 指向上方(Vector3.UP);
Basis.z 指向后方(Vector3.BACK)。
var transform = Transform3D.IDENTITY
var basis = transform.basis
print("| X | Y | Z | 原点")
print("| %.f | %.f | %.f | %.f" % [basis.x.x, basis.y.x, basis.z.x, transform.origin.x])
print("| %.f | %.f | %.f | %.f" % [basis.x.y, basis.y.y, basis.z.y, transform.origin.y])
print("| %.f | %.f | %.f | %.f" % [basis.x.z, basis.y.z, basis.z.z, transform.origin.z])
# 输出:
# | X | Y | Z | 原点
# | 1 | 0 | 0 | 0
# | 0 | 1 | 0 | 0
# | 0 | 0 | 1 | 0
如果使用该常量变换(相乘)Vector3、AABB、Plane、PackedVector3Array 或其他 Transform3D,则不会发生变换。
注意:在 GDScript 中,该常量与不带任何参数创建 Transform3D 相同。使用该常量可以让你的代码更清晰,并与 C# 保持一致。
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.x、Basis.y 和 Basis.z)组成。它们共同代表变换的旋转、缩放和倾斜。
Vector3 origin = Vector3(0, 0, 0) 🔗
该变换的平移偏移量。在 3D 空间中,这可以被看作是位置。
构造函数说明
Transform3D Transform3D() 🔗
构造与 IDENTITY 相同的 Transform3D。
注意:在 C# 中构造的 Transform3D 的 origin 和 basis 的所有分量都为 Vector3.ZERO。
Transform3D Transform3D(from: Transform3D)
构造给定 Transform3D 的副本 Transform3D。
Transform3D Transform3D(basis: Basis, origin: Vector3)
根据 Basis 和 Vector3 构造 Transform3D。
Transform3D Transform3D(from: Projection)
根据 Projection 构造 Transform3D。因为 Transform3D 是 3×4 的矩阵,而 Projection 是 4×4 的矩阵,所以这个操作会削去投影矩阵的最后一行(新的变换中不包含 from.x.w、from.y.w、from.z.w、from.w.w)。
Transform3D Transform3D(x_axis: Vector3, y_axis: Vector3, z_axis: Vector3, origin: Vector3)
根据四个 Vector3 值(也叫矩阵列)构造 Transform3D。
方法说明
Transform3D affine_inverse() const 🔗
返回该变换的逆版本。与 inverse() 不同,则该方法几乎适用于任何 basis,包括非均匀的,但速度较慢。另见 Basis.inverse()。
注意:为了使该方法正确返回,该变换的 basis 需要具有一个不完全是 0.0 的行列式(见 Basis.determinant())。
Transform3D interpolate_with(xform: Transform3D, weight: float) const 🔗
返回将该变换和 xform 按照给定的权重 weight 进行线性插值结果。
weight 应该在 0.0 到 1.0(闭区间)的范围内。允许使用超出这个范围的值,表示进行外插。
Transform3D inverse() const 🔗
返回该变换的逆版本。另见 Basis.inverse()。
注意:为了使该方法正确返回,该变换的基需要是正交归一化的(见 orthonormalized())。这意味着该基应该只代表旋转。如果不是,请改用 affine_inverse()。
bool is_equal_approx(xform: Transform3D) const 🔗
如果通过在每个分量上运行 @GlobalScope.is_equal_approx(),该变换和 xform 近似相等,则返回 true。
如果该变换是有限的,则返回 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 向量。最终的变换是标准正交变换。变换中原有的旋转、缩放、偏斜信息会被丢弃。target 和 up 向量不能为零,不能互相平行,使用全局/父级空间。
如果 use_model_front 为 true,则会将 +Z 轴(资产正面)作为向前的轴(此时 +X 为左),指向 target 的位置。默认情况下会将 -Z 轴(相机前方)作为向前的轴(此时 +X 为右)。
Transform3D orthonormalized() const 🔗
返回该变换的副本,其 basis 已正交归一化。正交归一化的基既是正交的(轴彼此垂直)又是归一化的(轴长度为 1.0),这也意味着它只能代表旋转。另见 Basis.orthonormalized()。
Transform3D rotated(axis: Vector3, angle: float) const 🔗
返回该变换围绕给定 axis 旋转给定 angle(单位为弧度)的副本。
axis 必须为归一化的向量(见 Vector3.normalized())。如果 angle 为正数,则基会围绕轴进行逆时针旋转。
这个方法的结果和让 X 变换与相应的旋转变换 R 从左侧相乘一致,即 R * X,但进行了优化。
可以视作在全局/父级坐标系中的变换。
Transform3D rotated_local(axis: Vector3, angle: float) const 🔗
返回该变换围绕给定 axis 旋转给定 angle(单位为弧度)的副本。
axis 必须为归一化的向量,使用变换的局部坐标系。例如,要围绕局部 X 轴旋转请使用 Vector3.RIGHT。
这个方法的结果和让 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 之间执行的操作。
注意:如果你只需要修改该变换的一个属性,请考虑改用以下方法之一:
对于平移,请参阅 translated() 或 translated_local()。
对于旋转,请参阅 rotated() 或 rotated_local()。
对于缩放,请参阅 scaled() 或 scaled_local()。
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(),这样更可靠。