我正在我的引擎中制作一个3D门户系统(比如Portal游戏).每个门户都有自己的方向保存在四元数中.要在其中一个门户中渲染虚拟场景,我需要计算两个四元数之间的差异,结果用于旋转虚拟场景.
当在左墙上创建第一个门户,在右墙上创建第二个门户时,从一个到另一个的旋转将仅在一个轴上进行,但是例如当第一个门户将在地板上创建时,第二个门户将在地板上创建在右侧墙上,从一个轴到另一个轴的旋转可能在两个轴上,这就是问题,因为旋转出错了.
我认为问题的存在是因为例如X轴和Z轴的方向一起存储在一个四元数中,我需要它单独地进行手工乘法X*Z(或Z*X),但是如何只使用一个四元数(差值四元数)?或者还有其他方法来纠正旋转场景吗?
编辑:
这张照片上有两个门户P1和P2,箭头显示它们是如何旋转的.在我看P1时,我会看到P2的内容.要找到我需要旋转主场景的旋转,就像这张图片中的虚拟场景,我正在做以下事情:
上述方法仅在差异仅在一个轴上发生时才有效.当一个门户在地板上或在天花板上时,这将不起作用,因为差异四元数是在多个轴上构建的.正如所建议的那样,我试图将P1的四元数乘以P2的四元数,反过来但这不起作用.

编辑2:
要找到从P2到P1的差异,我正在做以下事情:
Quat q1 = P1->getOrientation();
Quat q2 = P2->getOrientation();
Quat diff = Quat::diff(q2, q1); // q2 * diff = q1 //
Run Code Online (Sandbox Code Playgroud)
这是Quat :: diff函数:
GE::Quat GE::Quat::diff(const Quat &a, const Quat &b)
{
Quat inv = a;
inv.inverse();
return inv * b;
}
Run Code Online (Sandbox Code Playgroud)
逆:
void GE::Quat::inverse()
{
Quat q = (*this);
q.conjugate();
(*this) = q / Quat::dot((*this), (*this)); …Run Code Online (Sandbox Code Playgroud)