Transform2D

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

描述

Transform2D 内置 Variant 类型是一个 2×3 矩阵,表示 2D 空间中的变换。它包含三个 Vector2 值:xyorigin。它们一起可以表示平移、旋转、缩放和倾斜。

xy 轴形成一个 2×2 矩阵,称为该变换的。每个轴的长度(Vector2.length())会影响该变换的缩放,而所有轴的方向会影响旋转。通常,两个轴彼此垂直。但是,当单独旋转一个轴时,变换会变得倾斜。将倾斜变换应用于 2D 精灵会使精灵看起来扭曲。

有关一般介绍,请参阅《矩阵和变换》教程。

注意:Transform3D 不同,没有与 Basis 类型等效的 2D 类型。所有提及的“基”均指 Transform2Dxy 分量。

备注

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

教程

属性

Vector2

origin

Vector2(0, 0)

Vector2

x

Vector2(1, 0)

Vector2

y

Vector2(0, 1)

构造函数

Transform2D

Transform2D()

Transform2D

Transform2D(from: Transform2D)

Transform2D

Transform2D(rotation: float, position: Vector2)

Transform2D

Transform2D(rotation: float, scale: Vector2, skew: float, position: Vector2)

Transform2D

Transform2D(x_axis: Vector2, y_axis: Vector2, origin: Vector2)

方法

Transform2D

affine_inverse() const

Vector2

basis_xform(v: Vector2) const

Vector2

basis_xform_inv(v: Vector2) const

float

determinant() const

Vector2

get_origin() const

float

get_rotation() const

Vector2

get_scale() const

float

get_skew() const

Transform2D

interpolate_with(xform: Transform2D, weight: float) const

Transform2D

inverse() const

bool

is_conformal() const

bool

is_equal_approx(xform: Transform2D) const

bool

is_finite() const

Transform2D

looking_at(target: Vector2 = Vector2(0, 0)) const

Transform2D

orthonormalized() const

Transform2D

rotated(angle: float) const

Transform2D

rotated_local(angle: float) const

Transform2D

scaled(scale: Vector2) const

Transform2D

scaled_local(scale: Vector2) const

Transform2D

translated(offset: Vector2) const

Transform2D

translated_local(offset: Vector2) const

运算符

bool

operator !=(right: Transform2D)

PackedVector2Array

operator *(right: PackedVector2Array)

Rect2

operator *(right: Rect2)

Transform2D

operator *(right: Transform2D)

Vector2

operator *(right: Vector2)

Transform2D

operator *(right: float)

Transform2D

operator *(right: int)

Transform2D

operator /(right: float)

Transform2D

operator /(right: int)

bool

operator ==(right: Transform2D)

Vector2

operator [](index: int)


常量

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

单位 Transform2D。这是一个没有平移和旋转的变换,缩放为 Vector2.ONE。这意味着:

var transform = Transform2D.IDENTITY
print("| X | Y | 原点")
print("| %.f | %.f | %.f" % [transform.x.x, transform.y.x, transform.origin.x])
print("| %.f | %.f | %.f" % [transform.x.y, transform.y.y, transform.origin.y])
# 输出:
# | X | Y | Origin
# | 1 | 0 | 0
# | 0 | 1 | 0

如果使用该常量变换(相乘)Vector2Rect2PackedVector2Array 或其他 Transform2D,则不会发生变换。

注意:在 GDScript 中,该常量与不带任何参数创建 Transform2D 相同。使用该常量可以让你的代码更清晰,并与 C# 保持一致。

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

当任意变换被 FLIP_X 相乘时,它会取负 x 轴(X 列)的所有分量。

FLIP_X 被任意变换相乘时,它会取负所有轴(X 行)的 Vector2.x 分量。

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

当任意变换被 FLIP_Y 相乘时,它会取负 y 轴(Y 列)的所有分量。

FLIP_Y 被任意变换相乘时,它会取负所有轴(Y 行)的 Vector2.y 分量。


属性说明

Vector2 origin = Vector2(0, 0) 🔗

该变换的平移偏移量,即矩阵的第 2 列。在 2D 空间中可以看作是位置。


Vector2 x = Vector2(1, 0) 🔗

该变换基的 X 轴,以及矩阵的 0 列。与 y 组合,这表示该变换的旋转、缩放和倾斜。

在恒等变换中,该向量指向右侧(Vector2.RIGHT)。


Vector2 y = Vector2(0, 1) 🔗

该变换基的 Y 轴,以及矩阵的 1 列。与 x 组合,这表示变换的旋转、缩放和倾斜。

在恒等变换中,该向量指向下方(Vector2.DOWN)。


构造函数说明

Transform2D Transform2D() 🔗

构造与 IDENTITY 相同的 Transform2D

注意:在 C# 中构造的 Transform2D 的所有分量都为 Vector2.ZERO


Transform2D Transform2D(from: Transform2D)

构造给定 Transform2D 的副本。


Transform2D Transform2D(rotation: float, position: Vector2)

根据给定的旋转角(单位为弧度)和位置构造 Transform2D


Transform2D Transform2D(rotation: float, scale: Vector2, skew: float, position: Vector2)

根据给定的旋转角(单位为弧度)、缩放、偏斜(单位为弧度)和位置构造 Transform2D


Transform2D Transform2D(x_axis: Vector2, y_axis: Vector2, origin: Vector2)

根据表示 xyorigin 的 3 个 Vector2(三个矩阵列向量)构建 Transform2D


方法说明

Transform2D affine_inverse() const 🔗

返回该变换的逆版本。与 inverse() 不同,该方法适用于几乎任何基,包括非均匀基,但速度较慢。

注意:要使该方法正确返回,该变换的基需要有一个不完全是 0.0 的行列式(见 determinant())。


Vector2 basis_xform(v: Vector2) const 🔗

返回 v 向量的副本,由该变换基的矩阵变换(乘以)得到。与乘法运算符 (*)不同,该方法忽略 origin


Vector2 basis_xform_inv(v: Vector2) const 🔗

返回 v 向量的副本,由逆变换基矩阵(参阅 inverse())变换(乘以)得到。该方法忽略 origin

注意:该方法假定该变换的基是正交归一化的(参见 orthonormalized())。如果基不是正交归一化的,则应改用 transform.affine_inverse().basis_xform(vector)(参阅 affine_inverse())。


float determinant() const 🔗

返回该变换基矩阵的行列式。在高等数学中,这个数可以用来确定一些性质:

  • 如果行列式为 0.0,则基不可逆(见 inverse())。

  • 如果行列式为负数,则基表示负缩放。

注意:如果基的每个轴缩放都相同,那么这个行列式始终为 2 的该缩放次幂。


Vector2 get_origin() const 🔗

返回该变换的平移。相当于 origin


float get_rotation() const 🔗

返回该变换的旋转(单位为弧度)。等价于 x 的旋转角(见 Vector2.angle())。


Vector2 get_scale() const 🔗

Vector2 的形式同时返回 xy 的长度。如果该变换的基不存在剪切,这个值就是缩放系数。它不受旋转的影响。

var my_transform = Transform2D(
    Vector2(2, 0),
    Vector2(0, 4),
    Vector2(0, 0)
)
# 以任何方式旋转 Transform2D 都会保持其缩放。
my_transform = my_transform.rotated(TAU / 2)

print(my_transform.get_scale()) # 输出 (2.0, 4.0)

注意:如果 determinant() 返回的值为负数,则缩放也为负数。


float get_skew() const 🔗

返回该变换的偏斜(单位为弧度)。


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

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

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


Transform2D inverse() const 🔗

返回该变换的逆版本

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


bool is_conformal() const 🔗

如果该变换的基是共形的,则返回 true。共形的基既是正交的(轴彼此垂直)又是均匀的(轴共享相同长度)。该方法在物理计算过程中特别有用。


bool is_equal_approx(xform: Transform2D) const 🔗

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


bool is_finite() const 🔗

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


Transform2D looking_at(target: Vector2 = Vector2(0, 0)) const 🔗

返回该变换旋转后的一个副本,使得旋转后的 X 轴指向全局空间中的 target 位置。


Transform2D orthonormalized() const 🔗

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


Transform2D rotated(angle: float) const 🔗

返回该变换的副本,该副本进行了夹角为 angle 的旋转操作(单位为弧度)。

如果 angle 为负数,则变换执行顺时针旋转。

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

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


Transform2D rotated_local(angle: float) const 🔗

返回该变换的副本,该副本进行了夹角为 angle 的旋转操作(单位为弧度)。

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

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


Transform2D scaled(scale: Vector2) const 🔗

返回该变换的副本,该副本进行了系数为 scale 的缩放操作。

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

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


Transform2D scaled_local(scale: Vector2) const 🔗

返回该变换的副本,该副本进行了系数为 scale 的缩放操作。

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

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


Transform2D translated(offset: Vector2) const 🔗

返回该变换的副本,该副本进行了偏移量为 offset 的平移操作。

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

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


Transform2D translated_local(offset: Vector2) const 🔗

返回该变换的副本,该副本进行了偏移量为 offset 的平移操作。

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

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


运算符说明

bool operator !=(right: Transform2D) 🔗

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

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


PackedVector2Array operator *(right: PackedVector2Array) 🔗

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

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


Rect2 operator *(right: Rect2) 🔗

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


Transform2D operator *(right: Transform2D) 🔗

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

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

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


Vector2 operator *(right: Vector2) 🔗

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


Transform2D operator *(right: float) 🔗

Transform2D 包括 origin 在内的所有分量乘以给定的 float。会均匀地影响该变换的缩放。


Transform2D operator *(right: int) 🔗

Transform2D 包括 origin 在内的所有分量乘以给定的 int。会均匀地影响该变换的缩放。


Transform2D operator /(right: float) 🔗

Transform2D 包括 origin 在内的所有分量除以给定的 float。会均匀地影响该变换的缩放。


Transform2D operator /(right: int) 🔗

Transform2D 包括 origin 在内的所有分量除以给定的 int。会均匀地影响该变换的缩放。


bool operator ==(right: Transform2D) 🔗

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

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


Vector2 operator [](index: int) 🔗

通过索引访问该变换的轴(列)。索引 0x 相同,索引 1y 相同,索引 2origin 相同。