天天看點

《基于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_bTeapot       = TRUE;        

    m_bSimpleCube  = FALSE;        

    InvalidateRect(NULL,FALSE);    

void CCY457OpenGLView::OnObjectsCube() 

{//畫立方體

    m_bCube           = TRUE;    

void CCY457OpenGLView::OnObjectsIcosahedron() 

{//畫二十面體

    m_bIcosahedron = TRUE;

void CCY457OpenGLView::OnObjectsTorus() 

{//畫環面

    m_bTorus       = TRUE;        

    m_bSimpleCube  = FALSE;            

void CCY457OpenGLView::OnObjectsSimplecube() 

{//畫簡單立方體

    m_bSimpleCube  = TRUE;        

    InvalidateRect(NULL,FALSE);

3,由于開始繪制3維圖形,是以使用第一篇文章的OnSize()函數。

4,在RenderScene中加入具體的繪制代碼:

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);

    if(m_bTriangle==TRUE)

        glBegin(GL_TRIANGLES);

            glVertex2f(2.0f,0.0f);

            glVertex2f(0.0f,2.0f);

    if(m_bPolygon==TRUE)

        glBegin(GL_POLYGON);

            glVertex2f(3.0f,0.0f);

            glVertex2f(4.0f,3.0f);

            glVertex2f(1.5f,6.0f);

            glVertex2f(-1.0f,3.0f);

    //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

            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);

        //Back Face

            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);

        //Left Face

            glVertex3f(-1.0f,-1.0f, 0.0f);

            glVertex3f(-1.0f, 1.0f, 0.0f);

        //Right Face

            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);

        //Top Face

            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);

        //Botton Face

            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);

本文轉自Phinecos(洞庭散人)部落格園部落格,原文連結:http://www.cnblogs.com/phinecos/archive/2008/11/05/1327385.html,如需轉載請自行聯系原作者

繼續閱讀