8

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

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

我认为它应该与计算一个标记到另一个标记的变换矩阵并分解变换以获得 x,y,z 欧拉旋转矩阵相同,但我似乎无法让它工作。我将 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 欧拉旋转?

编辑:

我在这里找到了一个按照 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 格式,我知道它们可以正常工作,因为我可以将角绘制到屏幕上,并且它与相机所看到的相匹配。

4

1 回答 1

7

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

q1=q*q2

q你正在寻找的旋转。

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

你只需要从rotation 转换为 quaternionquaternion 到 rotation

只要确保对四元数进行归一化,这样等价就成立了。在我链接的页面中,您拥有所有必要的公式、解释,甚至是 Java、c++ 中的代码。真的值得添加到收藏夹。

于 2012-06-04T10:48:44.130 回答