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

Math 如何将四元数与向量相乘?,math,vector,quaternions,cesium,Math,Vector,Quaternions,Cesium,我正在使用CesiumJ 我有一个四元数(x,y,z,w) 我有一个向量(x,y,z) 我想用一个向量乘以那个四元数,基本上是在我旋转的那一刻,我想用一个向量向前(0,0,1)乘以那个旋转,以得到一个方向上的点,但是CesiumJS目前没有这些函数 我知道有一种方法可以把向量和四元数相乘,我是在单位里做的,但我不知道确切的方法 我发现了这个公式v'=q*v*(q^-1),但是(q^-1)到底是什么 您可以“矢量化”四元数乘积,也就是说,用点积和叉积等矢量运算来编写四元数乘积。这样,您将得到一个与

我正在使用CesiumJ

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

我想用一个向量乘以那个四元数,基本上是在我旋转的那一刻,我想用一个向量向前(0,0,1)乘以那个旋转,以得到一个方向上的点,但是CesiumJS目前没有这些函数

我知道有一种方法可以把向量和四元数相乘,我是在单位里做的,但我不知道确切的方法

我发现了这个公式
v'=q*v*(q^-1)
,但是
(q^-1)
到底是什么

您可以“矢量化”四元数乘积,也就是说,用点积和叉积等矢量运算来编写四元数乘积。这样,您将得到一个与Euler-Rodrigues公式[1]等效的公式:

v'=v+2*rx(s*v+rxv)/m

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


[1] 马可13的评论是正确的。在铯中,四元数通常在与向量相乘之前转换为矩阵,并且内置函数用于此目的

这是一个例子


当然有不同的方法,我对铯没有深入的了解,但是一个简单的方法应该是使用
Matrix3.fromQuaternion
从四元数创建一个3x3旋转矩阵,然后像往常一样使用这个矩阵旋转向量。如果这有帮助(并且没有其他人发布答案),我可以尝试将其扩展到一个答案……你期望结果是什么?四元数?与输入向量类型相同的向量?一种不同的向量?还有别的吗?我认为你们在这里混合了“世界”。你考虑从一个到另一个适应吗?例如,首先将四元数转换为向量,然后进行适当的向量运算,以获得向量结果。反之亦然。
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.