C 用于openGL的DIY相机变换

C 用于openGL的DIY相机变换,c,opengl,C,Opengl,我正在做我自己的世界->cam变换,而不是使用gluLookAt。我是按照信息,但我得到了一个最终4x4模型视图转换不同的翻译标志 这篇文章说,因为我们向下看x轴,所以世界是由相机的负位置来平移的。。然后他们用眼睛翻译,这在我的代码中是-camPos 我认为这是不对的,因为opengl是右手操作的,相机通常向下看屏幕。因此,正确的翻译转换应该是+camPos 结果如下: -1.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.00

我正在做我自己的世界->cam变换,而不是使用gluLookAt。我是按照信息,但我得到了一个最终4x4模型视图转换不同的翻译标志

这篇文章说,因为我们向下看x轴,所以世界是由相机的负位置来平移的。。然后他们用眼睛翻译,这在我的代码中是-camPos

我认为这是不对的,因为opengl是右手操作的,相机通常向下看屏幕。因此,正确的翻译转换应该是+camPos

结果如下:

-1.0000 0.0000 0.0000 0.0000
 0.0000 1.0000 0.0000 0.0000
 0.0000 0.0000 -1.0000 0.0000
  0.0000 0.0000 -150.0000 1.0000
当我阅读这篇文章时,我得到了不同符号+150的翻译。我计算旋转矩阵R,然后平移T。然后,用glLoadMatrix加载T*R的转置,因为opengl是右手的,本文讨论的是左手坐标系

-1.0000 0.0000 0.0000 0.0000
0.0000 1.0000 0.0000 0.0000
 0.0000 0.0000 -1.0000 0.0000
 0.0000 0.0000 150.0000 1.0000

问题是,这篇文章正确吗

OpenGL本身不是左撇子或右撇子。OpenGL的剪辑和窗口空间通常被认为是右手的,但如果你真的想使用的话,也可以反过来使用


在经典的固定功能管道中,眼睛和物体空间通常是左手定义的。gluLookAt使用此约定。此外,gluPerspective/glFrustum/Glorth使用此约定作为近距离和远距离的正值,实际上是指眼睛空间中的负z值。这些投影矩阵通常会改变惯用手。

如果说GL_MODELVIEW矩阵是右手矩阵,而摄影机矩阵是左手矩阵,那你就对了。。。我将阅读这篇文章,看看是否可以得到更多的结论。NDC,在最后的视口变换为左手变换之前,最终进入的坐标空间。这是OpenGL中唯一一个您无法控制的坐标空间,z=-1始终是最近的深度,z=1始终是最远的深度。深度范围、投影和modelview矩阵都可以在不同的用手方式下使用不同的中间坐标空间,只要最终产品在逻辑上映射到左手NDC。在固定功能管道中,投影之前的一切都是右手的,投影矩阵/深度范围是产生适当NDC的原因。
-1.0000 0.0000 0.0000 0.0000
0.0000 1.0000 0.0000 0.0000
 0.0000 0.0000 -1.0000 0.0000
 0.0000 0.0000 150.0000 1.0000