我目前有一个AR标记检测系统,它检测场景中的标记,并给出场景中每个标记的摄像机变换矩阵。
假设我找到了两个标记。我试图找到旋转矩阵,我将必须应用其中一个标记,以使它与另一个标记的方向相匹配。
我想这应该和计算一个标记到另一个标记的变换矩阵和分解转换来得到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:0y:0z:-0.52
我还注意到,y和z的变化很大,取决于我定位相机的方式。
我从标记检测器获得的两个变换矩阵包含相机相对于其中一个标记的方向和平移,如这里所解释的那样:http://www.hitl.washington.edu/artoolkit/documentation/tutorialcamera.htm,我将它们转换成XNA格式,我知道它们正确工作,因为我可以在屏幕上画角,它与摄像机所看到的相匹配。
发布于 2012-06-04 10:48:44
我最喜欢的解决办法是使用四元数。如果您有一个由q1描述的方向,另一个方向由q2描述,则可以通过
q1=q*q2
作为,Q,,你正在寻找的旋转。
q= q1 * (q2)^-1;q= q1 * conj(q2);
您只需从rotation to quaternion和quaternion to rotation转换。
只需确保您将四元数规范化,使其等效值为真。在我链接的页面中,您有所有必要的公式、解释,甚至是Java、c++中的代码。真的值得添加到收藏夹中。
https://stackoverflow.com/questions/10871793
复制相似问题