行与列相机转换矩阵

时间:2015-07-06 14:34:35

标签: opengl math unity3d

我正在进行一个统一项目,我必须“手动”计算世界点的屏幕坐标。 (所以我不能使用Camera.WorldToScreen()等。)

此时我很困惑,甚至不知道谷歌要澄清这一点。

我从this教程开始,并构建了一个创建像这样的

相机变换矩阵的方法
right_x,   right_y,   right_z,   0;
up_x,      up_y,      up_z,      0;
forward_x, forward_y, forward_z, 0;
0,         0,         0,         1;

直到我使用了否定的前向向量,这才起作用。

right_x,    right_y,    right_z,    0;
up_x,       up_y,       up_z,       0;
-forward_x, -forward_y, -forward_z, 0;
0,          0,          0,          1;

在这次改变之后它运作得很好。

后来我使用了this tutorial来完成所有缺失的步骤。作者创建了一个不同的矩阵:

left_x, up_x, forward_x, 0;
left_y, up_y, forward_y, 0;
left_z, up_z, forward_z, 0;
0,      0,    0,         1;

我试图理解这一点时发现的所有其他教程也使用这种矩阵。它们将向量作为列而不是行插入。尽管这两个教程都是针对openGL的,但只有其中一个适用于我。

有人可以向我解释一下这个区别吗?为什么会这样? 有人可以解释为什么我必须反转我的前向矢量吗?

我的猜测是这两个问题都与openGL如何使用右手有关,Unity使用左手坐标系。但在这种情况下我不明白,为什么有两个不同的OpenGL教程?

1 个答案:

答案 0 :(得分:1)

您链接的两个教程描述了两个不同的内容。

  1. olgdev.atspace.co.uk教程是关于经典的lookAt()相机或视图矩阵。该矩阵描述了从世界空间到相机空间的转换。

  2. songho.ca一般描述了转换矩阵。让我们忽略他们标记为“左”的东西实际上应该是“正确的”。他们指出他们试图在这里做的是,只需查看列就可以轻松解码仿射变换矩阵的作用:x轴将被映射到最左边的列所说的,y轴到第二列, z到第三列,原件将翻译成第四列。

  3. {1>},rightup矩阵在案例1中的世界空间中定义。但是,在第二个教程的情况下,它们表示在眼睛空间中得到基础。 所以从概念上讲,一个是彼此相反的。您给出的矩阵示例忽略了翻译部分。你剩下的只是旋转矩阵(所有3个向量形成一个标准正交基础),因此得到的矩阵就是正交的。而正交矩阵的逆是它的转置。

    forward