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.
Checking the stable version of the documentation...
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 分量。
Note
通过 C# 使用该 API 时会有显著不同,详见 C# API differences to 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(),这样更可靠。