Transform2D
代表 2D 变换的 2×3 矩阵。
描述
Transform2D 内置 Variant 类型是一个 2×3 矩阵,表示 2D 空间中的变换。它包含三个 Vector2 值:x、y 和 origin。它们一起可以表示平移、旋转、缩放和倾斜。
x 和 y 轴形成一个 2×2 矩阵,称为该变换的基。每个轴的长度(Vector2.length())会影响该变换的缩放,而所有轴的方向会影响旋转。通常,两个轴彼此垂直。但是,当单独旋转一个轴时,变换会变得倾斜。将倾斜变换应用于 2D 精灵会使精灵看起来扭曲。
有关一般介绍,请参阅《矩阵和变换》教程。
注意:与 Transform3D 不同,没有与 Basis 类型等效的 2D 类型。所有提及的“基”均指 Transform2D 的 x 和 y 分量。
备注
通过 C# 使用该 API 时会有显著不同,详见 C# API 与 GDScript 的差异。
教程
属性
|
||
|
||
|
构造函数
Transform2D(from: Transform2D) |
|
Transform2D(rotation: float, position: Vector2) |
|
Transform2D(rotation: float, scale: Vector2, skew: float, position: Vector2) |
|
Transform2D(x_axis: Vector2, y_axis: Vector2, origin: Vector2) |
方法
affine_inverse() const |
|
basis_xform(v: Vector2) const |
|
basis_xform_inv(v: Vector2) const |
|
determinant() const |
|
get_origin() const |
|
get_rotation() const |
|
get_scale() const |
|
get_skew() const |
|
interpolate_with(xform: Transform2D, weight: float) const |
|
inverse() const |
|
is_conformal() const |
|
is_equal_approx(xform: Transform2D) const |
|
is_finite() const |
|
looking_at(target: Vector2 = Vector2(0, 0)) const |
|
orthonormalized() const |
|
rotated_local(angle: float) const |
|
scaled_local(scale: Vector2) const |
|
translated(offset: Vector2) const |
|
translated_local(offset: Vector2) const |
运算符
operator !=(right: Transform2D) |
|
operator *(right: PackedVector2Array) |
|
operator *(right: Rect2) |
|
operator *(right: Transform2D) |
|
operator *(right: Vector2) |
|
operator *(right: float) |
|
operator *(right: int) |
|
operator /(right: float) |
|
operator /(right: int) |
|
operator ==(right: Transform2D) |
|
operator [](index: int) |
常量
IDENTITY = Transform2D(1, 0, 0, 1, 0, 0) 🔗
单位 Transform2D。这是一个没有平移和旋转的变换,缩放为 Vector2.ONE。这意味着:
x 指向右侧(Vector2.RIGHT);
y 指向上方(Vector2.UP)。
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
如果使用该常量变换(相乘)Vector2、Rect2、PackedVector2Array 或其他 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) 🔗
属性说明
Vector2 origin = Vector2(0, 0) 🔗
该变换的平移偏移量,即矩阵的第 2 列。在 2D 空间中可以看作是位置。
该变换基的 X 轴,以及矩阵的 0 列。与 y 组合,这表示该变换的旋转、缩放和倾斜。
在恒等变换中,该向量指向右侧(Vector2.RIGHT)。
该变换基的 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)
方法说明
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())。
返回该变换基矩阵的行列式。在高等数学中,这个数可以用来确定一些性质:
如果行列式为
0.0,则基不可逆(见 inverse())。如果行列式为负数,则基表示负缩放。
注意:如果基的每个轴缩放都相同,那么这个行列式始终为 2 的该缩放次幂。
返回该变换的平移。相当于 origin。
返回该变换的旋转(单位为弧度)。等价于 x 的旋转角(见 Vector2.angle())。
以 Vector2 的形式同时返回 x 和 y 的长度。如果该变换的基不存在剪切,这个值就是缩放系数。它不受旋转的影响。
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)
var myTransform = new Transform2D(
Vector3(2.0f, 0.0f),
Vector3(0.0f, 4.0f),
Vector3(0.0f, 0.0f)
);
// R以任何方式旋转 Transform2D 都会保持其缩放。
myTransform = myTransform.Rotated(Mathf.Tau / 2.0f);
GD.Print(myTransform.GetScale()); // 输出 (2, 4)
注意:如果 determinant() 返回的值为负数,则缩放也为负数。
返回该变换的偏斜(单位为弧度)。
Transform2D interpolate_with(xform: Transform2D, weight: float) const 🔗
返回将该变换和 xform 按照给定的权重 weight 进行线性插值结果。
weight 应该在 0.0 到 1.0(闭区间)的范围内。允许使用超出这个范围的值,表示进行外插。
Transform2D inverse() const 🔗
返回该变换的逆版本。
注意:为了使该方法正确返回,该变换的基需要是正交归一化的(见 orthonormalized())。这意味着该基应该只代表旋转。如果不是,请改用 affine_inverse()。
如果该变换的基是共形的,则返回 true。共形的基既是正交的(轴彼此垂直)又是均匀的(轴共享相同长度)。该方法在物理计算过程中特别有用。
bool is_equal_approx(xform: Transform2D) const 🔗
如果通过在每个分量上运行 @GlobalScope.is_equal_approx(),该变换和 xform 近似相等,则返回 true。
如果该变换是有限的,则返回 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 之间执行的操作。
注意:如果你只需要修改该变换的一个属性,请考虑改用以下方法之一:
对于平移,请参阅 translated() 或 translated_local()。
对于旋转,请参阅 rotated() 或 rotated_local()。
对于缩放,请参阅 scaled() 或 scaled_local()。
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(),这样更可靠。