我现在有一个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);
Run Code Online (Sandbox Code Playgroud)
以上情况似乎不起作用.
另一个问题是如何从旋转矩阵中提取出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格式,我知道它们可以正常工作,因为我可以在屏幕上绘制角落,它与相机所看到的相匹配.