计算机图形学-绘制太阳系

合集下载

计算机图形学课程设计报告——范文

计算机图形学课程设计报告——范文

《计算机图形学》课程设计报告题目名称:专业班级学号姓名指导教师年月日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

计算机图形学实验报告_2

计算机图形学实验报告学号:********姓名:班级:计算机 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太阳系绘制

2D太阳系绘制

实验六 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()是如何工作的?试运用这两个函数设计其他复合(或动画)图形。

第5课 海龟画太阳系

第5课 海龟画太阳系
第5课 海龟画太阳系
学习目标
• • • • 了解用画正多边形近似画圆的方法 了解椭圆命令格式及用法 学会画圆和椭圆 学会用logo命令画一些复杂的图形
用正多边形近视画圆原理
• 正多边形随边数的增多,其内角也逐渐增 大。海龟画正多边形时,由于显示器的分 辨率有限,当正多边形的边数达到足够多 时,显示器显示的正多边形看起来就像一 个圆。因此,我们可以利用画正多边形的 方法画圆 。
用正多边形近似画圆
• 用正多边形近似画圆命令 Repeat 36 [fd 10 rt 10]
当边数达到36边或更多时,正多边形 看起来像一个圆
• 圆的半径
因为将正36边形近似看成圆,所以这 个圆的周长约等于36边行的周长 36×a≈2×3.14×r 2r
即a ≈
2 3.14 r 36
≈ቤተ መጻሕፍቲ ባይዱ.175r
〝true)
这条椭圆命令的作用是让海龟画一个规定轴长的实心椭圆或 圆
• 例:海龟画太阳系
课堂练习
• • • • • • 用正多边形近似画圆方法画步长为50的圆 用正多边形近似画圆方法画步长为50的双圆 用正多边形近似画圆方法画半径为50步的车轮 用椭圆命名画年轮图 用椭圆命令画太阳系 完成创新活动1、2小题
用正多边形近似画圆
• 例 1、用正多边形近似画圆方法画双圆
repeat 36[fd 10 rt 10] repeat 36[fd 10 lt 10]
2、海龟画一个半径为80步的车轮
cs repeat 8[fd 80 bk 80 rt 45] lt 90 fd 80 rt 90 repeat 36[fd 80×0.175 rt 10] 这样的圆还不够接近正圆,若用360边形就更接近正圆了 repeat 360[fd 80*0.0175 rt 1]

计算机图形学课程设计完本

计算机图形学课程设计完本

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.太阳,地球,月亮三个球体的创建。

实验10 绘制小型太阳系模型

实验10 绘制小型太阳系模型

1.绘制背景
本例的背景就是漆黑的夜空,因此简单地画一个黑色 的矩形就可以了,代码如下: function draw() { var ctx = document.getElementById('canvasId').ge tContext('2d'); ctx.clearRect(0,0,300,300); // 清除canvas 画布 ctx.fillStyle = 'rgba(0,0,0)'; ctx.fillRect(0,0,300,300); ctx.save();
画布的长和宽都是300,代码如下: <!DOCTYPE html> <html> <head> <title>HTML5 Canvas 动画实例:小型太阳系模 型</title> </head> <body> <canvas id="canvasId" width="300" height="300"></canvas> </body> </html>
本例使用的3个图片
在设计小型太阳系模型动画实例之前需要准备3个图片分别用于表 现地球、月球和太阳。本例的画面比较小,因此这3个图片不需要 很精美。这里使用sun.png表现太阳、使用eartrh.png表现地球使 用moon.png表现月球,图它们保存在images目录下
首先定义一个Canvas元素
要实现动画效果,除了绘图外,还需要解决下面两问题 (1)定期绘图,也就是每隔一段时间就调用绘 图函数进行绘图。动画当时多次绘图实现的, 一次绘图只能实现静态图像。 可以使用setInterval()方法设置一个定时器 ,语法如下: setInterval(函数名,时间间隔) 时间间隔的单位是ms,每经过指定的时间间隔 系统都会自动调用指定的函数。 (2)清除先前绘制的所有图形。物体已经移动 开来,可原来的位置上还保留先前绘制的图形 ,这样当然不行。解决这个问题最简单的方法 是使用clearRect方法清除画布中的内容。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验名称:绘制太阳系(实验八)
班级:信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.运行结果截图。

相关文档
最新文档