Transform3D¶
表示3D变换的3×4矩阵。
描述¶
Transform3D内置的Variant类型是一个3×4矩阵,表示3D空间中的变换。它包含一个Basis,它本身可以表示旋转、缩放和剪切。此外,结合它自己的origin,变换也可以表示平移。
属性¶
构造函数¶
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。这也意味着:n - 其Basis.x 指向右方(Vector3.RIGHT);n - 其Basis.y 指向上方(Vector3.UP);n - 其Basis.z 指向后方(Vector3.BACK)。
var transform = Transform3D.IDENTITY
var basis = transform.basis
print("| X | Y | Z | Origin")
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 | Origin
# | 1 | 0 | 0 | 0
# | 0 | 1 | 0 | 0
# | 0 | 0 | 1 | 0
如果一个 Vector3、一个 AABB、一个 Plane、一个 PackedVector3Array 或另一个 Transform3D 与该常量相乘(变换),不会发生任何变换。注意:在 S3Script 中,该常量等同于创建一个不带任何参数的 Transform3D。它可用于使代码更清晰,并且与 C# 保持一致
FLIP_X = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 🔗
Transform3D镜像应用垂直于YZ平面。它的basis等于Basis.FLIP_X。
FLIP_Y = Transform3D(1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0) 🔗
Transform3D镜像应用垂直于XZ平面。它的basis等于Basis.FLIP_Y。
FLIP_Z = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0) 🔗
Transform3D镜像应用垂直于XY平面。它的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 🔗
通过给定的weight返回此变换与xform之间的线性插值结果。
weight应介于0.0和1.0(包括)之间。允许使用此范围之外的值,并可用于执行外推。
Transform3D inverse() const 🔗
返回此转换的反转版本。另请参见Basis.inverse()。
注意:为了使该方法正确返回,转换的basis需要是正交(参见orthonormalized())。这意味着基础应该只代表一个旋转。如果不是,请使用affine_inverse()。
bool is_equal_approx(xform: Transform3D) const 🔗
如果此转换和xform近似相等,则通过在每个组件上运行@GlobalScope.is_equal_approx()返回true。
如果此转换是有限的,则通过调用每个组件上的@GlobalScope.is_finite()返回true。
Transform3D looking_at(target: Vector3, up: Vector3 = Vector3(0, 1, 0), use_model_front: bool = false) const 🔗
返回此旋转变换的副本,以便正向轴(-Z)指向位置。
向上轴(+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相乘的优化版本,即X*R。
这可以看作是相对于局部框架的转换。
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转换。
这是父级和子级Item3D之间执行的操作。
注意:如果您只需要修改此转换的一个属性,请考虑使用以下方法之一:
-有关翻译,请参阅translated()或translated_local()。
-有关旋转,请参阅rotated()或rotated_local()。
-有关比例,请参阅scaled()或scaled_local()。
Vector3 operator *(right: Vector3) 🔗
将Vector3转换(乘以)此转换矩阵。
Transform3D operator *(right: float) 🔗
将Transform3D的所有组件乘以给定的float,包括origin。这会均匀地影响转换的缩放,缩放basis。
Transform3D operator *(right: int) 🔗
将Transform3D的所有组件乘以给定的int,包括origin。这会均匀地影响转换的缩放,缩放basis。
Transform3D operator /(right: float) 🔗
将Transform3D的所有组件除以给定的float,包括origin。这会均匀地影响转换的缩放,缩放basis。
Transform3D operator /(right: int) 🔗
将Transform3D的所有组件除以给定的int,包括origin。这会均匀地影响转换的缩放,缩放basis。
bool operator ==(right: Transform3D) 🔗
如果两个转换的分量完全相等,则返回true。
注:由于浮点精度误差,考虑改用is_equal_approx(),这样更可靠。