我在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?
答案 0 :(得分:3)
据我了解,您可以使用glFrustum设置顶部,底部,左侧,右侧,近侧和远侧坐标
不完全。 glFrustum
创建了一个仿射透视投影矩阵,其形状为金字塔形,尖端切割为 - 平截头体。如果您将该金字塔延伸到尖端,则尖端位于坐标(0,0,0)
处,near参数定义XY平面与Z方向上的尖端的距离,以及" cut&# 34;那个金字塔。远平面给出了金字塔底座的距离。左,右,顶部和底部参数定义,其中金字塔的边与近平面相交,这意味着金字塔不需要是对称的。它也可以移动。
然后你使用glViewport将这些坐标与屏幕联系起来,这是正确的吗?
OpenGL是一个状态机。您调用这些状态的顺序并不重要。无论如何,您可以随时更改每个州。如果先前的状态有助于设置新状态的数据/参数,则顺序仅重要。矩阵运算是一个例子,因为它在先前的状态下运行。但glViewport独立于此。
如果在x和y轴上坐标系为-100 ----- 0 ----- 100,我得到一个大小看起来像我提供的坐标的矩形怎么可能?已经乘以10?
因为你没有建立有效的视锥体。平截头体投影的近和远平面不得有相反的符号。通常你希望它们都是积极的。近平面距离也必须非零。
您定义"视锥体的方式"形状像沙漏。你的顶点也是Z = 0,所以它们在那个平截头体的奇点上,任何事情都可能发生在那里。
我认为你实际上想要一个正射投影。