我正在进行一个统一项目,我必须“手动”计算世界点的屏幕坐标。 (所以我不能使用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教程?
答案 0 :(得分:1)
您链接的两个教程描述了两个不同的内容。
olgdev.atspace.co.uk教程是关于经典的lookAt()相机或视图矩阵。该矩阵描述了从世界空间到相机空间的转换。
songho.ca一般描述了转换矩阵。让我们忽略他们标记为“左”的东西实际上应该是“正确的”。他们指出他们试图在这里做的是,只需查看列就可以轻松解码仿射变换矩阵的作用:x轴将被映射到最左边的列所说的,y轴到第二列, z到第三列,原件将翻译成第四列。
{1>},right
和up
矩阵在案例1中的世界空间中定义。但是,在第二个教程的情况下,它们表示在眼睛空间中得到基础。
所以从概念上讲,一个是彼此相反的。您给出的矩阵示例忽略了翻译部分。你剩下的只是旋转矩阵(所有3个向量形成一个标准正交基础),因此得到的矩阵就是正交的。而正交矩阵的逆是它的转置。
forward