我现在有一个AR标记检测系统,它检测场景中的标记,并为场景中的每个标记提供摄像机的变换矩阵。
假设我找到了2个标记。我试图找到旋转矩阵,我将不得不应用于其中一个标记,以使其与另一个标记的方向相匹配。
我认为它应该与计算一个标记到另一个标记的变换矩阵并分解变换以获得x,y,z euler旋转矩阵相同,但我似乎无法使其工作。我正在使用C#和XNA。
在代码中:
Matrix marker1 = markerTransforms[0];
Matrix marker2 = markerTransforms[1];
Matrix relativeTransform = Matrix.Invert(marker1) * marker2;
Quaternion rotation;
Vector3 scale;
Vector3 translation;
relativeTransform.Decompose(out scale, out rotation, out translation);
Matrix rotationMatrix = Matrix.CreateFromQuaternion(rotation);
以上情况似乎不起作用。
另一个问题是如何从旋转矩阵中提取x,y,z euler旋转?
编辑:
我找到了一个函数,可以按照x,y,z顺序将四元数转换为euler:http://forums.create.msdn.com/forums/p/4574/23763.aspx
将此应用于我的代码我得到以下结果:
实际旋转应为:x:0 y:0 z:-0.52
我还注意到y和z的变化很大,取决于我如何定位相机。
我从标记检测器获得的两个变换矩阵包含相机相对于其中一个标记的方向和平移,如下所述:http://www.hitl.washington.edu/artoolkit/documentation/tutorialcamera.htm 我已将它们转换为XNA格式,我知道它们可以正常工作,因为我可以在屏幕上绘制角落,它与相机所看到的相匹配。
答案 0 :(得分:7)
我最喜欢的解决方案是使用四元数。如果你有一个由 q1 描述的方向,以及 q2 描述的其他方位,你可以通过
从一个方向到另一个方向Q 1 = Q * Q2
q 您正在寻找的轮换。
q = q1 *(q2)^ - 1; q = q1 * conj(q2);
您只需转换rotation to quaternion和quaternion to rotation。
确保规范化四元数以使等价为真。在我链接的页面中,您拥有所有必要的公式,解释,甚至是Java,c ++中的代码。真的值得添加到收藏夹。