首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >得到两个变换矩阵之间的旋转矩阵(XNA)

得到两个变换矩阵之间的旋转矩阵(XNA)
EN

Stack Overflow用户
提问于 2012-06-03 16:00:08
回答 1查看 4.8K关注 0票数 8

我目前有一个AR标记检测系统,它检测场景中的标记,并给出场景中每个标记的摄像机变换矩阵。

假设我找到了两个标记。我试图找到旋转矩阵,我将必须应用其中一个标记,以使它与另一个标记的方向相匹配。

我想这应该和计算一个标记到另一个标记的变换矩阵和分解转换来得到x,y,z欧拉旋转矩阵一样,但是我似乎不能让它工作。我使用的是C#和XNA。

代码:

代码语言:javascript
复制
 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格式,我知道它们正确工作,因为我可以在屏幕上画角,它与摄像机所看到的相匹配。

EN

回答 1

Stack Overflow用户

发布于 2012-06-04 10:48:44

我最喜欢的解决办法是使用四元数。如果您有一个由q1描述的方向,另一个方向由q2描述,则可以通过

q1=q*q2

作为,Q,,你正在寻找的旋转。

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

您只需从rotation to quaternionquaternion to rotation转换。

只需确保您将四元数规范化,使其等效值为真。在我链接的页面中,您有所有必要的公式、解释,甚至是Java、c++中的代码。真的值得添加到收藏夹中。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10871793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档