pub fun quat_identity() f32x4;
单位四元数(无旋转)
ret:{0, 0, 0, 1}
pub fun quat_mul(a: f32x4, b: f32x4) f32x4;
两个四元数的哈密顿乘积(旋转的组合)
a:左四元数,后应用 b:右四元数,先应用 ret:组合后的四元数 a*b
pub fun quat_conjugate(q: f32x4) f32x4;
四元数的共轭(取反向量部分)
对于单位四元数,这是逆旋转。
q:输入四元数 ret:{-x, -y, -z, w}
pub fun quat_dot(a: f32x4, b: f32x4) f32;
两个四元数的点积
a:第一个四元数 b:第二个四元数 ret:a . b
pub fun quat_length(q: f32x4) f32;
四元数的长度(大小)
q:输入四元数 ret:sqrt(q . q)
pub fun quat_normalize(q: f32x4) f32x4;
将四元数归一化为单位长度
通过长度倒数进行缩放是单个通道的向量乘法。
q:输入四元数(必须非零) ret:q / |q|
pub fun quat_nlerp(a: f32x4, b: f32x4, t: f32) f32x4;
两个四元数之间的归一化线性插值
对分量进行线性插值然后重新归一化,当四元数位于相反半球时翻转 b 以取最短弧。比真正的 slerp 便宜,且对于邻近旋转是接近的近似;quat_slerp 是精确的、恒定角速度插值。
a:起始四元数(单位) b:结束四元数(单位) t:插值因子 [0, 1] ret:插值后的单位四元数
pub fun quat_slerp(a: f32x4, b: f32x4, t: f32) f32x4;
两个单位四元数之间的球面线性插值
以恒定角速度追踪最短的大圆弧:将 b 翻转到近半球,然后以 sin((1-t)*theta)/sin(theta) 和 sin(t*theta)/sin(theta) 对端点进行加权,其中 theta 是它们之间的夹角。当两个四元数接近重合时 sin(theta) -> 0 且权重条件不良,因此接近平行的弧回退到归一化线性插值——那里的精确极限,而非近似。
a:起始四元数(单位) b:结束四元数(单位) t:插值因子 [0, 1] ret:插值后的单位四元数