1

我在 java 中使用 OpenGL 和 LWJGL 库。据我了解,您可以使用 glFrustum 设置顶部、底部、左侧、右侧、近处和远方坐标,然后使用 glViewport 将这些坐标与屏幕相关联,这是正确的吗?我假设这是因为我读过的任何内容都没有说明,这就是我使用正交模式时的工作方式。为了扩展我的问题,我这样设置我的应用程序(在 c 语法中)

glFrustum(-100, 100, -100, 100, -100, 100);
glViewport(0, 0, 800, 600); // the screen size is 800 by 600

. . .

glBegin(GL_QUADS); //draw a rectangle
glVertex2f(-0.25f, -0.25f);
glVertex2f(0.25f, -0.25f);
glVertex2f(0.25f, 0.25f);
glVertex2f(-0.25f, 0.25f);
glEnd();

在 x 和 y 轴上使用 -100-----0-----100 的坐标系,我怎么可能得到一个大小看起来像我提供的坐标已经相乘的矩形到 10 点?

4

1 回答 1

3

据我了解,您可以使用 glFrustum 设置顶部,底部,左侧,右侧,近处和远方坐标

不完全的。glFrustum创建一个仿射透视投影矩阵,具有棱锥的形状,尖端切割为 - 截头锥体。如果您将该金字塔延伸到尖端,则尖端位于坐标(0,0,0),近参数定义 XY 平面到 Z 方向上的尖端的距离,作为“切割”该金字塔的位置。远平面给出了到金字塔底部的距离。left、right、top 和 bottom 参数定义了金字塔的边与近平面相交的位置,这意味着金字塔不需要对称。它也可以移动。

然后您使用 glViewport 将这些坐标与屏幕相关联,这是正确的吗?

OpenGL是一个状态机。您调用设置这些状态的顺序无关紧要。您可以随时更改每个状态,无论如何。仅当先前的状态有助于设置新状态的数据/参数时,顺序才重要。矩阵运算就是一个例子,因为它在前一个状态上进行运算。但是 glViewport 与此无关。

怎么可能在 x 和 y 轴上使用 -100-----0-----100 的坐标系,我得到一个大小看起来像我提供的坐标已经相乘的矩形到 10 点?

因为你没有建立一个有效的截锥体。平截头体投影的近平面和远平面不得有相反的符号。通常你希望他们都是积极的。近平面距离也必须非零。

您定义“平截头体”的方式就像沙漏一样。此外,您的顶点位于 Z = 0,因此它们位于该平截头体的奇点中,并且在那里可能发生任何事情。

我认为您实际上想要一个正射投影。

于 2012-04-13T12:22:07.867 回答