0

现在我通过以下代码初始化我的 OpenGL 视图:

glLoadIdentity();
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);               
glOrtho(0.0, w, 0.0, h, -1.0, 10.0); 

我看起来应该看起来。
但它的 Ethological 观点。我想要透视视图。所以我尝试用以下方式初始化它:

glLoadIdentity();
glViewport(0, 0, w, h);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);               
gluPerspective(60, w/h, 0.1, 100);
glTranslatef(0.0,0.0,-5.0);
4

1 回答 1

0

我究竟做错了什么?

您的第一个误解是考虑“初始化”。OpenGL 是一个状态机,您需要在整个程序中根据需要设置状态。那些你称之为“初始化”的调用实际上属于绘图代码。

第二:投影矩阵有点像OpenGL的“镜头”,因此各种投影都属于那里,而且只有那里,这也适用于gluPerspective(它不是OpenGL的一部分,而是GLU,一个第三方库,最终调用glFrustum) .

在您的原始代码中,您将正交限制设置为视口大小,即您将看到世界空间坐标率(0,0)到(宽度,高度)。该世界空间卷中的所有内容都将填满视图。在透视的情况下,您会得到一个以 Z 轴为中心对称的查看体积,并且取决于近平面和远平面通常会覆盖大约 (-near*aspect, -near) 到 (+near*aspect, near) 的内容剪裁平面附近。在您的情况下,这将类似于 -0.1,-0.1 到 0.1,0.1,这是一个非常小的体积,只会在很大程度上放大您的图像。

如何解决这个问题?

  1. 了解 OpenGL 的工作原理
  2. 停止货物崇拜编程,即只是将教程中的代码复制并粘贴到可能看起来正确的地方,而没有真正了解发生了什么。

现在,在您的情况下,我强烈怀疑您是否真的想要“将图像放在这里”背景的透视图,但仅适用于在此之上绘制的任何内容。还记得我告诉过你 OpenGL 是一个状态机吗?好吧,原因如下:因为您应该在这两个绘图阶段之间切换投影:

  1. 使用正射投影绘制背景
  2. 使用顶部的透视投影绘制您想要的任何其他内容。
于 2012-07-23T08:39:00.687 回答