Quaternion

用于表示三维旋转的单位四元数。

描述

Quaternion内置的Variant类型是一种4D数据结构,以Hamilton约定四元数的形式表示旋转。与可以存储旋转和缩放的Basis类型相比,四元数只能存储旋转。

Quaternion由4个浮点组件组成:wxyz。这些组件在内存中非常紧凑,因此一些操作效率更高,不太可能导致浮点错误。get_angle()get_axis()slerp()等方法比它们的Basis对应方法更快。

有关四元数的精彩介绍,请参阅` 3Blue1Brown <https://www.youtube.com/watch?v=d4EgbgTm0Bg>`__的视频。您不需要了解四元数背后的数学,因为i3D提供了几种帮助方法来为您处理它。其中包括slerp()spherical_cubic_interpolate(),以及*运算符。

注意:四元数必须在用于旋转之前进行归一化(参见normalized())。

注意:Vector2Vector3类似,四元数的组件默认使用32位精度,而float始终为64位。如果需要双精度,请使用选项precision=double编译引擎。

属性

float

w

1.0

float

x

0.0

float

y

0.0

float

z

0.0

构造函数

方法

float

angle_to(to: Quaternion) const

float

dot(with: Quaternion) const

Quaternion

exp() const

Quaternion

from_euler(euler: Vector3) static

float

get_angle() const

Vector3

get_axis() const

Vector3

get_euler(order: int = 2) const

Quaternion

inverse() const

bool

is_equal_approx(to: Quaternion) const

bool

is_finite() const

bool

is_normalized() const

float

length() const

float

length_squared() const

Quaternion

log() const

Quaternion

normalized() const

Quaternion

slerp(to: Quaternion, weight: float) const

Quaternion

slerpni(to: Quaternion, weight: float) const

Quaternion

spherical_cubic_interpolate(b: Quaternion, pre_a: Quaternion, post_b: Quaternion, weight: float) const

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

运算符


常量

IDENTITY = Quaternion(0, 0, 0, 1) 🔗

单位四元数,表示不旋转。这与Basis.IDENTITY具有相同的旋转。

如果Vector3被这个四元数旋转(乘以),它不会改变。

注意:在S3Script中,这个常量相当于创建一个没有任何参数的Quaternion。它可用于使您的代码更清晰,并与C#保持一致。


属性说明

float w = 1.0 🔗

四元数的W分量。这是“实”部分。

注意:四元数组件通常不应直接操作。


float x = 0.0 🔗

四元数的X分量。这是沿“虚构”i轴的值。

注意:四元数组件通常不应直接操作。


float y = 0.0 🔗

四元数的Y分量。这是沿“虚构”j轴的值。

注意:四元数组件通常不应直接操作。


float z = 0.0 🔗

四元数的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_fromarc_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)。


float get_angle() const 🔗

返回此四元数表示的旋转角度。

注意:四元数必须归一化。


Vector3 get_axis() const 🔗

返回此四元数表示的旋转的旋转轴。


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


bool is_finite() const 🔗

如果这个四元数是有限的,则通过调用每个组件上的@GlobalScope.is_finite()返回true


bool is_normalized() const 🔗

如果此四元数被规范化,则返回true。另请参阅normalized()


float length() const 🔗

返回此四元数的长度,也称为幅度。


float length_squared() const 🔗

返回这个四元数的长度,平方。

注意:此方法比length()快,因此如果您只需要比较四元数长度,则更喜欢它。


Quaternion log() const 🔗

返回此四元数的对数。将此四元数的旋转轴乘以其旋转角度,并将结果存储在返回四元数的向量部分(xyz)中。返回的四元数的实部(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、此向量bpost_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、此向量bpost_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) 🔗

通过索引访问此四元数的每个组件。

索引0x相同,索引1y相同,索引2z相同,索引3w相同。


Quaternion operator unary+() 🔗

返回与+不存在相同的值。一元+什么也不做,但有时它可以使您的代码更具可读性。


Quaternion operator unary-() 🔗

返回Quaternion的负值。这与将所有组件乘以-1相同。此操作会产生一个表示相同旋转的四元数。