gpt4 book ai didi

3d - 如何反转相机矩阵中一个轴的旋转(例如 OSG CameraViewMatrix)

转载 作者:行者123 更新时间:2023-12-05 05:21:51 31 4
gpt4 key购买 nike

对于增强现实应用程序,我正在使用一些 slam 算法来预测我手机的当前方向。

算法 ( LSD-Slam ) 以 SE3 谎言组的形式提供当前姿势(使用 Sophus::Sim3f )。如果我做对了,这个类型包含一个矩阵,可以解释为相机的 Viewmatrix。初始化后,例如矩阵看起来像这样:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

为了可视化 3D 内容,我使用了 OpenSceneGraph。幸运的是,在 OSG 中,您可以直接使用 View 矩阵设置相机位置:

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

虽然一些尝试确实解决了俯仰问题,但他们随后弄乱了另一个轴。似乎总是至少有一个轴是错误的。 有人知道我该如何解决这个问题吗?我非常感谢有关此问题的任何提示。

最佳答案

如果您从库中获得的姿势对应于 OpenGL View 矩阵,您应该能够像您提到的那样将其直接传递给 osg 相机。

但是,请记住 OSG 采用行优先矩阵约定(参见示例 this post )因此您可能需要在矩阵中切换行/列。

如果这不起作用,我建议您确定 Sophus 使用的姿势约定(相对于世界坐标中的哪个静止位置的旋转)并重新创建相同的转换是 osg从零开始。

关于3d - 如何反转相机矩阵中一个轴的旋转(例如 OSG CameraViewMatrix),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41965563/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com