四元数之间的距离/幅度,但忽略滚动

时间:2014-04-25 13:21:09

标签: javascript math quaternions gl-matrix

我正在寻找一种方法来确定相机(a)是否在寻找与特定物体(b)相同的方向。

我只是在轮换工作,因为在这里我们不关心位置(因此我们可以认为两者都位于原点)。

我正在使用四元数,使用gl-matrix。

经过多次搜索和测试后,我了解到我可以使用点积来确定两个四元数之间的“距离”(幅度?)。

var a = quat.create();
quat.rotateY(a, a, Math.PI);

var b = quat.create();
quat.rotateY(b, b, Math.PI);

quat.dot(a, b)

在许多情况下效果很好(它返回范围[0..1]中的数字:来自1,如果两者完全相反,则两者都正好看同一方向0

但是,在我的情况下,我不想关心对象之间的“滚动”。我的意思是相机(a)可以倒置,相对于(b),但仍然看着同一点。

例如,如果我将b绕Z转180度,我会得到一个大约0的点积,而它仍然朝同一方向看。

var a = quat.create();
quat.rotateY(a, a, Math.PI);

var b = quat.create();
quat.rotateY(b, b, Math.PI);
quat.rotateZ(b, b, Math.PI);

quat.dot(a, b);

我尝试了很多方法,例如将a的倒数乘以b[s]lerp,但我仍然无法得到符合我要求的任何内容。

当然,我不能简单地分离和使用绝对Z轴,因为这里的所有东西都是相对的,所以滚动可以围绕任何轴。

我怎样才能得到这个结果?

编辑:感谢LutzL的回答,以下是我实施解决方案的方法:

var r = quat.create();
quat.invert(r, a);
quat.multiply(r, r, b);

var distance = r[3]*r[3] - r[0]*r[0] - r[1]*r[1] + r[2]*r[2];

2 个答案:

答案 0 :(得分:1)

我将它解释为Z轴的单位向量(在本地坐标中)是你的前向向量的方式吗?

四元数a描述了局部坐标系到全局坐标系的转换。因此,局部坐标中的向量v具有方向a * v * a' (全局帧中的a =#=单位四元数的a =的共轭)。因此,Z轴的方向根据ka = a * k * a'而变化。

第二个物体的Z方向因此是kb = b * k * b'。它们之间角度的余弦是ka和kb的标量积,它也是ka的真实部分* * kb = a * k' * a' * b * k * b'。任何四元数v的实部在' * v * a中保持不变,所以

  

scal(ka,kb)= real(ka * kb')

     

= -real(k * a' * b * k * b' * a)= -real(k *(a' * b)* k *(a' * b) ')

我不知道GL实现的具体细节,但操作是计算乘积p1 = a' * b,将p1绕Z轴旋转180度到p2,实际上只是翻转i和j系数的符号,并形成p1和p2的标量积。简短版本是

  

scal(ka,kb)= p1.w * p1.w - p1.x * p1.x - p1.y * p1.y + p1.z * p1.z

答案 1 :(得分:0)

  1. 找到2个矢量dirA和dirB,相机和物体的方向。您可以通过相应的四元数简单地转换向量Z(0,0,1)。

  2. 通过

    找到矢量dirA dirB之间的角度

    angle = atan2(cross(dirA,dirB).len(),dot(dirS,dirB))