我目前有一个用于增强现实的标记检测系统,它可以在场景中检测标记,并为场景中每个标记提供相机的变换矩阵。
假设我已经找到了两个标记。我正在尝试找到我必须应用于其中一个标记的旋转矩阵,以使其匹配另一个标记的方向。
我想应该与计算一个标记到另一个标记的变换矩阵并分解该变换来获得x、y、z欧拉旋转矩阵是一样的,但我似乎无法让它起作用。 我正在使用带XNA的C#编写代码。
代码如下:
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欧拉旋转?
编辑:
我在这里找到了一个将四元数转换为按照x、y、z顺序的欧拉角的函数: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格式,并且知道它们可以正确地工作,因为我可以在屏幕上绘制出角落,并且与相机看到的内容匹配。