zoukankan      html  css  js  c++  java
  • [译]NeHe教程

    原文: Your First Polygon

    在第一节中我讲解了如何创建OpenGL窗体.本节我会讲解如何创建三角形和四边形.我们会用GL_TRIANGLES来创建三角形,用GL_GUADS创建四边形.

    我们会添加到第一节代码的DrawGLScene函数中.我会下面重新给出该函数的完整代码.如果你打算在上一节的代码中修改,你可以直接用以下代码替换,或者增加上一节代码没有的部分.

    int DrawGLScene(GLvoid)                         // Here's Where We Do All The Drawing
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     // Clear The Screen And The Depth Buffer
        glLoadIdentity();                       // Reset The View

    当你调用glLoadIdentity函数时,前端的动作只是把视觉移回屏幕中间,其实就是在X轴从左到右,在Y轴从上到下,在Z轴从屏幕外部往内部移动.

    屏幕的中间是X,Y轴的0.0f.而左边就是负值.右边是正值.向屏幕的顶部移动是正值,向底部移动是负值.向屏幕的深处移动是负值,向观看者移动是正值.

    glTranslatef(x, y, z)沿着X, Y和Z轴移动.下面的是在X轴上向左移动了1.5个单位.它在Y轴上没有移动,并往屏幕内部移动了6.0个单位.当你执行时,你会发现并不是从屏幕中间移动,而是从你当前屏幕的位置移动.

    glTranslatef(-1.5f,0.0f,-6.0f);                 // Move Left 1.5 Units And Into The Screen 6.0

    现在我们需要移动到屏幕的左手边,我们已经设置好足够深入屏幕(-6.0)的视觉,可以看见创建三角形的整个场景.

    glBegin(GL_TRIANGLES)的意思是我们要开始绘制三角形,而glEnt()函数告知OpenGL我们已经创建三角形完毕.通常来说,如果你要画3个点的话可以用GL_TRIANGLES.大多数的显卡画三角形都是相当快的.如果你要画4个点可以用GL_QUADS.我听说的是,大多数显卡在后台是以三角形为单位绘制物体的.最后如果你需要绘制超过4个点的话,可以用GL_POLYGON.

    在我们的简单演示程序中,我们只画了一个三角形.如果我们需要画第二个三角形,我们可以直接追加三行新的位置代码到原来的三行代码后面.这样6行代码都嵌套在glBegin(GL_TRIANGLES)和glEnd()函数之间.不用每次画3个点都用这两个函数包含一次.四边形也同理,如果你已经知晓你要创建的所有四边形的位置,你可以全部嵌套在glBegin(GL_TRIANGLES)和glEnd()函数之间.另一方面,多边形(GL_POLYGON)可以由任意个点组成,所以你嵌套多少行代码在glBegin(GL_POLYGON)和glEnd()之间都无所谓.

    glBegin函数后面的第一行,是设置多边形的第一个点.顶点(glVertex)的第一个数值是X轴的值,第二个值是Y轴,第三个值是Z轴.第一个行中,我们不在X轴和Y轴上移动,只在Y轴上移动一个单位.这个是三角形的顶部的点.第二个顶点(glVertex)在X轴向左移动了一个单位,在Y轴向下移动了一个单位.这个是三角形的左下角的点.第三个顶点(glVertex)向右移动了一个单位,向下移动了一个单位.这个是三角形右下角的点.glEnd()函数告诉OpenGL已经完成画点了.然后填充的三角形会被显示.

    glBegin(GL_TRIANGLES);                      // Drawing Using Triangles
        glVertex3f( 0.0f, 1.0f, 0.0f);              // Top
        glVertex3f(-1.0f,-1.0f, 0.0f);              // Bottom Left
        glVertex3f( 1.0f,-1.0f, 0.0f);              // Bottom Right
    glEnd();                            // Finished Drawing The Triangle

    现在已经有一个三角形显示在屏幕的左边的,我们要在右边显示正方形.为了做这步,要再次调用glTranslate函数.这回是移动到右边,所以X是正值.之前已经向左移动了1.5个单位,这回要向右移动1.5个单位.就是说先会到中间点,然后向右移动1.5个单位.所以总共需要向右移动3.0个单位.

    glTranslatef(3.0f,0.0f,0.0f);                   // Move Right 3 Units

    现在来创建正方形.会用到GL_QUADS.四边形顾名思义就是有4条边的多边形.四边形属性(GL_GUADS)最适合用来创建正方形.创建正方形的过程和创建三角形很像.就是用GL_GUADS代替GL_TRIANGLES,并且多了一组数值表示正方形的第4个点.我们会以左上,右上,右下,左下(顺时针方向)的顺序绘制.以顺时针的顺序绘制,正方形会被画成一个背面.意思是,我们见到的四边形的边实际上是背面.逆时针绘制物体才是面向我们的.不过这些暂时不重要,这是迟点才需要注意的事.

        glBegin(GL_QUADS);                      // Draw A Quad
            glVertex3f(-1.0f, 1.0f, 0.0f);              // Top Left
            glVertex3f( 1.0f, 1.0f, 0.0f);              // Top Right
            glVertex3f( 1.0f,-1.0f, 0.0f);              // Bottom Right
            glVertex3f(-1.0f,-1.0f, 0.0f);              // Bottom Left
        glEnd();                            // Done Drawing The Quad
        return TRUE;                            // Keep Going
    }

    最后添加窗体/全屏模式的切换快捷键,顺便加上窗体的标题.

    记得还要改"//Create Our OpenGL Window"注释那行的代码中的标题.否则"全屏"窗体的标题会和"窗体模式"的标题不同.

    if (keys[VK_F1])                // Is F1 Being Pressed?
    {
        keys[VK_F1]=FALSE;          // If So Make Key FALSE
        KillGLWindow();             // Kill Our Current Window
        fullscreen=!fullscreen;         // Toggle Fullscreen / Windowed Mode
        // Recreate Our OpenGL Window ( Modified )
        if (!CreateGLWindow("NeHe's First Polygon Tutorial",640,480,16,fullscreen))
        {
            return 0;           // Quit If Window Was Not Created
        }
    }
  • 相关阅读:
    菜鸟成长记(十二)----- 生活的意义是什么?
    菜鸟成长记(十一)----- 操蛋的2016与未知的2017
    菜鸟成长记(十)----- 好笑的格局
    菜鸟成长记(九)----- 当我作死的时候,我在想些什么。
    菜鸟成长记(八)----- 一个萝卜一个坑
    菜鸟成长记(七)----- 如何叫醒一个装睡的人?
    菜鸟成长记(六)----- 懒惰与惶恐的挣扎
    C++类的数组元素查找最大值问题
    成为IT精英,我奋斗了7年
    DS1337 时钟芯片在 C8051F 上的实现
  • 原文地址:https://www.cnblogs.com/live41/p/3454290.html
Copyright © 2011-2022 走看看