triangle.c

来自「OpenGL的大海量资料收集」· C语言 代码 · 共 201 行

C
201
字号
#include<windows.h>
#include<gl/glut.h>
#include<math.h>

#define GL_PT 3.1415f


static GLfloat xRot=0.0f;
static GLfloat yRot=0.0f;

BOOL bCull=FALSE;
BOOL bOutline=FALSE;
BOOL bDepth=FALSE;


void ProcessMenu(int value)
{
	switch(value)
	{
	case 1:
		bDepth=!bDepth;
		break;
	case 2:
		bCull=!bCull;
		break;
	case 3:
		bOutline=!bOutline;
	default:
		break;
	}
	glutPostRedisplay();
}


/*Called to draw scene*/
void RenderScene(void)
{
	GLfloat x,y,angle;
	int iPivot =1;


	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	 
	if(bCull)
		glEnable(GL_CULL_FACE);//启动消除多边形
	else
		glDisable(GL_CULL_FACE);//关闭消除多边形

	if(bDepth)
		glEnable(GL_DEPTH_TEST);//启动深度测试
	else
		glDisable(GL_DEPTH_TEST);//关闭深度测试

	if(bOutline)
		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);

    /*begin a triangle fan*/
	glBegin(GL_TRIANGLE_FAN);

    	glVertex3f(0.0f,0.0f,75.0f);

		for(angle=0.0f;angle<(2.0f*GL_PT); angle+=(GL_PT/8.0f))
		{
			x=50.0f*sin(angle);
			y=50.0f*cos(angle);

			if((iPivot %2)==0)
				glColor3f(0.0f,1.0f,0.0f);
			else
				glColor3f(1.0f,0.0f,0.0f);
			iPivot++;

			glVertex2f(x,y);
		}
    /*Done drawing fan for cone*/
	glEnd();

    /*begin a new  triangle fan to cover the bottom*/
	glBegin(GL_TRIANGLE_FAN);
	/**/
	glVertex3f(0.0f,0.0f,75.0f);
	/**/
	for(angle=0.0f;angle<(2.0f*GL_PT); angle+=(GL_PT/8.0f))
	{
		/**/
		x=50.0f*sin(angle);
		y=50.0f*cos(angle);
		/**/
		if((iPivot % 2)==0)
			glColor3f(0.0f,1.0f,0.0f);
		else
			glColor3f(1.0f,0.0f,0.0f);
		/**/
		iPivot++;
		/**/
		glVertex2f(x,y);
	}
    /*Done drawing the fan that covers the bottom*/
	glEnd();
	glPopMatrix();
	glutSwapBuffers();
}


/*THIS FUNCTION DOES ANY NEEDED INITIALIZATION ON THE RENDERING */
void SetupRC()
{
	/*black background*/
	glClearColor(1.0f,1.0f,1.0f,1.0f);
	/*set drawing color to green*/
	glColor3f(0.0f,1.0f,0.0f);
	
	glShadeModel(GL_FLAT);

	glFrontFace(GL_CW);
}


void SpacialKeys(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-=5.0f;

	if(key==GLUT_KEY_RIGHT)
		yRot+=5.0f;

	if(key>356.0f)
		xRot=0.0f;

    if(key<-1.0f)
		xRot=355.0f;

	if(key>356.0f)
		xRot=0.0f;

    if(key<-1.0f)
		xRot=355.0f;

	/*REFRESH THE WINDOW*/
	glutPostRedisplay();
}

void ChangeSize(int w,int h)
{
	GLfloat nRange=100.0f;

	if(h==0)
		h=1;


	glViewport(0,0,w,h);
	
	glMatrixMode(GL_PROJECTION);

	glLoadIdentity();

	if(w<=h)
		glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,-nRange,nRange);
	else
		glOrtho(-nRange*w/h,nRange*w/h,-nRange,nRange,-nRange,nRange);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc, char* argv[])
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
	glutCreateWindow("Triangle OpenGL Example");


	glutCreateMenu(ProcessMenu);
	glutAddMenuEntry("Toggle depth test",1);
    glutAddMenuEntry("Toggle cull test",2);
	glutAddMenuEntry("Toggle outline back test",3);
	glutAttachMenu(GLUT_RIGHT_BUTTON);

	glutReshapeFunc(ChangeSize);
    glutSpecialFunc(SpacialKeys);
    glutDisplayFunc(RenderScene);
	SetupRC();
	glutMainLoop();

	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?