【转】 《基于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);
}

posted @ 2010-11-23 03:26  lcxu2  阅读(115)  评论(0编辑  收藏  举报