1

在之前的项目中,我启用了深度测试,使用在启动时调用一次的gluPerspective来设置 3D 空间。目前,在使用以下代码初始化 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();

我正在寻找的是一种设置视角的方法,以便在世界空间中呈现形状。例如,下面的代码片段应该会渲染一个 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 空间的任何步骤,如果gluPerspective用于执行此操作,是否有任何建议为什么它不起作用?

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

4

1 回答 1

2

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


在透视投影中,投影矩阵描述了从针孔相机看到的世界中的 3D 点到视口的 2D 点的映射。
对象在视口上的投影大小取决于其与相机的距离。不同距离(深度)的不同尺寸造成透视效果。透视投影矩阵定义了一个视锥体

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

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

因此,长度为 200 的对象覆盖 200 像素的距离恰好为 1。例如,如果您的视野角为 90°,则 az 距离为窗口高度的一半(height /2)且垂直尺寸为 200 的对象覆盖 200 像素(垂直),因为tan(90° / 2) * 2 = 2

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

请注意,如果您要使用正交投影,则对象的大小与距离无关。

于 2020-07-07T17:25:13.363 回答