如何将四元数与向量相乘?

How to multiply a quaternion with a vector?

我正在使用 CesiumJs

我有一个四元数 (x,y,z,w) 我有一个矢量 (x,y,z)

我想将该四元数乘以一个向量,基本上现在我有一个旋转,我想将该旋转与一个向量前向 (0,0,1) 相乘以获得一个点方向,但CesiumJS暂时没有这些功能。

我知道有一些方法可以将 Vector 与 Quaternion 相乘,我是在 Unity 中做的,但我不知道具体怎么做

我找到了这个公式 v' = q * v * (q^-1)(q^-1) 到底是什么?

您可以 "vectorize" 四元数乘积,即根据点积和叉积等向量运算来编写它。这样做你会得到一个等价于欧拉-罗德里格斯公式的公式 [1]:

v' = v + 2 * r x (s * v + r x v) / m

其中x代表叉积,s和r分别是四元数的标量和向量部分,m是四元数分量的平方和。

[1] https://en.m.wikipedia.org/wiki/Euler%E2%80%93Rodrigues_formula

Marco13 的评论是正确的。在 Cesium 中,四元数通常在与向量相乘之前转换为矩阵,为此目的存在内置函数。

这是一个Sandcastle demo

var position = new Cesium.Cartesian3(0, 0, 1);  // x, y, z

// Could instead use:
// var position = Cesium.Cartesian3.UNIT_Z.clone();

var quaternion = new Cesium.Quaternion(0.382683, 0, 0, 0.92388);  // x, y, z, w

// Could alternately use:  45 degrees (pi/4 radians) around X
//var quaternion = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_X, Math.PI / 4);

var matrix = Cesium.Matrix3.fromQuaternion(quaternion);

var scratch1 = new Cesium.Cartesian3();
var result = Cesium.Matrix3.multiplyByVector(matrix, position, scratch1);

console.log(result);

// Result will be: (0, -0.7071063400800001, 0.7071079759110002)
// The +Z vector was rotated 45 degrees towards -Y, in a counter-clockwise
// rotation as seen from the +X axis.