如何反转相机矩阵中一个轴的旋转(例如OSG相机视图矩阵)

3
我是一名有用的助手,可以为您翻译文本。
针对增强现实应用程序,我正在使用一些slam算法来预测我的手机的当前方向。
该算法(LSD-Slam)以SE3李群的形式提供当前姿态(使用Sophus::Sim3f)。如果我理解正确,这种类型包含一个可以解释为相机视图矩阵的矩阵。在初始化之后,例如,矩阵看起来像这样:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

为了可视化3D内容,我使用OpenSceneGraph。幸运的是,在OSG中,您可以直接使用视图矩阵来设置相机位置:
camera->setViewMatrix(matrix);

现在,当我运行代码时,如果我绕Y轴(横滚)或Z轴(偏航)旋转,似乎一切正常。但是当我绕X轴(俯仰)旋转时,我的OSG数字相机似乎与它应该做的完全相反。

例如:想象一个3D模型直接在相机前面。如果我缓慢地将相机向上倾斜(绕X轴),3D模型也会向上移动,而实际上它应该在屏幕底部离开。我尝试用以下图形说明这种行为:axis behaviour

可能有一个非常简单的解决方案,但即使尝试了几个小时,我也无法解决。如果我理解正确,第一列代表围绕某个轴的旋转,所以我尝试反转单个向量,例如这样做:

u u u 0       -u u u 0          -u -u -u 0
v v v 0   =>  -v v v 0   ...     v v v 0 
n n n 0       -n n n 0           n n n 0
0 0 0 1        0 0 0 1           0 0 0 1

虽然一些尝试已经解决了音高问题,但他们却搞砸了另一个轴...似乎总有至少一个轴是错误的。有人知道我该如何解决这个问题吗? 我真的很感激任何关于这个问题的提示。

2个回答

1
如果您从库中获得的姿势对应于OpenGL视图矩阵,则可以像您提到的那样将其直接传递给osg相机。
但是,请记住,OSG采用行主矩阵约定(例如参见this post),因此您可能需要在矩阵中切换行/列。
如果这不起作用,我建议您确保Sophus使用的姿势约定(相对于哪个世界坐标系的哪个休息位置旋转)并从头开始重新创建与之相同的变换。

谢谢你的回答,交换行/列没有帮助。所以我按照你的建议再次检查了Sophus。我接受了你的答案,但如果有人遇到类似的问题,我会发布自己的答案。 - Christoph Göttert

1

在重新检查Sophus后,我发现可以单独获得旋转矩阵和平移向量。使用this post,我将旋转矩阵转换为欧拉角。有了欧拉角,我能够单独设置每个轴的旋转:

  rotationMatrix.makeRotate(
  osg::DegreesToRadians(-angleZ), osg::Vec3(0,1,0), // roll
  osg::DegreesToRadians(angleX), osg::Vec3(1,0,0) , // pitch
  osg::DegreesToRadians(angleY), osg::Vec3(0,0,1) ); // heading

翻转滚动最终起了作用...


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