Quaternion¶
用于表示三维旋转的单位四元数。
描述¶
Quaternion内置的Variant类型是一种4D数据结构,以Hamilton约定四元数的形式表示旋转。与可以存储旋转和缩放的Basis类型相比,四元数只能存储旋转。
Quaternion由4个浮点组件组成:w、x、y和z。这些组件在内存中非常紧凑,因此一些操作效率更高,不太可能导致浮点错误。get_angle()、get_axis()和slerp()等方法比它们的Basis对应方法更快。
有关四元数的精彩介绍,请参阅` 3Blue1Brown <https://www.youtube.com/watch?v=d4EgbgTm0Bg>`__的视频。您不需要了解四元数背后的数学,因为i3D提供了几种帮助方法来为您处理它。其中包括slerp()和spherical_cubic_interpolate(),以及*运算符。
注意:四元数必须在用于旋转之前进行归一化(参见normalized())。
注意:与Vector2和Vector3类似,四元数的组件默认使用32位精度,而float始终为64位。如果需要双精度,请使用选项precision=double编译引擎。
属性¶
构造函数¶
Quaternion(from: Quaternion) |
|
Quaternion(arc_from: Vector3, arc_to: Vector3) |
|
Quaternion(axis: Vector3, angle: float) |
|
Quaternion(from: Basis) |
|
Quaternion(x: float, y: float, z: float, w: float) |
方法¶
angle_to(to: Quaternion) const |
|
dot(with: Quaternion) const |
|
exp() const |
|
from_euler(euler: Vector3) static |
|
get_angle() const |
|
get_axis() const |
|
inverse() const |
|
is_equal_approx(to: Quaternion) const |
|
is_finite() const |
|
is_normalized() const |
|
length() const |
|
length_squared() const |
|
log() const |
|
normalized() const |
|
slerp(to: Quaternion, weight: float) const |
|
slerpni(to: Quaternion, weight: float) const |
|
spherical_cubic_interpolate(b: Quaternion, pre_a: Quaternion, post_b: Quaternion, weight: float) const |
|
spherical_cubic_interpolate_in_time(b: Quaternion, pre_a: Quaternion, post_b: Quaternion, weight: float, b_t: float, pre_a_t: float, post_b_t: float) const |
运算符¶
operator !=(right: Quaternion) |
|
operator *(right: Quaternion) |
|
operator *(right: Vector3) |
|
operator *(right: float) |
|
operator *(right: int) |
|
operator +(right: Quaternion) |
|
operator -(right: Quaternion) |
|
operator /(right: float) |
|
operator /(right: int) |
|
operator ==(right: Quaternion) |
|
operator [](index: int) |
|
常量¶
IDENTITY = Quaternion(0, 0, 0, 1) 🔗
单位四元数,表示不旋转。这与Basis.IDENTITY具有相同的旋转。
如果Vector3被这个四元数旋转(乘以),它不会改变。
注意:在S3Script中,这个常量相当于创建一个没有任何参数的Quaternion。它可用于使您的代码更清晰,并与C#保持一致。
属性说明¶
四元数的W分量。这是“实”部分。
注意:四元数组件通常不应直接操作。
四元数的X分量。这是沿“虚构”i轴的值。
注意:四元数组件通常不应直接操作。
四元数的Y分量。这是沿“虚构”j轴的值。
注意:四元数组件通常不应直接操作。
四元数的Z分量。这是沿“虚构”k轴的值。
注意:四元数组件通常不应直接操作。
构造函数说明¶
Quaternion Quaternion() 🔗
构造一个与IDENTITY相同的Quaternion。
注意:在C#中,这构造了一个Quaternion,其所有组件都设置为0.0。
Quaternion Quaternion(from: Quaternion)
构造一个Quaternion作为给定Quaternion的副本。
Quaternion Quaternion(arc_from: Vector3, arc_to: Vector3)
构造一个Quaternion,表示arc_from和arc_to之间的最短圆弧。这些可以想象为与球体表面相交的两个点,半径为1.0。
Quaternion Quaternion(axis: Vector3, angle: float)
构造一个Quaternion,表示绕axis旋转给定的angle,以弧度为单位。轴必须是归一化向量。
Quaternion Quaternion(from: Basis)
根据给定的旋转Basis构造一个Quaternion。
此构造函数比Basis.get_rotation_quaternion()快,但给定的基必须是正交化(参见Basis.orthonormalized())。否则,构造函数失败并返回IDENTITY。
Quaternion Quaternion(x: float, y: float, z: float, w: float)
构造一个由给定值定义的Quaternion。
注意:只有归一化的四元数表示旋转;如果这些值没有归一化,新的Quaternion将不是有效的旋转。
方法说明¶
float angle_to(to: Quaternion) const 🔗
返回此四元数与to之间的角度。这是从一个到另一个需要旋转的角度的大小。
注意:此方法的浮点误差幅度异常高,因此is_zero_approx等方法将无法可靠地工作。
float dot(with: Quaternion) const 🔗
返回此四元数与with之间的点积。
这相当于(quat. x*with.x)+(quat.y*with.y)+(quat.z*with.z)+(quat.w*with.w)。
Quaternion exp() const 🔗
返回这个四元数的指数。结果的旋转轴是这个四元数的归一化旋转轴,结果的角度是这个四元数的向量部分的长度。
Quaternion from_euler(euler: Vector3) static 🔗
从欧拉角的给定Vector3构造一个新的Quaternion,以弧度为单位。此方法始终使用YXZ约定(@GlobalScope.EULER_ORDER_YXZ)。
返回此四元数表示的旋转角度。
注意:四元数必须归一化。
返回此四元数表示的旋转的旋转轴。
Vector3 get_euler(order: int = 2) const 🔗
以欧拉角的Vector3形式返回此四元数的旋转,以弧度为单位。
每个连续旋转的顺序可以随order而改变(参见EulerOrder常量)默认情况下,使用YXZ约定(@GlobalScope.EULER_ORDER_YXZ):首先计算Z(滚动),然后计算X(俯仰),最后计算Y(偏航)。当使用相反的方法from_euler()时,此顺序颠倒。
Quaternion inverse() const 🔗
返回此四元数的逆版本,反转除w之外的每个组件的符号。
bool is_equal_approx(to: Quaternion) const 🔗
如果此四元数和to近似相等,则通过调用每个组件上的@GlobalScope.is_equal_approx()返回true。
如果这个四元数是有限的,则通过调用每个组件上的@GlobalScope.is_finite()返回true。
如果此四元数被规范化,则返回true。另请参阅normalized()。
返回此四元数的长度,也称为幅度。
float length_squared() const 🔗
返回这个四元数的长度,平方。
注意:此方法比length()快,因此如果您只需要比较四元数长度,则更喜欢它。
Quaternion log() const 🔗
返回此四元数的对数。将此四元数的旋转轴乘以其旋转角度,并将结果存储在返回四元数的向量部分(x、y和z)中。返回的四元数的实部(w)始终为0.0。
Quaternion normalized() const 🔗
返回此四元数的副本,经过规范化使其长度为1.0。另请参见is_normalized()。
Quaternion slerp(to: Quaternion, weight: float) const 🔗
使用to四元数执行球面线性插值,给定weight并返回结果。此四元数和to都必须标准化。
Quaternion slerpni(to: Quaternion, weight: float) const 🔗
使用to四元数执行球面线性插值,给定weight并返回结果。与slerp()不同,此方法不检查旋转路径是否小于90度。此四元数和to都必须归一化。
Quaternion spherical_cubic_interpolate(b: Quaternion, pre_a: Quaternion, post_b: Quaternion, weight: float) const 🔗
通过给定的量weight在四元数pre_a、此向量b和post_b之间执行球面三次插值。
Quaternion spherical_cubic_interpolate_in_time(b: Quaternion, pre_a: Quaternion, post_b: Quaternion, weight: float, b_t: float, pre_a_t: float, post_b_t: float) const 🔗
通过给定的量weight在四元数pre_a、此向量b和post_b之间执行球面三次插值。
它可以通过时间值执行比spherical_cubic_interpolate()更平滑的插值。
运算符说明¶
bool operator !=(right: Quaternion) 🔗
如果两个四元数的分量不完全相等,则返回true。
注:由于浮点精度误差,考虑改用is_equal_approx(),这样更可靠。
Quaternion operator *(right: Quaternion) 🔗
组成(相乘)两个四元数。这将right四元数(子)旋转这个四元数(父)。
Vector3 operator *(right: Vector3) 🔗
将right向量旋转(乘以)此四元数,返回Vector3。
Quaternion operator *(right: float) 🔗
将Quaternion的每个组件乘以正确的float值。
此操作本身没有意义,但可以用作更大表达式的一部分。
Quaternion operator *(right: int) 🔗
将Quaternion的每个组件乘以正确的int值。
此操作本身没有意义,但可以用作更大表达式的一部分。
Quaternion operator +(right: Quaternion) 🔗
将左Quaternion的每个组件添加到右Quaternion。
这个操作本身没有意义,但它可以用作更大表达式的一部分,例如近似两个附近旋转之间的中间旋转。
Quaternion operator -(right: Quaternion) 🔗
将左Quaternion的每个分量减去右Quaternion。
此操作本身没有意义,但可以用作更大表达式的一部分。
Quaternion operator /(right: float) 🔗
将Quaternion的每个组件除以正确的float值。
此操作本身没有意义,但可以用作更大表达式的一部分。
Quaternion operator /(right: int) 🔗
将Quaternion的每个组件除以正确的int值。
此操作本身没有意义,但可以用作更大表达式的一部分。
bool operator ==(right: Quaternion) 🔗
如果两个四元数的分量完全相等,则返回true。
注:由于浮点精度误差,考虑改用is_equal_approx(),这样更可靠。
float operator [](index: int) 🔗
通过索引访问此四元数的每个组件。
索引0与x相同,索引1与y相同,索引2与z相同,索引3与w相同。
Quaternion operator unary+() 🔗
返回与+不存在相同的值。一元+什么也不做,但有时它可以使您的代码更具可读性。
Quaternion operator unary-() 🔗
返回Quaternion的负值。这与将所有组件乘以-1相同。此操作会产生一个表示相同旋转的四元数。