我正在使用CesiumJs
我有一个四元数(x,y,z,w) 我有一个向量(x,y,z)
我想将四元数乘以一个向量,基本上是在我进行旋转的那一刻,并且我想将该旋转乘以一个向量正向(0,0,1)来获得一个方向上的点,但是CesiumJS目前没有这些功能。
我知道有某种方法可以将Vector与四元数相乘,我是在Unity中完成的,但是我不知道具体怎么做
我找到了这个公式v' = q * v * (q^-1)
,但是(q^-1)
到底是什么?
答案 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.