OpenGL编程指南13:光源移动

模型视图变换移动光源

#include 

static int spin = 0;
void init(void)
{
	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_SMOOTH);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
}
void display(void)
{
	GLfloat position [] = {0.0,0.0,1.5,1.0};
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glPushMatrix();
	glTranslatef(0.0,0.0,-5.0);
		glPushMatrix();
		glRotatef((GLdouble)spin,1.0,0.0,0.0);
		glLightfv(GL_LIGHT0 , GL_POSITION, position);
		glTranslated(0.0,0.0,1.5);
		glDisable(GL_LIGHTING);
		glColor3f(0.0,1.0,1.0);
		glutWireCube(0.1);
		glEnable(GL_LIGHTING);
		glPopMatrix();
	glutSolidTorus(0.275,0.85,20,150);
	glPopMatrix();

	glFlush();
}

void reshape(int w, int h)
{
	glViewport(0,0,(GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(40,(GLfloat)w/(GLfloat)h,1.0,20.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void mouse(int button, int state, int x, int y)
{
	switch(button)
	{
	case GLUT_LEFT_BUTTON:
		if( state == GLUT_DOWN )
		{
			spin = (spin+30)%360;
			glutPostRedisplay();
		}
		break;
	default:
		break;
	}
}

int main(int argc, char** argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB|GLUT_DEPTH);
	glutInitWindowSize(400,400);
	glutInitWindowPosition(200,200);
	glutCreateWindow(argv[0]);
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMouseFunc(mouse);
	glutMainLoop();
	return 0;
}
输出结果:

OpenGL编程指南13:光源移动_第1张图片

你可能感兴趣的:(计算机图像学,OpenGL编程)