Javascript 如何计算两个空间旋转之间的差值

Javascript 如何计算两个空间旋转之间的差值,javascript,math,quaternions,gl-matrix,Javascript,Math,Quaternions,Gl Matrix,我正在尝试将从事件中获取的移动设备的物理方向转换为我的3D查看器中的一系列相机旋转。问题是,我需要相对于deviceorientation中的第一个方向进行空间旋转,即页面加载时的方向。所以我需要保存第一个方向,然后以某种方式进行空间旋转,对应于从保存的方向到当前方向的方向变化 我该怎么做 请注意,我使用的四元数进行空间旋转,但我对这个主题不太熟悉 当前我的旋转函数如下所示: function rotate(aX, aY, aZ) { var rotation = quat.create

我正在尝试将从事件中获取的移动设备的物理方向转换为我的3D查看器中的一系列相机旋转。问题是,我需要相对于
deviceorientation
中的第一个方向进行空间旋转,即页面加载时的方向。所以我需要保存第一个方向,然后以某种方式进行空间旋转,对应于从保存的方向到当前方向的方向变化

我该怎么做

请注意,我使用的四元数进行空间旋转,但我对这个主题不太熟悉

当前我的旋转函数如下所示:

function rotate(aX, aY, aZ) {
    var rotation = quat.create();
    quat.rotateX(rotation, rotation, aX);
    quat.rotateY(rotation, rotation, aY);
    quat.rotateZ(rotation, rotation, aZ);
    quat.normalize(rotation, rotation);
    ...
}
我的
deviceorientation
侦听器看起来是这样的(当然它还没有完成):


我想很难找到明确的公式来获得所需的角度(
aX,aY,aZ
)。我想我需要做四元数变换,但我不知道具体如何做。

使用四元数或矩阵商()。如果您需要其他表示法,请转换四元数。@Nico Schertler谢谢您的建议。但是我如何从旋转角度(
aX,aY,aZ
)创建四元数?你不是已经在这样做了吗(
quat.rotateX(…)
)?是的,很明显:通过一系列
rotate*
调用来创建四元数
var aInitial = null;
window.addEventListener('deviceorientation', function (event) {
    var alpha = e.alpha, beta = e.beta, gamma = e.gamma;
    if (!aInitial) aInitial = [alpha, beta, gamma];
    // somehow get angles aX, aY, aZ from alpha, beta, gamma and aInitial
    rotate(aX, aY, aZ);
});