我正在寻找一种方法来确定相机(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];
答案 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)
找到2个矢量dirA和dirB,相机和物体的方向。您可以通过相应的四元数简单地转换向量Z(0,0,1)。
通过
找到矢量dirA dirB之间的角度angle = atan2(cross(dirA,dirB).len(),dot(dirS,dirB))