C++ 在OpenGL中设置绘图坐标系

C++ 在OpenGL中设置绘图坐标系,c++,algorithm,opengl,3d,C++,Algorithm,Opengl,3d,我刚开始阅读蓝皮书的最初几章,了解到投影矩阵可以用来修改我们想要的坐标系到真实屏幕坐标的映射。它可用于重置坐标系,并通过以下操作(例如)将其从左、右、上、下的-1更改为1 另一个示例:(宽度:1024,高度:768,纵横比:1.33)要更改坐标系,请执行以下操作: glOrtho(-100.0*aspectRatio,100.0*aspectRatio,-100.0,100.0,100.0,1000.0) 我希望OpenGL的坐标系在左边变为-133,在右边变为-133,在底部变为-100,在顶

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

另一个示例:(宽度: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);

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

我看到了两个问题:

  • 由于glRectf()在深度z=0处绘制,因此rect应完全不显示,但您设置了正交投影以覆盖z范围[1001000],因此对象位于近平面之前,应将其剪裁掉
  • 您没有指定您使用的MODELVIEW矩阵是什么。在注释中,您提到对象确实显示,但不在您期望的位置。这也违反了我的第一点,但如果ModelView矩阵不是identity,则可以解释这一点
  • 所以我建议首先使用不同的投影矩阵,比如glOrtho(…,-1.0f,1.0f);因此z=0实际上已包含在内,然后在上述代码中的glMatrixMode(GL_MODELVIEW)之后插入一个glLoadIdentity()调用


    另一种方法是保持glOrtho()不变,并指定一个转换矩阵,将rect移动到z=100和z=1000之间的某个位置。

    您不应该使用不推荐使用的API!在当前的API中,坐标系的设置有很大不同(您必须自己设置),学习一个不推荐的API是浪费时间。@FelixK.:你能在这里指出最新的正确方法吗。我甚至不确定它到底是什么。也许你没有设定颜色。我建议您为OpenGL3或更高版本做一些教程,以了解其中的诀窍。我无法告诉您上面的代码有什么问题,因为我上次使用它是在5年或更长时间以前。但您应该为所有图形代码使用着色器和顶点缓冲区。对于设置相机等,你可以使用C++的LIB,其中有很多。当然,也有一些很好的教程(例如),它们都是针对OpenGL ES的,这是一种有限的OpenGL,但对初学者来说效果很好。
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
        glOrtho(-100 * aspectRatio, 100 * aspectRatio, -100, 100, 100, 1000);
    glMatrixMode(GL_MODELVIEW);
        glRectf(-50.0, 50.0, 200, 100);