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

时间:2019-09-23 22:57:01

标签: math vector quaternions cesium

我正在使用CesiumJs

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

我想将四元数乘以一个向量,基本上是在我进行旋转的那一刻,并且我想将该旋转乘以一个向量正向(0,0,1)来获得一个方向上的点,但是CesiumJS目前没有这些功能。

我知道有某种方法可以将Vector与四元数相乘,我是在Unity中完成的,但是我不知道具体怎么做

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

2 个答案:

答案 0 :(得分:1)

您可以“矢量化”四元数乘积,即,根据矢量运算(例如点积和叉积)来编写它。这样做,您将获得一个与Euler-Rodrigues公式[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

答案 1 :(得分:1)

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

这里是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.