《基于MFC的OpenGL编程》Part 14 Quadrics

      本文在 11篇文章 的基础上,为其加入显示各种二次曲面的代码;

      Quadrics

Every quadric has a few settings associated with it. We have to create a quadric first and then customize its settings to render the shape we want. The gluNewQuadric function creates a state variable that describes the current drawing style, orientation, lighting mode, texturing mode and the callback functions. Once we use this function to create a new quadric, we can customize the drawing of shapes by changing its state using functions such as

gluQuadricDrawStyle - which selects the type of OpenGL drawing primitives that are used to drw the shape.

gluQuadricOrientation - which controls the direction of the lighting normals.

gluQuadricNormals - which controls the generation of lighting normals.

gluQuadricTexture - which generates texture coordinates automatically for the quadric.

1,CCY457OpenGLView类中加入下列变量,用来表示二次曲面类型:

     // Quadric
    GLuint m_Quadric;

2,加入四个控制二次曲面类型的菜单项及其事件处理函数

void  CCY457OpenGLView::OnQuadricSphere() 
{
// 球体
    m_Quadric  =   0 ;
    InvalidateRect(NULL,FALSE);
}
void  CCY457OpenGLView::OnUpdateQuadricSphere(CCmdUI *  pCmdUI) 
{
    
if (m_Quadric  ==   0 )
        pCmdUI
-> SetRadio(TRUE);
    
else
        pCmdUI
-> SetRadio(FALSE);    
}
void  CCY457OpenGLView::OnQuadricCone() 
{
// 圆锥
    m_Quadric  =   2 ;    
    InvalidateRect(NULL,FALSE);
}
void  CCY457OpenGLView::OnUpdateQuadricCone(CCmdUI *  pCmdUI) 
{
    
if (m_Quadric  ==   2 )
        pCmdUI
-> SetRadio(TRUE);
    
else
        pCmdUI
-> SetRadio(FALSE);    
}
void  CCY457OpenGLView::OnQuadricCylinder() 
{
// 柱体
    m_Quadric  =   1 ;
    InvalidateRect(NULL,FALSE);
}
void  CCY457OpenGLView::OnUpdateQuadricCylinder(CCmdUI *  pCmdUI) 
{
    
if (m_Quadric  ==   1 )
        pCmdUI
-> SetRadio(TRUE);
    
else
        pCmdUI
-> SetRadio(FALSE);    
}
void  CCY457OpenGLView::OnQuadricDisk() 
{
// 圆盘
    m_Quadric  =   3 ;
    InvalidateRect(NULL,FALSE);
}
void  CCY457OpenGLView::OnUpdateQuadricDisk(CCmdUI *  pCmdUI) 
{
    
if (m_Quadric  ==   3 )
        pCmdUI
-> SetRadio(TRUE);
    
else
        pCmdUI
-> SetRadio(FALSE);
}
void  CCY457OpenGLView::OnQuadricPartialdisk() 
{
/// /半圆盘
    m_Quadric  =   4 ;
    InvalidateRect(NULL,FALSE);
    
}
void  CCY457OpenGLView::OnUpdateQuadricPartialdisk(CCmdUI *  pCmdUI) 
{
    
if (m_Quadric  ==   4 )
        pCmdUI
-> SetRadio(TRUE);
    
else
        pCmdUI
-> SetRadio(FALSE);    
}

3,绘制函数修改如下:

void  CCY457OpenGLView::RenderScene ()
{
// 绘制函数
        glTranslatef( 0.0f , 0.0f , - 5.0f );
        glRotatef(m_xRot,
1.0f , 0.0f , 0.0f );
        glRotatef(m_yRot,
0.0f , 1.0f , 0.0f );
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D,m_Texture[
0 ]);
        GLUquadricObj
*  obj;
        obj 
=  gluNewQuadric();
        gluQuadricNormals(obj, GLU_SMOOTH);
        gluQuadricTexture(obj, GL_TRUE);
        
switch (m_Quadric)
        {
            
case   0 :    gluSphere(obj,  1 20 20 );
                    
break ;
            
case   1 :    gluCylinder(obj,  1 1 3 20 20 );
                    
break ;
            
case   2 : gluCylinder(obj,  0.1 1 3 20 20 );
                    
break ;
            
case   3 : gluDisk(obj,  0.5 1 20 20 );
                    
break ;
            
case   4 : gluPartialDisk(obj,  0.5 1 20 20 10 180 );
                    
break ;
        }
        glDisable(GL_TEXTURE_2D);
}

 

你可能感兴趣的:(OpenGL)