我正在寻找一种方法来确定相机 ( 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
, or的倒数相乘[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];