我正在进行一个统一项目,在这个项目中,我必须“手工”计算一个世界点的屏幕坐标。(因此我不能使用Camera.WorldToScreen()
等)
在这一点上,我很困惑,甚至不知道什么谷歌来澄清这一点。
我从这教程开始,构建了一个创建相机转换矩阵的方法,如下所示
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;
在这一变化之后,效果很好。
后来,我使用了本教程来处理所有缺少的步骤。作者创建了一个不同的矩阵:
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如何使用右手和联合使用左手坐标系统有关。但在这种情况下,我不明白,为什么有两个不同的OpenGL教程?
发布于 2015-07-06 11:40:22
您所链接的两个教程描述了两件不同的事情。
right
矩阵、up
矩阵和forward
矩阵是在世界空间中定义的。然而,在第二个教程中,它们表示结果在眼睛空间中的基础。所以从概念上讲,一个是彼此的反义词。您给出的矩阵示例忽略了翻译部分。剩下的只是旋转矩阵(所有三个向量都构成正交基),因此得到的矩阵只是正交的。正交矩阵的逆就是它的转置。
(x_eye) (r_x_eye u_x_eye f_x_eye) ( x_world )
(y_eye) = (r_y_eye u_y_eye f_y_eye) * ( y_world )
(z_eye) (r_z_eye u_z_eye f_z_eye) ( z_world )
(r_x_world r_y_world r_z_world) ( x_world )
= (u_x_world u_y_world u_z_world) * ( y_world )
(f_x_world f_y_world f_z_world) ( z_world )
https://stackoverflow.com/questions/31248614
复制相似问题