《基于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()函数。

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);
            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();
    }
}
复制代码


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/11/05/1327385.html,如需转载请自行联系原作者
目录
相关文章
|
7月前
QT4.7版本的OPENGL的3D旋转模型例子
QT4.7版本的OPENGL的3D旋转模型例子
141 0
|
存储
QT+OpenGL开始3D
顶点坐标起始于局部空间,它在之后会变为世界坐标,观察坐标,裁减坐标,并最后以屏幕坐标的形式结束。
122 0
|
Android开发 C++
Android OpenGL显示任意3D模型文件
Android OpenGL显示任意3D模型文件
Android OpenGL显示任意3D模型文件
|
Android开发 异构计算
Android OpenGL ES(八)----纹理编程框架(二)
Android OpenGL ES(八)----纹理编程框架(二)
194 0
Android OpenGL ES(八)----纹理编程框架(二)
|
存储 Java API
Android OpenGL ES(八)----纹理编程框架(一)
Android OpenGL ES(八)----纹理编程框架(一)
326 0
Android OpenGL ES(八)----纹理编程框架(一)
|
Android开发
Android OpenGL ES(三)----编程框架(二)
Android OpenGL ES(三)----编程框架(二)
130 0
Android OpenGL ES(三)----编程框架(二)
|
Java API Android开发
Android OpenGL ES(三)----编程框架(一)
Android OpenGL ES(三)----编程框架(一)
141 0
|
iOS开发 异构计算
了解 OpenGL ES实现自定义编程粒子效果 思路
本案例旨在于了解OpenGL ES中自定义编程粒子效果的整体实现思路。
204 0
了解 OpenGL ES实现自定义编程粒子效果 思路
|
7月前
|
XML 小程序 Java
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
145 0
|
缓存 C++
Opengl ES之FBO
Opengl ES连载系列
157 0