2

我刚开始阅读蓝皮书的最初章节,并了解到投影矩阵可用于修改我们所需坐标系到真实屏幕坐标的映射。可用于重置坐标系,并通过以下方式将其从左、右、上、下从-1更改为1(以示例为例)

glMatrixMode(GL_PROJECTION);
glLoadIdentity(); //With 1's in the diagonal of the identity matrix, the coordinate system is rest from -1 to 1 (and the drawing should happen then inside those coordinates which be mapped later to the screen)

另一个例子:(宽度:1024,高度:768,纵横比:1.33)要更改坐标系,请执行以下操作:

glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 100.0, 1000.0);

我希望 OpenGL 的坐标系在左侧变为 -133,在右侧变为 133,在底部变为 -100,在顶部变为 100。使用这些坐标,我知道绘图将在这些坐标内完成,并且这些坐标之外的任何内容都将被剪裁。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
    glOrtho(-100 * aspectRatio, 100 * aspectRatio, -100, 100, 100, 1000);
glMatrixMode(GL_MODELVIEW);
    glRectf(-50.0, 50.0, 200, 100);

但是,上面的命令并没有在屏幕上给我任何输出。我在这里想念什么?

4

1 回答 1

2

我在这里看到两个问题:

  1. 矩形根本应该显示,因为 glRectf() 在深度 z=0 处绘制,但是您将正交投影设置为覆盖 z 范围 [100,1000],因此对象位于近平面之前并且应该被剪裁离开。
  2. 您没有指定您使用的 MODELVIEW 矩阵。在评论中,您提到该对象确实出现了,但没有出现在您期望的地方。这也违反了我的第一点,但如果 ModelView 矩阵不是单位可以解释。

所以我建议首先使用一个不同的投影矩阵,比如 glOrtho(..., -1.0f, 1.0f); 以便实际覆盖 z=0,然后在上述代码中的 glMatrixMode(GL_MODELVIEW) 之后插入一个 glLoadIdentity() 调用。

另一种方法是保持 glOrtho() 原样并指定一个平移矩阵,它将矩形移动到 z=100 和 z=1000 之间的某个位置。

于 2013-05-12T12:51:22.360 回答