Transform3D

表示3D变换的3×4矩阵。

描述

Transform3D内置的Variant类型是一个3×4矩阵,表示3D空间中的变换。它包含一个Basis,它本身可以表示旋转、缩放和剪切。此外,结合它自己的origin,变换也可以表示平移。

属性

Basis

basis

Basis(1, 0, 0, 0, 1, 0, 0, 0, 1)

Vector3

origin

Vector3(0, 0, 0)

构造函数

方法

Transform3D

affine_inverse() const

Transform3D

interpolate_with(xform: Transform3D, weight: float) const

Transform3D

inverse() const

bool

is_equal_approx(xform: Transform3D) const

bool

is_finite() const

Transform3D

looking_at(target: Vector3, up: Vector3 = Vector3(0, 1, 0), use_model_front: bool = false) const

Transform3D

orthonormalized() const

Transform3D

rotated(axis: Vector3, angle: float) const

Transform3D

rotated_local(axis: Vector3, angle: float) const

Transform3D

scaled(scale: Vector3) const

Transform3D

scaled_local(scale: Vector3) const

Transform3D

translated(offset: Vector3) const

Transform3D

translated_local(offset: Vector3) const

运算符


常量

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.xBasis.yBasis.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)

BasisVector3构造一个Transform3D


Transform3D Transform3D(from: Projection)

Projection构造Transform3D。因为Transform3D是3×4矩阵,而Projection是4×4矩阵,所以此操作修剪投影矩阵的最后一行(from. x.wfrom.y.wfrom.z.wfrom.w.w不包含在新的转换中)。


Transform3D Transform3D(x_axis: Vector3, y_axis: Vector3, z_axis: Vector3, origin: Vector3)

从四个Vector3值(也称为矩阵列)构造一个Transform3D

前三个参数是basis的轴(Basis.xBasis.yBasis.z)。


方法说明

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.01.0(包括)之间。允许使用此范围之外的值,并可用于执行外推


Transform3D inverse() const 🔗

返回此转换的反转版本。另请参见Basis.inverse()

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


bool is_equal_approx(xform: Transform3D) const 🔗

如果此转换和xform近似相等,则通过在每个组件上运行@GlobalScope.is_equal_approx()返回true


bool is_finite() const 🔗

如果此转换是有限的,则通过调用每个组件上的@GlobalScope.is_finite()返回true


Transform3D looking_at(target: Vector3, up: Vector3 = Vector3(0, 1, 0), use_model_front: bool = false) const 🔗

返回此旋转变换的副本,以便正向轴(-Z)指向位置。

向上轴(+Y)指向尽可能靠近up向量,同时保持垂直于前向轴。生成的变换被正交规范化。来自原始变换的现有旋转、缩放和歪斜信息被丢弃。targetup向量不能为零,不能相互平行,并且在全局/父空间中定义。

如果use_model_fronttrue,则+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(),这样更可靠。