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;
}

// 程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口进行文件的添加或管理
// 2. 通过团队资源管理器窗口与源代码管理系统建立连接
// 3. 通过输出窗口查看生成的输出结果和其他消息
// 4. 借助错误列表窗口识别和处理各种错误信息
// 5. 在项目选项卡下选择"添加新项"或"现有项目"来创建或导入现有项目文件
// 6. 在将来的版本中,请转到"文件" > "打开" > "项目"并选择相应的.sln 文件路径
全部评论 (0)
还没有任何评论哟~
