Advertisement

opengl 地球行星的光照效果+键盘交互(学习笔记-仅供参考)

阅读量:
在这里插入图片描述

// 2020-6-11.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。
//

复制代码
    #include <iostream>
    #define NDEBUG
    #include <GL/glut.h>
    #include <stdlib.h>
    
    static int year = 0, day = 0, moon = 0;
    
    
    void init(void)
    {
    	//glClearColor(0.0, 0.0, 0.0, 0.0);
    	//glShadeModel(GL_SMOOTH);
    	//Sun
    	GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    	GLfloat mat_shininess[] = { 50.0 };
    	GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
    
    	GLfloat Light_Model_Ambient[] = { 0.2f , 0.2f , 0.2f , 1.0f }; //
    	glClearColor(0.0, 0.0, 0.0, 0.0);
    	glShadeModel(GL_SMOOTH);
    	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    	glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
    	glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Light_Model_Ambient); //
    	glEnable(GL_LIGHTING);
    	glEnable(GL_LIGHT0);
    	glEnable(GL_DEPTH_TEST);
    }
    
    void display(void)
    {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	//glColor3f(1.0, 1.0, 1.0);
    
    	glPushMatrix();
    
    	{
    		GLfloat sun_light_ambient[] = { 1.0, 0.0, 1.0, 0.0 };
    		glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_ambient);
    		//glutWireSphere(1.0, 20, 16);   /* draw sun */
    		glRotatef((GLfloat)year, 0.0, 1.0, 0.0);
    		glutSolidSphere(1.0, 20, 16);
    	}
    	{
    		GLfloat sun_light_ambient[] = { 1.0, 1.0, 0.0, 0.0 };
    		glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_ambient);
    		glTranslatef(2.0, 0.0, 0.0);
    		glRotatef((GLfloat)day, 0.0, 1.0, 0.0);
    		//glutWireSphere(0.2, 10, 8);    /* draw earth */
    		glutSolidSphere(0.2, 10, 8);
    	}
    
    	{
    		GLfloat sun_light_ambient[] = { 0.0, 0.0, 1.0, 0.0 };
    		glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_ambient);
    		glTranslatef(1.0, 0.0, 0.0);
    		glRotatef((GLfloat)moon, 0.0, 1.0, 0.0);
    		//glutWireSphere(0.15, 10, 8);    /* draw moon */
    		glutSolidSphere(0.15, 10, 8);
    	}
    	glPopMatrix();
    
    	//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	//glutSolidTeapot(0.5);
    
    	glFlush();
    	glutPostRedisplay();
    
    
    }
    
    void reshape(int w, int h)
    {
    	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    	gluLookAt(0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    
    	/*glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    	/glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	if (w <= h)
    		glOrtho(-1.5, 1.5, -1.5 * (GLfloat)h / (GLfloat)w,
    			1.5 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);
    	else
    		glOrtho(-1.5 * (GLfloat)w / (GLfloat)h,
    			1.5 * (GLfloat)w / (GLfloat)h, -1.5, 1.5, -10.0, 10.0);
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();*/
    }
    
    void keyboard(unsigned char key, int x, int y)
    {
    	switch (key) {
    	case 'd':
    		day = (day + 10) % 360;
    		moon = (moon + 5) % 360;
    		glutPostRedisplay();
    		break;
    	case 'D':
    		day = (day - 10) % 360;
    		glutPostRedisplay();
    		break;
    	case 'y':
    		year = (year + 5) % 360;
    		day = (day + 10) % 360;
    		moon = (moon + 5) % 360;
    		glutPostRedisplay();
    		break;
    	case 'Y':
    		year = (year - 5) % 360;
    		glutPostRedisplay();
    		break;
    	case 'm':
    		moon = (moon + 5) % 360;
    		glutPostRedisplay();
    		break;
    	case 27:
    		exit(0);
    		break;
    	default:
    		break;
    	}
    }
    
    int main(int argc, char** argv)
    {
    	glutInit(&argc, argv);
    	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);//窗口使用RGB颜色,单缓存和深度缓存
    	glutInitWindowSize(800, 600);
    	glutInitWindowPosition(100, 100);
    	glutCreateWindow(argv[0]);
    
    	init();
    	glutDisplayFunc(display);
    	glutReshapeFunc(reshape);
    	glutKeyboardFunc(keyboard);
    
    	glutMainLoop();
    	return 0;
    }
    
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/dWZ641qvnrFzLbe05usTIPgYctUK.png)

// 程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口进行文件的添加或管理
// 2. 通过团队资源管理器窗口与源代码管理系统建立连接
// 3. 通过输出窗口查看生成的输出结果和其他消息
// 4. 借助错误列表窗口识别和处理各种错误信息
// 5. 在项目选项卡下选择"添加新项"或"现有项目"来创建或导入现有项目文件
// 6. 在将来的版本中,请转到"文件" > "打开" > "项目"并选择相应的.sln 文件路径

全部评论 (0)

还没有任何评论哟~