GLFW3/GLU 3D 世界 space 使用静态管线

GLFW3/GLU 3D world space using static pipeline

在以前的项目中,我启用深度测试 gluPerspective 在启动时调用一次以设置 3D space。目前,在使用以下代码初始化 3D 世界后,我正在渲染一个 -0.5 和 0.5 之间的正方形,其原点为 0.0 将导致正方形覆盖整个屏幕:

glBegin(GL_QUADS);
{
  glVertex3f(-0.5, -0.5, 0);
  glVertex3f(-0.5, 0.5, 0);
  glVertex3f(0.5, 0.5, 0);
  glVertex3f(0.5, -0.5, 0);
}
glEnd();

我正在寻找的是一种设置视角的方法,以便在世界中呈现形状 space。例如,下面的代码片段应该会导致呈现一个 200x200 的正方形:

glBegin(GL_QUADS);
{
  glVertex3f(-100, -100, 0);
  glVertex3f(-100, 100, 0);
  glVertex3f(100, 100, 0);
  glVertex3f(100, -100, 0);
}
glEnd();

下面的代码是我目前用来初始化 3D 世界的代码。

// WINDOW_WIDTH = 1600, WINDOW_HEIGHT = 900
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(47, WINDOW_WIDTH / WINDOW_HEIGHT, 0.01, 1000);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glEnable(GL_DEPTH_TEST);

我是否错过了设置 3D 的任何步骤 space,如果使用 gluPerspective 来执行此操作,有什么建议为什么它不起作用?

我可以使用 ortho 在 2D 中实现这一点,重要的是世界是 3D 的。 一切都是用 C 编写的,使用 OpenGL 和 GLU 最高 1.3,我的 GLFW 设置与 this 相同。由于技术限制,我无法使用现代管道。

首先,WINDOW_WIDTH / WINDOW_HEIGHT的结果是1,因为WINDOW_WIDTHWINDOW_HEIGHT是整数值。您必须执行浮点除法 ((float)WINDOW_WIDTH / WINDOW_HEIGHT) 才能计算出正确的纵横比。


在透视投影中,投影矩阵描述了从针孔相机看到的世界中的 3D 点到视口的 2D 点的映射。
对象在视口上的投影大小取决于它到相机的距离。不同距离(深度)下的不同尺寸会造成透视效果。 perspective projection matrix defines a Viewing frustum

投影尺寸与到相机的距离之比取决于视角:

maxDim / cameraZ = tan(FOV / 2) * 2

所以长度为200的物体恰好有1个距离覆盖了200个像素。例如,如果您的视野角为 90°,则对象的 z 距离为 window 高度的一半( 高度 /2)且垂直尺寸为 200覆盖 200 像素(垂直)因为 tan(90° / 2) * 2 = 2.

当你使用gluPerspective时,你定义了沿y轴的视角。沿 x 轴的视野取决于纵横比。如果宽高比设置正确,那么平行于视图xy平面的正方形投影仍然是正方形。

请注意,如果您使用 orthographic projection,则对象的大小与距离无关。