星形+glEdgeFlag

 //功能:显示一个星形,同时练习glEdgeFlag的使用

//Star.c

//Testing glEdgeFlag

//Program by Richard S. Wright Jr.

#define FREEGLUT_STATIC

#include <GL/glut.h>

 

//rotation angles

static GLfloat xRot=0.0f;

static GLfloat yRot=0.0f;

//clip volume

GLfloat nRange=100.0f;

//flags for effects

#define MODE_SOLID 0

#define MODE_LINE 1

#define MODE_POINT 2

//the very initial mode

int iMode=MODE_LINE;

//boundry edge flag

GLboolean bEdgeFlag=TRUE;

 

//reset flags as appropriate in response to menu selections

void ProcessMenu(int value)

{

    switch(value)

    {

    case 1:

        iMode=MODE_SOLID;

        break;

    case 2:

        iMode=MODE_LINE;

        break;

    case 3:

        iMode=MODE_POINT;

        break;

    case 4:

        bEdgeFlag=TRUE;

        break;

    case 5:

    default:

        bEdgeFlag=FALSE;

        break;

    }

    glutPostRedisplay();

}

 

//called to render scene

void RenderScene()

{

    glClear(GL_COLOR_BUFFER_BIT);

 

    if(iMode==MODE_SOLID)

        glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

    if(iMode==MODE_LINE)

        glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

    if(iMode==MODE_POINT)

        glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);

 

    //save the curr matrix and do the rotation

    glPushMatrix();

 

    glRotatef(xRot,1.0f,0.0f,0.0f);

    glRotatef(yRot,0.0f,1.0f,0.0f);

    glBegin(GL_TRIANGLES);

 

    glVertex2f(0.0f,40.0f);

    glEdgeFlag(bEdgeFlag);   

    glVertex2f(-20.0f,0.0f);

    glEdgeFlag(TRUE);

    glVertex2f(20.0f,0.0f);

   

 

    glVertex2f(-20.0f,0.0f);

    glVertex2f(-60.0f,-20.0f);

    glEdgeFlag(bEdgeFlag);

    glVertex2f(-20.0f,-40.0f);

    glEdgeFlag(TRUE);

 

    glVertex2f(-20.0f,-40.0f);

    glVertex2f(0.0f,-80.0f);

    glEdgeFlag(bEdgeFlag);

    glVertex2f(20.0f,-40.0f);

    glEdgeFlag(TRUE);

 

    glVertex2f(20.0f,-40.0f);

    glVertex2f(60.0f,-20.0f);

    glEdgeFlag(bEdgeFlag);

    glVertex2f(20.0f,0.0f);

    glEdgeFlag(TRUE);

 

    glEdgeFlag(bEdgeFlag);

    glVertex2f(-20.0f,0.0f);

    glVertex2f(-20.0f,-40.0f);

    glVertex2f(20.0f,0.0f);

 

    glVertex2f(-20.0f,-40.0f);

    glVertex2f(20.0f,-40.0f);

    glVertex2f(20.0f,0.0f);

    glEdgeFlag(TRUE);

 

    glEnd();

    glPopMatrix();

    glutSwapBuffers();

}

 

//this function does any needed initialization on the rendering context

void SetupRC()

{

    glClearColor(0.0f,0.0f,0.0f,1.0f);

    glColor3f(1.0f,0.0f,0.0f);

}

 

void SpecialKeys(int key,int x,int y)

{

    if(key==GLUT_KEY_UP)

        xRot-=5.0f;

    if(key==GLUT_KEY_DOWN)

        xRot+=5.0f;

    if(key==GLUT_KEY_LEFT)

        yRot-=1.0f;

    if(key==GLUT_KEY_RIGHT)

        yRot+=1.0f;

    if(xRot>355.0f)

        xRot=0.0f;

    if(xRot<0.0f)

        xRot=355.0f;

    if(yRot>355.0f)

        yRot=0.0f;

    if(yRot<0.0f)

        yRot=355.0f;

 

    glutPostRedisplay();

}

 

void ChangeSize(int w,int h)

{

    if(h==0)

        h=1;

    glViewport(0,0,w,h);

   

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

 

    if(w<=h)

    {

        glOrtho(-nRange,nRange*h/w,-nRange,nRange,1.0f,-1.0f);

    }

    else

        glOrtho(-nRange,nRange*w/h,-nRange,nRange,1.0f,-1.0f);

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

}

 

int main(int argc,char** argv)

{

    GLint nModeMenu=0;

    GLint nEdgeMenu=0;

    GLint nMainMenu=0;

 

    glutInit(&argc,argv);

    glutInitWindowSize(800,600);

    glutCreateWindow("A Star");

 

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);

    glutReshapeFunc(ChangeSize);

    glutDisplayFunc(RenderScene);

    glutSpecialFunc(SpecialKeys);

   

    nModeMenu=glutCreateMenu(ProcessMenu);

    glutAddMenuEntry("SOLID",1);

    glutAddMenuEntry("LINE",2);

    glutAddMenuEntry("POINTS",3);

 

    nEdgeMenu=glutCreateMenu(ProcessMenu);

    glutAddMenuEntry("ON",4);

    glutAddMenuEntry("OFF",5);

 

    nMainMenu=glutCreateMenu(ProcessMenu);

    glutAddSubMenu("Mode",nModeMenu);

    glutAddSubMenu("Edges",nEdgeMenu);

    glutAttachMenu(GLUT_RIGHT_BUTTON);

 

    SetupRC();

 

    glutMainLoop();

    return 0;

}

需要注意的几点是:

1.glRotatef中的参数angles以逆时针为正;

3.glEdgeFlag(FALSE);放到一个vertex前面就代表以这个顶点开始的线段不是“边界线”,不会显示的。注意绘制三角形也是逆时针方向着笔的。举个例子:如果不想显示第三条边,那么在第3个顶点的前面写glEdgeFlag(FALSE);然后glVertex3f(x,y,z);glEdgeFlag(TRUE);。

posted @ 2013-03-29 20:40  Tup  阅读(390)  评论(0)    收藏  举报