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

3

我正在使用CesiumJs

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

我想将四元数乘以向量,基本上目前我有一个旋转,我想将该旋转与向量前进(0,0,1)相乘,以便获得朝向的点,但是CesiumJS当前没有这些功能。

我知道有一种方法可以用四元数乘以向量,在Unity中我曾经这么做过,但我不确定具体怎么做。

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


当然有不同的方法,而我并没有深入研究过cesium,但一个简单的方法应该是使用Matrix3.fromQuaternion从四元数创建一个3x3的旋转矩阵,然后像平常一样使用这个矩阵来旋转向量。如果这有帮助(且没有其他人发布答案),我可以尝试将其扩展为答案... - Marco13
1
你期望的结果是什么?四元数?与输入向量相同类型的向量?不同类型的向量?还是其他东西?我认为你在这里混淆了"世界"。你考虑过从一个领域适应到另一个领域吗?例如,先将四元数转换为向量,然后进行适当的向量运算,以获得向量结果。反之亦然。 - Yunnosch
2个回答

4
您可以将四元数乘积“向量化”,即通过使用点积和叉积等向量运算来表示它。这样做,您将得到一个等价于欧拉-罗德里格斯公式 [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

'在v旁边是什么意思? - Weston McNamara
1
v'(读作“v prime”)是旋转后的向量。 - Mauricio Cele Lopez Belon

1

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

这里有一个沙堡演示
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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接