在XNA中获取两个变换矩阵之间的旋转矩阵

8

我目前有一个用于增强现实的标记检测系统,它可以在场景中检测标记,并为场景中每个标记提供相机的变换矩阵。

假设我已经找到了两个标记。我正在尝试找到我必须应用于其中一个标记的旋转矩阵,以使其匹配另一个标记的方向。

我想应该与计算一个标记到另一个标记的变换矩阵并分解该变换来获得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

将其应用于我的代码后,我得到了以下结果:

enter image description here

实际旋转应该是:x:0 y:0 z:-0.52

我还注意到,y和z的值会根据我放置相机的方式而有很大变化。

从标记检测器获取的两个变换矩阵包含了相机相对于其中一个标记的方向和平移,如此处所述:http://www.hitl.washington.edu/artoolkit/documentation/tutorialcamera.htm。我已将它们转换为XNA格式,并且知道它们可以正确地工作,因为我可以在屏幕上绘制出角落,并且与相机看到的内容匹配。


我几乎可以确定欧拉角已经被正确计算了,但是它们是相对于相机相关的坐标系给出的。但是你想要得到相对于水平面的欧拉角,是吗? - fdermishin
1个回答

8
我最喜欢的解决方案是使用四元数。如果你有一个用q1描述的方向和另一个用q2描述的方向,你可以通过以下方式从一个方向到另一个方向:

q1=q*q2

其中q是你要查找的旋转。

q = q1 * (q2)^-1; q = q1 * conj(q2);

你只需要从旋转转换为四元数四元数转换为旋转即可。
请确保对四元数进行标准化,以使等价性成立。在我提供的链接中,你将找到所有必要的公式、解释,甚至包括Java、C++代码。非常值得收藏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接