zoukankan      html  css  js  c++  java
  • 绘制图形与3D增强技巧(三)----三角形图元TRANGLE

    1.

    glBegin(GL_TRANGLES);

    ........

    glend();

    2.多边形的环绕方向:逆时针和顺时针的正反面

    GLFront(GL_CCW)和GLFront(GL_CW);

    3.三角形带

    glBegin(GL_TRANGLE_STRIP);

    .......

    glend();

    4.三角形扇

    glBegin(GL_TRANGLE_FAN);

    .......

    glend();

    例子:

    // TRANGLE.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include<GLglut.h>
    #include<math.h>
    #define PI 3.14
    GLfloat Range=100.0f ;
    bool DEPTH_TEST=false;
    bool CULL_FACE=false;
    bool OUTLINE_BACK=false;
    static GLfloat xRot=0.0f;
    static GLfloat yRot=0.0f;
    bool STOP_DEPTHTEST=false;
    void Init()
    {
        glClearColor(0.0f,0.0f,0.0f,1.0f);
        
    
        glFrontFace(GL_CW);
    
        //单调着色
        glShadeModel(GL_FLAT);
    }
    void ChangeSize(int w,int h)
    {
        if (h==0)
        {
            h=1;
        }
        glViewport(0,0,w,h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        if (w<=h)
        {
            glOrtho(-Range,Range,-Range*h/w,Range*h/w,-Range,Range);
        }
        else
        {
            glOrtho(-Range*w/h,Range*w/h,-Range,Range,-Range,Range);
        }
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    
    }
    void MyMenu(int value)
    {
        switch (value)
        {
        case 1:
            DEPTH_TEST=!DEPTH_TEST;
            break;
        case 2:
            CULL_FACE=!CULL_FACE;
            break;
        case 3:
            OUTLINE_BACK=!OUTLINE_BACK;
            break;
        case 4:
            STOP_DEPTHTEST=true;
        default:
            break;
        }
    }
    void MyspecialKey(int key,int x,int y)
    {
        if (key==GLUT_KEY_LEFT)
        {
            yRot-=5.0f;
        }
        if (key==GLUT_KEY_RIGHT)
        {
            yRot+=5.0f;
        }
        if (key==GLUT_KEY_UP)
        {
            xRot-=5.0f;
        }
        if (key==GLUT_KEY_DOWN)
        {
            xRot+=5.0f;
        }
        if (xRot>355.0f)
        {
            xRot=0.0f;
        }
        if (xRot<=-5.0f)
        {
            xRot=355.0f;
        }
        if (yRot>355.0f)
        {
            yRot=0.0f;
        }
        if (yRot<=-5.0f)
        {
            yRot=355.0f;
        }
    
        glutPostRedisplay();
    }
    void Mydisplay()
    {
        GLint color=1;
        GLfloat angle=0.0f;
        GLfloat x,y;
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        if (DEPTH_TEST)
        {
            glEnable(GL_DEPTH_TEST);
        }
        else
        {
            glDisable(GL_DEPTH_TEST);
        }
        
        if (CULL_FACE)
        {
            glEnable(GL_CULL_FACE);
            glCullFace(GL_BACK);
        }
        else
        {
            glDisable(GL_CULL_FACE);
        }
    
        if (STOP_DEPTHTEST)
        {
            glDisable(GL_DEPTH_TEST);
        }
        if (OUTLINE_BACK)
        {
            glPolygonMode(GL_BACK,GL_LINE);
        }
        else
        {
            glPolygonMode(GL_BACK,GL_FILL);
        }
        
        
    
    
        glPushMatrix();
        glRotatef(xRot,1.0f,0.0f,0.0f);
        glRotatef(yRot,0.0f,1.0f,0.0f);
        
        glBegin(GL_TRIANGLE_FAN);
        glVertex3f(0.0f,0.0f,75.0f);
        for (angle = 0;angle<PI*2; angle+=(PI/8))
        {
            x=50.0f*cos(angle);
            y=50.0f*sin(angle);
            if ((color%2)==0)
            {
                glColor3f(0.0f,1.0f,0.0f);
            }
            else
            {
                glColor3f(1.0f,0.0f,0.0f);
            }
            color++;
            glVertex3f(x,y,0.0f);
        }
        glEnd();
        glBegin(GL_TRIANGLE_FAN);
        glVertex3f(0.0f,0.0f,0.0f);
        for (angle = 0;angle<PI*2; angle+=(PI/8))
        {
            x=50.0f*cos(angle);
            y=50.0f*sin(angle);
            if ((color%2)==0)
            {
                glColor3f(0.0f,1.0f,0.0f);
            }
            else
            {
                glColor3f(1.0f,0.0f,0.0f);
            }
            color++;
            glVertex3f(x,y,0.0f);
        }
        glEnd();
    
        glPopMatrix();
        glutSwapBuffers();
    
    }
    int main(int argc,char ** argv)
    {
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
        glutInitWindowPosition(500,300);
        glutInitWindowSize(600,600);
        glutCreateWindow("Trangle");
    
        Init();
    
        glutDisplayFunc(Mydisplay);
        glutReshapeFunc(ChangeSize);
        
    
        glutCreateMenu(MyMenu);
        glutAddMenuEntry("Depth Test",1);
        glutAddMenuEntry("CullFace",2);
        glutAddMenuEntry("Outline Back",3);
        glutAddMenuEntry("STOP DEPTHTEST",4);
        glutAttachMenu(GLUT_RIGHT_BUTTON);
    
        glutSpecialFunc(MyspecialKey);
        glutMainLoop();
    
    
    }

    1.深度测试

    2.隐藏面消除

    3.线框模式:glpoloygonModel(GLenum face,GL_LINE/GL_FILL);

    4.着色模式 glshademodel(GL_FLAT)和glshademodel(GL_SMOOTH);

    亲爱的听众朋友我是你的代班DJ
  • 相关阅读:
    terminal
    变量提升、函数提升
    ssh传输文件
    mocha测试框架
    npm-run 自动化
    webpack
    浅析babel
    构建工具gulp
    C++中TRACE宏及assert()函数的使用
    memcpy函数-C语言
  • 原文地址:https://www.cnblogs.com/YTYMblog/p/5699467.html
Copyright © 2011-2022 走看看