zoukankan      html  css  js  c++  java
  • 【转】《基于MFC的OpenGL编程》Part 4 Drawing Simple 3D objects

    视见体

    Viewing Volume is nothing but the region of 3D Cartesian space in that will occupy the window. It is nothing but the minimum and maximum x, y and z values that are inside the window. So if a vertex is outside this range of x, y and z values then they are clipped by OpenGL before rendering can occur.

    Z Buffer

    The new term we have to deal with in addition to width and height of an object in 3D graphics is depth. The depth of an object is its distance from the viewpoint. The viewpoint is the location from which we are looking at that point. This depth value goes into the depth or Z-buffer. If we are drawing 2 objects that have some pixels that overlap, the first object will after it is rendered have its depth value in the depth buffer. When the next object is rendered, OpenGL will check to see whether the pixel it’s about to draw is in front of (with respect to the viewpoint) any pixel from the first object that’s already drawn. It does this by checking the Z value of the current pixel with the value that is already in the buffer. If the new pixel is closer to the viewpoint, OpenGL places its depth value in the depth buffer. This is how the Z-buffer works.

    正交投影和透视投影

    One term we need to understand very well to learn 3D Graphics well is projection. Well, computer graphics at its simplest is all about setting a color to a pixel on screen. And a pixel on a screen can have only two dimensions. So 3D graphics is merely an illusion. The 3D coordinates that we specify will have to be projected onto a 2D surface to create this illusion for us. And we have to specify how this projection works. By specifying a projection we specify the clipping or viewing volume.

    基本3D图形绘制

    1,CCY457OpenGLView.h中加入下列变量

    BOOL m_bPoint;        //Status of Point
    BOOL m_bLine;        //Status of Line
    BOOL m_bPolygon;    //Status of Polygon
    BOOL m_bTriangle;    //Status of Triangle

    并且在构造函数中初始化

    CCY457OpenGLView::CCY457OpenGLView()
    {
         m_bPoint    
    =
    FALSE;
         m_bLine        
    =
    FALSE;
         m_bPolygon    
    =
    FALSE;
         m_bTriangle
    =
    FALSE;
         m_bCube           
    =
    FALSE;        
         m_bTorus       
    =
    FALSE;        
         m_bTeapot       
    =
    FALSE;        
         m_bIcosahedron
    =
    FALSE;
         m_bSimpleCube  
    =
    FALSE;    
    }

    2,加入五个菜单项及其对应的事件处理程序。

    void CCY457OpenGLView::OnObjectsTeapot()
    {
    //画茶壶

         m_bCube           = FALSE;        
         m_bTorus       
    =
    FALSE;        
         m_bTeapot       
    =
    TRUE;        
         m_bIcosahedron
    =
    FALSE;
         m_bSimpleCube  
    =
    FALSE;        
         InvalidateRect(NULL,FALSE);    
    }
    void
    CCY457OpenGLView::OnObjectsCube()
    {
    //画立方体

         m_bCube           = TRUE;    
         m_bTorus       
    =
    FALSE;        
         m_bTeapot       
    =
    FALSE;        
         m_bIcosahedron
    =
    FALSE;
         m_bSimpleCube  
    =
    FALSE;        
         InvalidateRect(NULL,FALSE);    
    }
    void
    CCY457OpenGLView::OnObjectsIcosahedron()
    {
    //画二十面体

         m_bCube           = FALSE;        
         m_bTorus       
    =
    FALSE;        
         m_bTeapot       
    =
    FALSE;        
         m_bIcosahedron
    =
    TRUE;
         m_bSimpleCube  
    =
    FALSE;    
         InvalidateRect(NULL,FALSE);    
    }
    void
    CCY457OpenGLView::OnObjectsTorus()
    {
    //画环面

         m_bCube           = FALSE;        
         m_bTorus       
    =
    TRUE;        
         m_bTeapot       
    =
    FALSE;        
         m_bIcosahedron
    =
    FALSE;
         m_bSimpleCube  
    =
    FALSE;            
         InvalidateRect(NULL,FALSE);    
    }

    void
    CCY457OpenGLView::OnObjectsSimplecube()
    {
    //画简单立方体

         m_bCube           = FALSE;        
         m_bTorus       
    =
    FALSE;        
         m_bTeapot       
    =
    FALSE;        
         m_bIcosahedron
    =
    FALSE;
         m_bSimpleCube  
    =
    TRUE;        
         InvalidateRect(NULL,FALSE);
    }

    3,由于开始绘制3维图形,因此使用第二篇文章OnSize()函数。

    4RenderScene中加入具体的绘制代码:

    void CCY457OpenGLView::RenderScene ()
    {
    //绘制函数

        if(m_bPoint==TRUE)
         {
             glPointSize(
    3.0f
    );
             glBegin(GL_POINTS);
                 glVertex2f(
    0.0f,0.0f
    );
                 glVertex2f(
    1.0f,0.0f
    );
                 glVertex2f(
    0.0f,1.0f
    );
             glEnd();
         }
        
    if(m_bLine==
    TRUE)
         {
             glBegin(GL_LINES);
                 glVertex2f(
    0.0f,0.0f
    );
                 glVertex2f(
    1.0f,0.0f
    );
             glEnd();
         }
        
    if(m_bTriangle==
    TRUE)
         {
             glBegin(GL_TRIANGLES);
                 glVertex2f(
    0.0f,0.0f
    );
                 glVertex2f(
    2.0f,0.0f
    );
                 glVertex2f(
    0.0f,2.0f
    );
             glEnd();
         }
        
    if(m_bPolygon==
    TRUE)
         {
             glBegin(GL_POLYGON);
                 glVertex2f(
    0.0f,0.0f
    );
                 glVertex2f(
    3.0f,0.0f
    );
                 glVertex2f(
    4.0f,3.0f
    );
                 glVertex2f(
    1.5f,6.0f
    );
                 glVertex2f(
    -1.0f,3.0f
    );
             glEnd();
         }
        
    //Replace the current matrix with Identity Matrix

         glLoadIdentity();
         glTranslatef(
    0.0f,0.0f,-5.0f
    );
         glRotatef(
    -30.0f,1.0f,1.0f,0.0f
    );
        
    //Draw a Cube

        if(m_bCube)
         {
             glutWireCube(
    1.0f
    );
         }
        
    //Draw a Torus

        if(m_bTorus)
         {
             glutWireTorus(
    0.5f, 1.0f, 50, 50
    );
         }
        
    //Draw a Teapot

        if(m_bTeapot)
         {
             glutWireTeapot(
    1.0f
    );
         }
        
    //Draw a Icosahedron

        if(m_bIcosahedron)
         {
             glutWireIcosahedron();
         }
        
    //Draw a cube by specifying the vertices individually

        if(m_bSimpleCube)
         {
             glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
            
            
    //Front Face

             glBegin(GL_POLYGON);
                 glVertex3f(
    -1.0f,-1.0f,0.0f
    );
                 glVertex3f(
    1.0f,-1.0f,0.0f
    );
                 glVertex3f(
    1.0f, 1.0f,0.0f
    );
                 glVertex3f(
    -1.0f, 1.0f,0.0f
    );
             glEnd();
            
    //Back Face

             glBegin(GL_POLYGON);
                 glVertex3f(
    -1.0f,-1.0f,-1.0f
    );
                 glVertex3f(
    -1.0f, 1.0f,-1.0f
    );
                 glVertex3f(
    1.0f, 1.0f,-1.0f
    );
                 glVertex3f(
    1.0f,-1.0f,-1.0f
    );
             glEnd();
            
    //Left Face

             glBegin(GL_POLYGON);
                 glVertex3f(
    -1.0f,-1.0f, 0.0f
    );
                 glVertex3f(
    -1.0f, 1.0f, 0.0f
    );
                 glVertex3f(
    -1.0f, 1.0f,-1.0f
    );
                 glVertex3f(
    -1.0f,-1.0f,-1.0f
    );
             glEnd();
            
    //Right Face

             glBegin(GL_POLYGON);
                 glVertex3f(
    1.0f,-1.0f, 0.0f
    );
                 glVertex3f(
    1.0f,-1.0f,-1.0f
    );
                 glVertex3f(
    1.0f, 1.0f,-1.0f
    );
                 glVertex3f(
    1.0f, 1.0f, 0.0f
    );
             glEnd();
            
    //Top Face

             glBegin(GL_POLYGON);
                 glVertex3f(
    -1.0f, 1.0f,  0.0f
    );
                 glVertex3f(
    1.0f, 1.0f,  0.0f
    );
                 glVertex3f(
    1.0f, 1.0f, -1.0f
    );
                 glVertex3f(
    -1.0f, 1.0f, -1.0f
    );
             glEnd();
            
    //Botton Face

             glBegin(GL_POLYGON);
                 glVertex3f(
    -1.0f, -1.0f,  0.0f
    );
                 glVertex3f(
    -1.0f, -1.0f, -1.0f
    );
                 glVertex3f(
    1.0f, -1.0f, -1.0f
    );
                 glVertex3f(
    1.0f, -1.0f,  0.0f
    );
             glEnd();
         }
    }

  • 相关阅读:
    【转发】【小程序】微信小程序日常开发中常遇到的错误代码
    正则表达式:看懂正则表达式只需要几个实例就够了
    CSS响应式:根据分辨率加载不同CSS的几个方法,亲测可用
    [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息
    [NodeJs] 用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库
    [微信小程序] 微信小程序富文本-wxParse的使用
    [AngularJS] “多重路由”嵌套模块——AngularJS“路由”嵌套学习资料教程
    [AngularJS] “路由”的定义概念、使用详解——AngularJS学习资料教程
    学习笔记:JavaScript-进阶篇
    学习笔记:JavaScript-入门篇
  • 原文地址:https://www.cnblogs.com/lcxu2/p/2004064.html
Copyright © 2011-2022 走看看