opengl 如何从滚动、俯仰和偏航中获得摄像机向上矢量?

iibxawm4  于 2022-11-23  发布在  其他
关注(0)|答案(3)|浏览(118)

我需要从滚动、俯仰和偏航Angular (以度为单位)得到一个相机的向上矢量(以获得正确的外观)。我已经尝试了几个小时的不同事情,但没有运气:(。任何帮助都将不胜感激!

ngynwnxp

ngynwnxp1#

Roll、Pitch和Yaw定义了3个轴旋转。从这些Angular ,您可以构建一个3x 3变换矩阵,表示该旋转(see here how)。
在得到这个矩阵之后,你可以把你的常规向上向量,比如说(0,1,0),如果“向上”是Y轴,然后把它乘以这个矩阵,你会得到变换后的向上向量。

编辑-

对(0,1,0)应用变换与取中间行是一样的。矩阵的3行构成旋转系统的正交基。请注意,3D图形API使用4x 4矩阵。因此,要从3x 3旋转矩阵生成4x 4矩阵,您需要在M[3][3](角)处添加“1”,并在其余位置添加零,如下所示:

r r r 0
r r r 0 
r r r 0
0 0 0 1
kuarbcqp

kuarbcqp2#

这可能不能直接回答你的问题,尽管它可能仍然有帮助。我有一个免费的XNA开源项目,它创建了一个调试终端,在游戏运行时覆盖游戏。你可以使用它来查找值、调用方法或其他任何东西。所以,如果你有一个转换矩阵,并且你想在游戏运行时提取它的各个部分,你可以做到这一点。该项目可以在这里找到:http://www.protohacks.net/xna_debug_terminal
我对你所使用的数学没有太多的专业知识,但希望Shoosh的帖子能对你有所帮助。也许调试终端能在你尝试他的想法或将来遇到任何其他问题时帮助你。

rdlzhqv9

rdlzhqv93#

十二年后......
如果有人仍然对这个问题的答案感兴趣,这里有一个解决方案(即使在Java中很坚韧,但在其他语言中翻译应该很容易):

private Vector3f getRayFromCamera() {
        float rx = (float)Math.sin((double)getYaw() * (double)(Math.PI / 180)) * -1 * (1-Math.abs((float)Math.cos((double)getPitch() * (double)(Math.PI / 180) - 90 * (Math.PI / 180)) * -1));
        float ry = (float)Math.cos((double)getPitch() * (double)(Math.PI / 180) - 90 * (Math.PI / 180)) * -1;
        float rz = (float)Math.cos((double)getYaw() * (double)(Math.PI / 180)) * -1 * (1- Math.abs((float)Math.cos((double)getPitch() * (double)(Math.PI / 180) - 90 * (Math.PI / 180)) * -1));
        return new Vector3f(rx, ry, rz);
    }

注意:这将计算前向量,但当与向量(0,1,0)相乘时,您可以更改它!

相关问题