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