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

  • 相关阅读:
    Scala学习笔记(八):Scala的层级
    Scala学习笔记(七):闭包
    Scala学习笔记(六):函数
    Struts 2(八):文件上传
    Struts 2(七):国际化
    Struts 2(五):输入校验 & 校验框架
    Struts 2(四):类型转换
    Struts 2(三):示例→基于Struts 2的用户注册模块
    Struts 2(二):使用Struts2
    Struts 2(一):初识Struts
  • 原文地址:https://www.cnblogs.com/lcxu2/p/2004056.html
Copyright © 2020-2023  润新知