计算机图形学-绘制太阳系
- 格式:doc
- 大小:99.50 KB
- 文档页数:2
《计算机图形学》课程设计报告题目名称:专业班级学号姓名指导教师年月日Solar System(太阳系)软件工程专业学生王洋指导老师李征[摘要]太阳系(Solar System)是以太阳为中心,和所有受到太阳重力约束的天体的集合体,主要包括太阳,八大行星,以及卫星.此课题模拟太阳系围绕太阳运转的模型,以太阳,八大行星和月球形成大致的体系结构,以VC6.0为平台用OpenGL基础知识实现从不同角度观测太阳系.关键词:OpenGL VC6.0 太阳系运转角度一、实验名称:Solar System(太阳系)二、实验的目的和要求:1.熟悉OpenGL基础函数2.通过程序模拟太阳系运行3.实现改变视角观测太阳系三、实验的环境:1.硬件环境:CPU Intel Pentium D ,1G内存2.软件环境:操作系统:Windows xp SP2编译软件及版本:vc6.0 OpenGL环境四、系统描述1.太阳太阳是恒星,能够自转,体积是太阳系中最大的,能够发光,处于太阳系中心位置.2.八大行星八大行星按与太阳距离从近到远分别为:水星,金星,地球,火星,木星,土星,天王星,海王星,各有各的大小,其中以木星最大,以各自不同的公转速度绕太阳运行,并自转.3.月球月球是围绕地球旋转的卫星.体积是系统中最小的,旋转周期比较快。
五. 理论基础:用windows api创建窗口,使用OpenGL绘制函数绘制球体,实现位图文件读取,并转换为纹理,使用系统时间控制球体转动,设置视点视角,通过改变视角从不同角度观测.所使用的计算机图形学理论基础:1.3D管道中的几何变换旋转矩阵行向量为该矩阵坐标系在原坐标系上的坐标,列向量为原坐标系的向量在本旋转矩阵坐标系上的坐标。
旋转是欧氏变换;旋转、放缩是线性变换;旋转、放缩、平移是仿射变换;旋转、放缩、平移、透视投影是射影变换。
线性变换在四维空间,仿射变换在三维空间,射影必须采用摄像坐标系,仿射变换是到自身的一类变换.齐次坐标系就是将一个原本是n维的向量用一个n+1维向量来表示。
华中科技大学计算机图形学实验报告——画直线、日地月模型计算机图形学基础实验报告专业:班级:姓名:学号:日期:OpenGL简介(1)OpenGL作为一个性能优越的图形应用程序设计界面(API),它独立于硬件和窗口系统,在运行各种操作系统的各种计算机上都可用,并能在网络环境下以客户/服务器模式工作,是专业图形处理、科学计算等高端应用领域的标准图形库。
它具有以下功能。
1. 模型绘制2. 模型观察在建立了三维景物模型后,就需要用OpenGL描述如何观察所建立的三维模型。
3. 颜色模式的指定OpenGL应用了一些专门的函数来指定三维模型的颜色。
4. 光照应用用OpenGL绘制的三维模型必须加上光照才能更加与客观物体相似。
5. 图象效果增强OpenGL提供了一系列的增强三维景观的图象效果的函数,这些函数通过反走样、混合和雾化来增强图象的效果。
6. 位图和图象处理OpenGL还提供了专门对位图和图象进行操作的函数。
7. 纹理映射8. 实时动画9. 交互技术应用软件OpenGL窗口系统操作系统图形硬件图1.1 OpenGL图形处理系统的层次结构(2)OpenGL的操作步骤在OpenGL中进行的图形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步骤如下:1. 根据基本图形单元建立景物模型,得到景物模型的数学描述(OpenGL 中把点、线、多边形、图像和位图都作为基本图形单元);2. 把景物模型放在三维空间中的合适的位置,并且设置视点(Viewpoint)以观察所感兴趣的景观;3. 计算模型中所有物体的色彩,同时确定光照条件、纹理粘贴方式等;4. 把景物模型的数学描述及其色彩信息转换至计算机屏幕上的像素,这个过程也就是光栅化(rasterization)。
在这些步骤的执行过程中,OpenGL可能执行其他的一些操作,例如自动消隐处理等。
另外,景物光栅化之后被送入帧缓冲器之前还可以根据需要对象素数据进行操作。
(3)OpenGL的组成OpenGL不是一种编程语言,而是一种API(应用程序编程接口),它实际上是一种图形与硬件的接口,包括了多个图形函数。
计算机图形学实验报告学号:********姓名:班级:计算机 2班指导老师:***2010.6.19实验一、Windows 图形程序设计基础1、实验目的1)学习理解Win32 应用程序设计的基本知识(SDK 编程);2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。
4)学习MFC 类库的概念与结构;5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框);6)学习使用MFC 的图形编程。
2、实验内容1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。
(可选任务)2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,Thisis my first SDI Application"。
(必选任务)3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。
定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。
3、实验过程1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档;2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,Thisis my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制;3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。
4、实验结果正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。
#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <glut.h>//行星GLfloat rot0 = 30.0;GLfloat rot1 = 0.0;GLfloat rot2 = 0.0;GLfloat rot3 = 0.0;GLfloat rot4 = 0.0;GLfloat rot5 = 0.0;GLfloat rot6 = 0.0;GLfloat rot7 = 0.0;GLfloat rot8 = 0.0;//卫星GLfloat rot9 = 0.0;GLfloat rot10 = 0.0;GLfloat rot11 = 0.0;void init(){glClearColor(0.0,0.0,0.0,0.0);glClearDepth(1.0);glShadeModel(GL_FLAT);}void display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glColor3f(1.0,1.0,1.0);glLoadIdentity();//gluLookAt(0, 10, 10, 0,0,0,0, 1,0);//glRotatef(45.0,0.0,0.0,1.0);glTranslatef(0.0,0.0,-20.0);glRotatef(90.0,1.0,0.0,0);glPushMatrix();//绘制太阳glColor3f(1.0,0.0,0.0);glutSolidSphere(2.0,32,32);//绘制地球glPushMatrix();glColor3f(0.0,0.0,1.0);// 绘制辅助轨道glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 5.0, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置地球公转速度glRotatef(rot0,0.0,1.0,0.0);// 设置地球半径glTranslatef(5.0,0.0,0.0);// 设置地球自转速度//glRotatef(rot1,0.0,1.0,0.0);// 绘制地球glutSolidSphere(0.4,32,32);// 绘制地球的卫星-月亮glColor3f(0.5,0.6,0.5);// 抵消地球自转影响//glRotatef(-rot1,0.0,1.0,0.0);// 绘制辅助轨道glRotatef(90,1.0,0,0.0);glRotatef(-90,1.0,0,0.0);// 设置月亮公转速度glRotatef(rot9,0.0,1.0,0.0);// 设置月亮公转半径glTranslatef(0.6,0.0,0.0);// 绘制月亮glutSolidSphere(0.1,10,8); glPopMatrix();// 绘制水星glPushMatrix();glColor3f(0.0,1.0,1.0);// 绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 2.5, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置水星公转速度glRotatef(rot1,0.0,1.0,0.0);// 设置水星公转半径glTranslatef(2.5,0.0,0.0);// 设置水星自传glRotatef(rot3,0.0,1.0,0.0);// 绘制水星glutSolidSphere(0.2,32,32); glPopMatrix();//绘制金星glPushMatrix();glColor3f(0.0,1.0,0.0);//绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 3.4, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置金星公转速度glRotatef(rot2,0.0,3.0,0.0);// 设置金星公转半径glTranslatef(3.4,0.0,0.0);// 设置金星自传glRotatef(rot0,0.0,1.0,0.0);// 绘制金星glutSolidSphere(0.3,32,32); glPopMatrix();//绘制火星glPushMatrix();glColor3f(1.0,0.0,0.0);//绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 6.6, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置火星公转速度glRotatef(rot3,0.0,4.0,0.0);// 设置火星公转半径glTranslatef(6.6,0.0,0.0);// 设置火星自传glRotatef(rot7,0.0,2.0,0.0);// 绘制火星glutSolidSphere(0.5,32,32); glPopMatrix();//绘制木星glPushMatrix();glColor3f(2.0,0.1,1.0);//绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 8.5, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置木星公转速度glRotatef(rot4,0.0,0.4,0.0);// 设置木星公转半径glTranslatef(8.5,0.0,0.0);// 设置木星自传glRotatef(rot3,0.0,0.3,0.0);// 绘制木星glutSolidSphere(1.0,32,32);// 绘制木星卫星-木卫1glColor3f(0.4,0.3,0.5);// 抵消地球自转影响//glRotatef(-rot1,0.0,1.0,0.0);// 绘制辅助轨道glRotatef(90,1.0,0,0.0);glRotatef(-90,1.0,0,0.0);// 设置木卫1公转速度glRotatef(rot10,0.0,1.0,0.0);// 设置木卫1公转半径glTranslatef(1.3,0.0,0.0);// 绘制木卫1glutSolidSphere(0.1,10,8);// 绘制木星卫星-木卫2glColor3f(0.5f,0.5f,0.5f);// 抵消地球自转影响//glRotatef(-rot1,0.0,1.0,0.0);// 绘制辅助轨道glRotatef(90,1.0,0,0.0);glRotatef(-90,1.0,0,0.0);// 设置木卫2公转速度glRotatef(rot11,0.0,1.0,0.0);// 设置木卫2公转半径glTranslatef(1.2,0.0,0.0);// 绘制木卫2glutSolidSphere(0.08,10,8);glPopMatrix();//绘制土星glColor3f(1.0f, 1.0f, 0.0f);//绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 12.5, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置土星公转速度glRotatef(rot5,0.0,0.4,0.0);// 设置土星公转半径glTranslatef(12.5,0.0,0.0);// 设置土星自传glRotatef(rot3,0.0,0.3,0.0);// 绘制土星glutSolidSphere(0.85,32,32);//绘制土星光环glRotatef(90,1.0,0,0.0); glutSolidTorus(0.1, 1.25, 10, 64); glRotatef(-90,1.0,0,0.0);glRotatef(90,1.0,0,0.0);glutSolidTorus(0.07, 1.65, 10, 64); glRotatef(-90,1.0,0,0.0); glPopMatrix();glPopMatrix();//绘制天王星glPushMatrix();glColor3f(0.0f, 1.0f, 1.0f);//绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 15.5, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置天王星公转速度glRotatef(rot6,0.0,0.4,0.0);// 设置天王星公转半径glTranslatef(15.5,0.0,0.0);// 设置天王星自传glRotatef(rot1,0.0,0.3,0.0);// 绘制天王星glutSolidSphere(0.15,32,32); glPopMatrix();//绘制海王星glColor3f(0.0f, 0.0, 8.0f);//绘制辅助轨道glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 17.5, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置海王星公转速度glRotatef(rot7,0.0,0.4,0.0);// 设置海王星公转半径glTranslatef(17.5,0.0,0.0);// 设置海王星自传glRotatef(rot3,0.0,0.3,0.0);// 绘制海王星glutSolidSphere(0.145,32,32);glPopMatrix();//绘制冥王星glPushMatrix();glColor3f(0.5f, 0.5f, 0.5f);//绘制辅助轨道glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 19.5, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置冥王星公转速度glRotatef(rot8,0.0,0.4,0.0);// 设置冥王星公转半径glTranslatef(19.5,0.0,0.0);// 设置冥王星自传glRotatef(rot2,0.0,0.3,0.0);// 绘制冥王星glutSolidSphere(0.145,32,32);glPopMatrix();glutSwapBuffers();glFlush();}void idle(){if(rot0>=360.0)rot0-=360.0;rot1+=0.416;if(rot1>=360.0)rot1-=360.0;rot2+=0.1631;if(rot2>=360.0)rot2-=360.0;rot3+=0.053;if(rot3>=360.0)rot3-=360.0;rot4+=0.0083;if(rot4>=360.0)rot4-=360.0;rot5+=0.0034;if(rot5>=360.0)rot5-=360.0;rot6+=0.00119;if(rot6>=360.0)rot6-=360.0;rot7+=0.00069;if(rot7>=360.0)rot7-=360.0;rot8+=0.0008;if(rot8>=360.0)rot8-=360.0;rot9+=1.0;if(rot9>=360.0)rot9-=360.0;rot10+=0.005;if(rot10>=360.0) rot10-=360.0;if(rot11>=360.0)rot11-=360.0;glutPostRedisplay();}void reshape(int w,int h){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0,(GLdouble)w/(GLdouble)h,1.0,100.0);glMatrixMode(GL_MODELVIEW);}void main(int argc,char **argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(600,400);glutInitWindowPosition(500,500);glutCreateWindow("planet sim");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutIdleFunc(idle);glutMainLoop();return;}。
实验六 2D太阳系绘制一、实验目的1、掌握2D太阳系绘制方法2、掌握矩阵堆栈流程3、进一步掌握复合2D图形变换二、实验环境硬件要求:PC机,主流配置,最好为独立显卡,显存512M以上。
软件环境:操作系统:Windows XP。
语言开发工具:Microsoft Visual studio 2008,Visual C++。
三、实验内容与要求要求:实验课上老师要求的效果截图、及其相应代码拷贝到实验报告文档里。
WORD文档命名方式:学号姓名-实验序号-实验名称。
内容:1、已知太阳半径Rs,地球半径Re,月球半径Rm,每个球都会自转,地球绕太阳公转,月球绕地球公转。
2、基本框架程序2DSunSystem0.cpp3、设计世界坐标系,设计裁剪窗口大小,编写2D太阳系代码。
4、效果截图图6-1 2D太阳系效果5、分别在太阳、地球、月球位置添加中文字体“太阳”、“地球”、“月球”6、在修改的代码上加上自己的一些点缀修饰性图形四、参考函数:1、void glPushMatrix(void)功能:把当前操作矩阵压入矩阵堆栈,记住当前所在的位置。
复制活动栈顶的当前矩阵并将其存入第二个栈位置2、void glPopMatrix(void)功能:当前操作矩阵出栈,它下面的矩阵作为当前矩阵,返回到以前所在的位置。
破坏栈顶矩阵,栈的第二个矩阵成为当前矩阵。
如果要弹出栈顶,栈内至少要有2个矩阵,否则就会出错。
3、中文字体绘制在程序头部声明所用到的字体函数void selectFont(int size, int charset, const char* face); //选择字体void drawCNString(const char* str); //生成中文字体函数//在绘制部分调用字体函数,写中文字selectFont(48, GB2312_CHARSET, "楷体_GB2312"); //设置字体楷体24号字glRasterPos2f(250, 550); //定位首字位置drawCNString("Hello,大家好"); //写字“Hello,大家好”/***************************************************************** *******//* 选择字体函数*//***************************************************************** *******/void selectFont(int size, int charset, const char* face){HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0, charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont); DeleteObject(hOldFont);}/***************************************************************** *******//* 生成中文字体函数*//***************************************************************** *******/void drawCNString(const char* str){int len, i;wchar_t* wstring;HDC hDC = wglGetCurrentDC();GLuint list = glGenLists(1);// 计算字符的个数// 如果是双字节字符的(比如中文字符),两个字节才算一个字符// 否则一个字节算一个字符len = 0;for(i=0; str[i]!='\0'; ++i){if( IsDBCSLeadByte(str[i]) )++i;++len;}// 将混合字符转化为宽字符wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len);wstring[len] = L'\0';// 逐个输出字符for(i=0; i<len; ++i){wglUseFontBitmapsW(hDC, wstring[i], 1, list);glCallList(list);}// 回收所有临时资源free(wstring);glDeleteLists(list, 1);}4、圆的绘制1)圆盘绘制方法GLUquadricObj *disk; //定义二次曲面对象disk=gluNewQuadric(); //生成二次去面对像gluDisk(disk,0.8,1,50,50); //内径0.8,外径1,盘心在原点 2)球的绘制方法glutSolidSphere(1,80,80); //半径为1的球,球心在原点5、反走样代码glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);glEnable(GL_POINT_SMOOTH);glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);glEnable(GL_POLYGON_SMOOTH);glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);四、思考题1、如果太阳在平面任意位置,程序应该如何修改?2、OpenGL图形变换靠什么来完成?在OpenGL中完成矩阵操作,需要注意哪些问题?3、glPushMatrix(), glPopMatrix()是如何工作的?试运用这两个函数设计其他复合(或动画)图形。
1中文摘要本次课程设计采用OpenGL来完成。
OpenGL是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。
OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
本次课程设计是在win7系统下VC++6.0中的win32环境中,通过使用OpenGL所提供的标准库函数,综合图形学里的坐标转换,投影变换,光照以及纹理等知识,实现一个简单的太阳系的运行状况。
该系统仅做演示使用,将只包括太阳,地球与月亮,并且不保证相关数据的设定准确性。
目录一、课程设计任务及要求 (1)二、需求分析 (1)三、系统设计 (1)四、详细设计 (3)4.1 初始化的设定 (3)4.2 光源的位置与观察位置的设定 (4)4.3 纹理映射的设置 (5)4.4 各星球球体的绘制 (7)4.5 星球公转轨道 (9)4.6 人机交互式的实现 (10)五、运行调试与分析讨论 (12)5.1 程序运行截图 (12)5.2 结果分析 (13)六、设计体会与小结 (14)七、参考文献 (16)一、课程设计任务及要求1.利用OpenGL创建太阳,地球,月亮三个球体。
2. 实现“月亮绕着地球转,地球绕着太阳转”。
3. 为太阳,地球,月亮附上不同的纹理。
4. 具有较好的动画效果,消除闪烁现象。
5. 其他功能的添加。
二、需求分析本次课程设计使用的编译软件为Visual C++ 6.0。
设计中通过调用OpenGL函数库以来完成太阳,月亮,地球的球体绘制与纹理的加载,通过矩阵的变换以实现星球的运动效果。
从而模拟出太阳系的运行效果动画。
在之后,加入星球的轨道轨迹,使得模拟系统3D效果更加明显。
并加入人机交互操作。
通过“q,w,e,s,a,d”键来调整观察视角,可以实现全方位对此系统进行观察,使系统具有一定的可操作性。
三、系统设计本次课题为:实现太阳系运行动画。
系统设计步骤为:1.太阳,地球,月亮三个球体的创建。
快速制作太阳系模型的Blender教程太阳系是我们所在的宇宙家园,其中包含了太阳、八大行星、恒星和其他天体。
在Blender这款强大的三维建模软件中,我们可以轻松而快速地制作出太阳系模型。
下面将为您介绍一些简单的使用技巧。
首先,打开Blender软件,创建一个新的项目。
在3D视图中,鼠标右键点击默认的立方体,并按快捷键"X"删除它。
这样我们就有了一个空白的场景。
接下来,我们需要分别创建太阳、行星和其他天体的模型。
选择一个球体,通过鼠标左键拖动调整其大小,使其成为太阳的模型。
确保选中了这个球体,然后按快捷键"Shift+D"复制一份。
通过拖动复制出的球体,将其放置在太阳的周围,作为行星的模型。
现在,我们需要给每个行星创建一个轨道。
选中太阳,然后按快捷键"Shift+S",选择"光标定位到选择的对象"。
接着,按快捷键"Shift+A",选择"曲线-圆圈"创建一个圆圈。
将鼠标移动到上方的属性面板中,在"Geometry"下的"Radius"中调整圆圈的大小,以便适应行星的位置。
然后选中行星,按快捷键"Shift+S",选择"光标定位到选择的对象"。
再次按快捷键"Shift+A",选择"曲线-样条曲线"创建一条样条曲线。
将鼠标移动到属性面板中,在"Shape"下的"Fill"中选择"Full"。
然后在"Object Data"选项卡中,将"Bevel Depth"调整为适当大小,确定完成。
接下来,我们需要为每个行星添加材质。
选中一个行星,然后切换到"材质"属性面板。
实验名称:绘制太阳系(实验八)
班级:信09-1
学号:2108190911211
姓名:王杰
【实验目的】
1. 掌握GLUT实用包中创建多面体以及二次曲面的函数
2. 掌握OpenGL中的基本光照函数
3. 对几何变换、投影变换等内容进行复习
【实验内容】
1.在窗口绘制三个球体,分别代表太阳、地球和月球
2.为每个球体设置恰当的几何变换,要求:
(1)太阳在场景中间
(2)地球在自转的同时绕太阳旋转
(3)月球在自转的同时绕地球旋转
3.为场景添加适当的光照渲染
4.源程序
#include <glut.h>
static int day = 365; // day的变化:从0到359
void myDisplay(void)
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75, 1, 2, 400000000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -20000000, 200000000, 0, 0, 0, 0, 0, 1);
// 黄色的"太阳"
glColor3f(1.0f, 2.0f, 0.0f);
glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glutSolidSphere(69600000, 100, 100);
// 蓝色的"地球"
glColor3f(0.0f, 2.0f, 1.0f);
glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(150000000, 0.0f, 0.0f);
glutSolidSphere(15945000, 100, 100);
// 白色的"月亮"
glColor3f(2.0f, 2.0f, 2.0f);
glRotatef(day/30.0*360.0 - day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(38000000, 0.0f, 0.0f);
glutSolidSphere(4345000, 100, 100);
glFlush();
glutSwapBuffers();
}
void myIdle(void)
{
++day;
if( day >= 360 )
day = 0;
myDisplay();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(500, 500);
glutCreateWindow("王杰");
glutDisplayFunc(&myDisplay);
glutIdleFunc(&myIdle);
glutMainLoop();
return 0;
}
5.运行结果截图。