星形+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);。

浙公网安备 33010602011771号