C++ opengl为什么我的矩形如此大和倾斜?

C++ opengl为什么我的矩形如此大和倾斜?,c++,opengl,C++,Opengl,我有一个opengl项目,我只是想在屏幕上画一个红色的矩形,问题是1)它很大,几乎占据了整个屏幕,2)它倾斜。我对opengl非常陌生,所以我不了解坐标系,也不了解一些函数的功能,比如glOrtho()函数 代码如下: void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_QUADS); glColor3f(1, 0, 0); // NOT SURE W

我有一个opengl项目,我只是想在屏幕上画一个红色的矩形,问题是1)它很大,几乎占据了整个屏幕,2)它倾斜。我对opengl非常陌生,所以我不了解坐标系,也不了解一些函数的功能,比如glOrtho()函数

代码如下:

void display()
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   glBegin(GL_QUADS);     
      glColor3f(1, 0, 0);  // NOT SURE WHERE THIS STARTS, AND HOW THE COORDINATES WORK
        glVertex2f(-1.0f, 1.0f); 
        glVertex2f( 1.0f, 1.0f);  
        glVertex2f( 1.0f,-1.0f);        
        glVertex2f(-1.0f,-1.0f);   
    glEnd();                  

   glFlush();
}

void init()
{
   glClearColor(0.0, 0.0, 0.0, 1.0);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(0, 10.0, 0, 10.0, -1.0, 1.0); //What does this do and how does it's coordinates work?
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glRotatef(30.0, 1.0, 1.0, 1.0);
   glEnable(GL_DEPTH_TEST);
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(250, 250);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
    glutCreateWindow("Model View");


    glutDisplayFunc(display);

   init();
    glutMainLoop();

    return 0;
}

无论如何,我更愿意把它变成一种学习体验,所以请解释并链接到有帮助的东西!谢谢。

因为你看起来很有趣:)

您已经在(1,1)到(-1,-1)//display()中创建了一个红方块

然后说相机将使用正交投影//格洛托 (它创建一个投影矩阵,使用一个点来放置相机并为其提供方向)

旋转模型*视图可能会有点倾斜*


PS您必须将gl命令视为发送到gl子系统的消息,这些消息会改变其各种状态、场景中的内容、相机所在位置、灯光所在位置等。。等等。

因为你觉得它很有趣:)

您已经在(1,1)到(-1,-1)//display()中创建了一个红方块

然后说相机将使用正交投影//格洛托 (它创建一个投影矩阵,使用一个点来放置相机并为其提供方向)

旋转模型*视图可能会有点倾斜*


PS您必须将gl命令视为发送到gl子系统的消息,这些消息会改变其各种状态、场景中的内容、相机所在位置、灯光所在位置等。。等。

程序显示负责实际绘图

void display()
{
该行清除缓冲区;缓冲区基本上是渲染图像的内存;它基本上是一个宽度和高度为600x600的矩阵。清除意味着将矩阵的每个单元格设置为相同的值。每个单元都是一个像素,包含一种颜色和一个深度。通过此调用,您将告诉OpenGL将所有内容绘制为不透明黑色,并将深度重置为1。为什么是不透明的黑色?由于您调用了glClearColor:前三个参数是红色、绿色和蓝色分量,它们的范围可以在0到1之间。0,0,0表示黑色。对于指定的最后一个组件1,表示不透明;0将是透明的。最后一个组件称为alpha,在启用alpha混合时使用。为什么净空深度为1?因为1是默认值,而您没有调用以覆盖该值

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
这是告诉OpenGL您想要绘制四边形

   glBegin(GL_QUADS);
您希望这些四边形为红色(请记住,颜色的第一个分量是红色)

现在列出四边形的顶点(只有一个、四个顶点);所有顶点都将为红色,因为您从未通过调用glColor3f来更新颜色;您可以将不同的颜色关联到每个顶点,如果选择红色(1,0,0)、绿色(0,1,0)、蓝色(0,0,1)和白色(1,1,1),最终结果通常非常可爱;该四边形在屏幕上应显示为正方形,因为它在几何上是正方形,您的窗口是正方形,并且相机(使用glOrtho定义)具有正方形外观(调用glOrtho的前四个参数)。如果您没有调用glOrtho,您可能只会看到红色,因为默认的OpenGL坐标范围在-1和1之间,因此您覆盖了整个窗口

        glVertex2f(-1.0f, 1.0f); 
        glVertex2f( 1.0f, 1.0f);  
        glVertex2f( 1.0f,-1.0f);        
        glVertex2f(-1.0f,-1.0f);   
这意味着您已完成绘图

    glEnd();                  
从技术上讲,可能是OpenGL没有向图形卡发送您指定的任何命令;出于效率原因,命令可能会排队。调用会强制将命令发送到图形卡

   glFlush();
}
您编写了这个函数init来初始化一些OpenGL状态,您认为这些状态在整个应用程序中保持稳定。在现实中,像游戏这样的真实应用程序会显示这些内容的大部分。例如,当玩家移动时,游戏必须不断更新相机

void init()
{
正如我们之前所说的,这里将透明颜色设置为不透明黑色

   glClearColor(0.0, 0.0, 0.0, 1.0);
这里你是说相机不是透视类型的;基本上,遥远的事物不会变小。这类似于人造卫星对城市的影响。特别是,您正在创建一个不以视野为“中心”的相机:我建议在第一次实验中使用类似于glOrtho(-10.0,10.0,-10.0,10.0,-1.0,1.0)的调用。对于非透视摄影机,您在此处指定的坐标将覆盖我们上面提到的约定-1到+1。尝试调整参数,使您的红方块看起来很小且居中

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(0, 10.0, 0, 10.0, -1.0, 1.0); //What does this do and how does it's coordinates work?
在这里,您基本上是相对于正方形定位相机,或者相对于相机定位正方形;有无数种方式可以看到它。您正在定义一个几何变换,之所以称之为模型视图,是因为它不是唯一改变模型(正方形)或视图(相机)的东西,而是同时改变两者,具体取决于您的观察方式。但是,由于您正在呼叫,您的方块显示为旋转;移除它,正方形将显示为正方形

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glRotatef(30.0, 1.0, 1.0, 1.0);
深度测试是一种使用缓冲区中的深度存储来移除隐藏曲面的技术,例如3D场景中立方体的背面。您的场景是二维的,并且您只绘制了一个四边形,因此这实际上不会影响您的绘制

   glEnable(GL_DEPTH_TEST);
}
main中,您正在与glut交互,glut是一个可选的子系统,不属于OpenGL的一部分,但用于执行一些只有操作系统才有权执行的枯燥乏味的操作

int main(int argc, char *argv[])
{
首先,您必须初始化过量

然后定义将包含渲染图像的窗口

    glutInitWindowSize(600, 600);
    glutInitWindowPosition(250, 250);
GLUT_RGB意味着您的窗口只支持红色、绿色和蓝色,并且没有alpha通道(这是ver)
    glutInit(&argc, argv);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(250, 250);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
    glutCreateWindow("Model View");
    glutDisplayFunc(display);
   init();
    glutMainLoop();

    return 0;
}