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

合集下载

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

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

《计算机图形学》课程设计报告题目名称:专业班级学号姓名指导教师年月日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方法清除画布中的内容。

快速制作太阳系模型的Blender教程

快速制作太阳系模型的Blender教程

快速制作太阳系模型的Blender教程太阳系是我们所在的宇宙家园,其中包含了太阳、八大行星、恒星和其他天体。

在Blender这款强大的三维建模软件中,我们可以轻松而快速地制作出太阳系模型。

下面将为您介绍一些简单的使用技巧。

首先,打开Blender软件,创建一个新的项目。

在3D视图中,鼠标右键点击默认的立方体,并按快捷键"X"删除它。

这样我们就有了一个空白的场景。

接下来,我们需要分别创建太阳、行星和其他天体的模型。

选择一个球体,通过鼠标左键拖动调整其大小,使其成为太阳的模型。

确保选中了这个球体,然后按快捷键"Shift+D"复制一份。

通过拖动复制出的球体,将其放置在太阳的周围,作为行星的模型。

现在,我们需要给每个行星创建一个轨道。

选中太阳,然后按快捷键"Shift+S",选择"光标定位到选择的对象"。

接着,按快捷键"Shift+A",选择"曲线-圆圈"创建一个圆圈。

将鼠标移动到上方的属性面板中,在"Geometry"下的"Radius"中调整圆圈的大小,以便适应行星的位置。

然后选中行星,按快捷键"Shift+S",选择"光标定位到选择的对象"。

再次按快捷键"Shift+A",选择"曲线-样条曲线"创建一条样条曲线。

将鼠标移动到属性面板中,在"Shape"下的"Fill"中选择"Full"。

然后在"Object Data"选项卡中,将"Bevel Depth"调整为适当大小,确定完成。

接下来,我们需要为每个行星添加材质。

选中一个行星,然后切换到"材质"属性面板。

计算机图形学 课程设计

计算机图形学 课程设计

2、gluSphere(quadric, 0.45f, 40, 40)函数是在原点绘制图形,经过 glTranslatef* 和 glRotatef*平移和旋转可以随意改变球体位置:
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕 X 轴旋转-90 度 glTranslatef(1.7f, 0.0f, 0.0f); // 将坐标系右移 1.7f
8、建立一个地球公转轨道,调用函数 glTranslatef*把球体平移一定距离,使其在自
4
己的轨道上运行。同时为了使月球跟随地球,glRotatef(fEarthOrbit , 0.0f, 1.0f, 0.0f); 将坐标系绕 Y 轴旋转地球公转的角度,控制月亮跟随地球,用函数 glTranslatef*平移使月 球轨道在地球周围而不与地球重叠。
5
参数代表要操作的目标,GL_PROJECTION 是对投影矩阵操作,GL_MODELVIEW 是对模型视景矩 阵操作,GL_TEXTURE 是对纹理矩阵进行随后的操作。 13、glutIdleFunc(void (*func)(void))在 glutIdleFunc(void (*func)(void))回调函数 中指定一个函数,如果不存在其他尚未完成的事件(例如,当事件循环处于空闲的时候), 就执行这个函数。这个回调函数接受一个函数指针作为它的唯一参数。如果向它传递 NULL(0),就相当于禁用这个函数。glutMainLoop 进入 GLUT 事件处理循环。在一个 GLUT 程 序中,这个例程被调用一次 。一旦被调用,这个程序将永远不会返回 无限循环。它将调用 必要的任何已注册的回调。程序最后调用这个函数,让程序循环执行下去,使运动继续下去。
9、OpenGl 把三维坐标中的球体绘制到而为坐标屏幕,绘制的顺序是按代码的顺序来进 行的。因此后绘制的物体会遮住先绘制的物体,既使后绘制的物体在先绘制的物体后面也是 一样,使用深度测试可以解决这个问题。使用方法是:以 GL_DEPTH_TEST 为参数调用 glEnable 函数,启动深度测试。在必要时(通常是每次绘制画面开始时)清空深度缓冲,即: glClear(GL_DEPTH_BUFFER_BIT) , 其 中 glClear(GL_COLOR_BUFFER_BIT) 与 glClear(GL_DEPTH_BUFFER_BIT) 可 以 合 并 写 为 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT),且后者运行速度比前者快。

简易太阳系

简易太阳系

简易太阳系本程序是基于纹理技术和光照处理技术来模拟简易太阳系的,借鉴了网上一些纹理贴图的方法。

下面简要介绍一下所用的方法。

纹理贴图技术也叫纹理映射技术,它是计算机图形学中广泛应用的一项重要技术。

传统的几何造型只能表示景物的形状,无法描述景物表面的微观细节,而利用纹理图像来描述景物表面各点处的反射属性,可以达到模拟景物表面丰富的纹理细节的目的,提高计算机生成图形的真实性。

另一方面,采用纹理映射的方法可以大大地简化建模的过程。

比如,同是一栋大楼表面,若完全用建模的方法来构造,则需要画出大楼的每一扇门、每一扇窗户;若采用纹理映射,只需建立简单的长方体模型,用拍下的大楼外观图片贴至模型表面即可。

相比之下,工作量要小得多。

纹理映射是将指定图像的一部分映射到允许进行纹理映射的每个图段上。

这种映射伴随着使用一幅图像的颜色到某一图段的(s,t,r)坐标所指示的位置上并修改该图段的RGBA颜色。

但要特别注意的是,在OpenGL中,纹理映射仅在RGBA模式下说明,在颜色索引模式下,它的使用未作定义。

概括地说,使用纹理绘制的一般步骤为:定义纹理贴图、控制纹理、说明纹理贴图方式,定义纹理坐标等。

纹理的定义有两种:连续法和离散法。

连续法把纹理定义为一个二元函数,函数的定义域就是纹理空间。

而离散法则是把纹理定义在一个二维数组中,该数组表示纹理空间中行间隔和列间隔固定的一组网格点上的纹理值。

网格点之间的其它点的纹理值可以通过对相邻网格点上纹理值进行插值来获得。

通过纹理空间与物体空间之间的坐标变换,可以把纹理映射到物体表面。

一般来说,离散法是较为常用的纹理定义方法。

其实现函数为glTexlmage2D()。

该函数的原型如下:void glTexImage2D(Gl_enum target,GLint level,Gl _enum compo—nents,GLsizei width,GLsizei height,Glint border,Gl_enumformat。

计算机图形学报告——太阳系

计算机图形学报告——太阳系

Solar System计算机图形学课程报告文档编号:报告名称:算法设计编写:谢天添05编写日期:2009-12指导老师:李征审核日期:1 图形学基本原理........................................... 错误!未定义书签。

几何变换相关原理................................. 错误!未定义书签。

几何图形像素化相关原理........................... 错误!未定义书签。

光照模型相关原理................................. 错误!未定义书签。

2 系统界面与操作说明(阐述如何操作你的软件)............... 错误!未定义书签。

系统界面与图形显示示例........................... 错误!未定义书签。

操作说明(配合图示进行说明)..................... 错误!未定义书签。

3 源程序:................................................. 错误!未定义书签。

太阳系概述:..................................... 错误!未定义书签。

数据收集:....................................... 错误!未定义书签。

类设计:......................................... 错误!未定义书签。

Main Class ................................... 错误!未定义书签。

辅助类:..................................... 错误!未定义书签。

模块增强类:................................. 错误!未定义书签。

功能设计:....................................... 错误!未定义书签。

你们要的Python绘画3D太阳系详细代码

你们要的Python绘画3D太阳系详细代码

你们要的Python绘画3D太阳系详细代码⽤得到⼀些朋友的欣赏,然后有同学提出了绘制三维太阳系的要求。

从Python画图的⾓度来说,三维太阳系其实并不难,问题在于⼋⼤⾏星对黄道⾯的倾斜太⼩,所以尽管画个三维的图,但就观感⽽⾔,⽆⾮是把⼆维的嵌⼊到三维空间罢了。

来点⼩⾏星代码如下from os import cpu_countimport numpy as npfrom numpy.random import randimport matplotlib.pyplot as pltfrom matplotlib import animationau,G,RE,ME = 1.48e11,6.67e-11,1.48e11,5.965e24m = np.array([3.32e5,0.055,0.815,1,0.107,317.8])*ME*Gr = np.array([0,0.387,0.723,1,1.524,5.203])*REv = np.array([0,47.89,35.03,29.79,24.13,13.06])*1000theta = rand(len(m))*np.pi*2cTheta,sTheta = np.cos(theta), np.sin(theta)xyz = r*np.array([cTheta, sTheta, 0*r]) #位置三分量,因为参数太多,所以把这三个分量写在了⼀起uvw = v*np.array([-sTheta, cTheta, 0*v]) #速度三分量N_ast = 100m_ast = rand(N_ast)*1e20r_ast = (rand(N_ast)*3.5+1.6)*REv_ast = np.sqrt(G*3.32e5*ME/r_ast) #⼩⾏星速度sqrt(GM/R)theta = rand(N_ast)*np.pi*2phi = (rand(N_ast)-0.5)*0.3 #给⼀个随机的⼩倾⾓cTheta,sTheta = np.cos(theta), np.sin(theta)cPhi,sPhi = np.cos(phi),np.sin(phi)xyza = r_ast*np.array([cTheta*cPhi, sTheta*cPhi, sPhi])uvwa = v_ast*np.array([-sTheta*cPhi, cTheta*cPhi, sPhi])name = "solar.gif"fig = plt.figure(figsize=(10,10))ax = fig.add_subplot(projection='3d')ax.grid()ax.set_xlim3d([-5.5*RE,5.5*RE])ax.set_ylim3d([-5.5*RE,5.5*RE])ax.set_zlim3d([-5.5*RE,5.5*RE])traces = [ax.plot([],[],[],'-', lw=0.5)[0] for _ in range(len(m))]pts = [ax.plot([],[],[],marker='o')[0] for _ in range(len(m))]pt_asts = [ax.plot([],[],[],marker='.')[0] for _ in range(N_ast)]N = 500dt = 3600*50ts = np.arange(0,N*dt,dt)xyzs,xyzas = [],[]for _ in ts:xyz_ij = (xyz.reshape(3,1,len(m))-xyz.reshape(3,len(m),1))r_ij = np.sqrt(np.sum(xyz_ij**2,0))xyza_ij = (xyz.reshape(3,1,len(m))-xyza.reshape(3,N_ast,1))ra_ij = np.sqrt(np.sum(xyza_ij**2,0))for j in range(len(m)):for i in range(len(m)):if i!=j :uvw[:,i] += m[j]*xyz_ij[:,i,j]*dt/r_ij[i,j]**3for i in range(N_ast):uvwa[:,i] += m[j]*xyza_ij[:,i,j]*dt/ra_ij[i,j]**3xyz += uvw*dtxyza += uvwa*dtxyzs.append(xyz.tolist())xyzas.append(xyza.tolist())xyzs = np.array(xyzs).transpose(2,1,0)xyzas = np.array(xyzas).transpose(2,1,0)def animate(n):for i in range(len(m)):xyz = xyzs[i]traces[i].set_data(xyz[0,:n],xyz[1,:n])traces[i].set_3d_properties(xyz[2,:n])pts[i].set_data(xyz[0,n],xyz[1,n])pts[i].set_3d_properties(xyz[2,n])for i in range(N_ast):pt_asts[i].set_data(xyzas[i,0,n],xyzas[i,1,n])pt_asts[i].set_3d_properties(xyzas[i,2,n])return traces+pts+pt_astsani = animation.FuncAnimation(fig, animate,range(N), interval=10, blit=True)plt.show()ani.save(name)总结本篇⽂章就到这⾥了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!。

计算机图形学刘之源太阳系

计算机图形学刘之源太阳系

《计算机图形学》课程设计报告课题名称:模拟太阳系课题负责人名(学号):杨建峰(0843042072)同组成员名单(角色):指导教师:李征评阅成绩:评阅意见:提交报告时间:2010 年12月 15日摘要:随着计算机技术的飞速发展,计算机性价比越来越高。

这为计算机图形学发展奠定了坚实的基础。

Microsoft、SGI等大公司推出了OpenGL三维图形标准,彻底改变过去只能依赖于价格昂贵的图形工作站及复杂的三维图形软件从事三维图形计算机应用的历史。

OpenGL的出现为大多数程序员利用C语言操纵PC 机绘制复杂图形的想法变为现实。

本文介绍了利用VC++6.0,借助于OpenGL库函数设计三维图形的基本方法及编程中的注意事项。

由于采用了传统C语言设计方法,这大大方便那些初次接触OpenGL的程序员,可使他们快速掌握设计OpenGL程序的方法和步骤。

关键字:OpenGl, VC++6.0,模拟星云的旋转一、OpenGL介绍OpenGL是独立于操作系统的、开放式的三维图形标准。

OpenGL实际上是一种图形与硬件的接口,它包括了100 多个图形函数,可以利用这些函数建立三维模型和三维实时交互。

与其他图形软件程序设计接口不同的是,OpenGL 提供了非常清晰的图形函数。

利用这些图形函数,用户不但可以直接使用自己的数据,而且可以利用其他的数据源。

OpenGL也是网络透明的,它的运行机制是客户/服务器机制,由客户 (OpenGL的应用程序)向服务器(OpenGL的内核)发送OpenGL 命令请求,服务器则解释执行这些命令。

一般客户和服务器运行于同一台计算机上。

在 Windows NT 平台上,OpenGL 图形库被封装在 opengl32.dll 中。

Windows NT调用opengl32.dll动态链接库,处理用户程序对OpenGL函数调用,然后再调用winsrv.dll, OpenGL的命令再次得到处理并直接传给Win32 的其他设备驱动接口,最后把处理的图形指令传递给视频显示驱动程序。

太阳系

太阳系

计算机三维动画太阳系模型设计文档目录一功能简介 (1)二主要流程 (1)1.前期的初始化准备 (1)2.设置纹理映射的相关模式 (1)3.开始绘制对象 (1)4.设置照相机相关参数 (1)三主要结构 (1)1.初始化相关参数 (1)2.太阳的绘制 (2)3.地-月系统的绘制 (2)4.后期操作 (3)附录 (5)LoadBMP.h文件代码: (5)Solar.cpp中的代码: (11)一功能简介本程序在三维空间绘制了一幅动画,太阳在屏幕中心自转,表面跳跃着火焰;蓝色的地球一边绕着太阳公转,同时一边自转,四大洋、七大洲清晰可见;土色的月球一边绕着地球公转,同时自转.它们的公转平面、自转轴,公转周期、自转周期都是经过严格的数学计算,与真实的情境几乎一致.本程序主要的技术有,本地坐标和相对坐标的应用、对象之间的依赖关系(如本程序的月球绕着地球公转)、纹理映射等.二主要流程1.前期的初始化准备设置背景色,清空颜色和深度缓存,设置窗口的尺寸和位置,初始化命令行参数.这些都是典型的常规操作.2.设置纹理映射的相关模式即二维静态图片与标准三维球体的映射,设置点光源,键鼠设备的交互式操作按键设置.3.开始绘制对象太阳在屏幕中心自转,并载入太阳纹理;绘制“地球-月球”系统,原则是地球绕太阳公转并同时自转,月球绕地球公转并同时自转,它们各自的公转平面,自转轴,公转、自转周期都依据严格的计算,同时载入地球月球的纹理.4.设置照相机相关参数如视口大小、照相机位置、透视类型等.三主要结构1.初始化相关参数year=day/365;month=day/30;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);GLfloat mat_ambient1[] = {1,0,0,1};GLfloat mat_emission[] = {1,1,1,0};GLfloat mat_ambient2[] = {0.4,0.4,0.8,1};GLfloat no_emission[] = {0,0,0,1};2.太阳的绘制太阳的绘制非常简单,主要完成纹理映射和自转.glPushMatrix();glBindTexture(GL_TEXTURE_2D,sun->texID);glRotatef (month, 0.0, 1.0, 0.0); //太阳自转glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);glRotatef (90, -1, 0, 0);gltDrawSphere(1.0, 40, 40); //绘制太阳glPopMatrix();3.地-月系统的绘制关键的一点,月球是相对地球公转,而地球又同时绕太阳公转,所以,月球应该是地球的子结点,地球的所有动作全部都要叠加到月球上去,然后再加上月球自身的动作,才是月球最终的运动.glPushMatrix(); //地月的公共行为glRotatef (year, 0.0, 1.0, 0.0); //月亮与地球一起绕太阳转(地球公转)//这是最为关键的一步glPushMatrix();glBindTexture(GL_TEXTURE_2D,earth->texID);glTranslatef (3.0, 0.0, 0.0);glRotatef (month, 0.0, 1.0, 0.0); //地球自转glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient2);glMaterialfv(GL_FRONT, GL_EMISSION, no_emission);glRotatef (90, -1, 0, 0);gltDrawSphere(0.4, 40, 40); //绘制地球glPopMatrix();glPushMatrix();glBindTexture(GL_TEXTURE_2D,moon->texID);glTranslatef (3.0, 0.0, 0.0);glRotatef (60, -1, 1, 0);glRotatef (month, 0, 1.0, 0); //月球绕地球公转glTranslatef (0.6, 0.0, 0.0);glRotatef (90, -1, 0, 0);gltDrawSphere(0.07, 20, 20); //绘制月球glPopMatrix();glPopMatrix();4.后期操作glFlush(); //刷新glutSwapBuffers(); //交换缓冲区本程序共有两个文件LoadBMP.h和solar.cpp,LoadBMP.h中定义了一些常规的工具,如纹理映射具体实现细则,键鼠交互式操作设置,球体绘制函数设计.solar.cpp中则主要完成绘制过程.两个文档的内容见附录.下面是程序运行的截图.附录LoadBMP.h文件代码:#define BITMAP_ID 0x4D42#define PI 3.1415926#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <gl\glut.h>#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )//---------- 纹理数据结构typedef struct{int width; //纹理宽度int height; //纹理高度unsigned int texID; //纹理对象IDunsigned char * data; //实际纹理数据}texture;static float year = 0, month =0,day = 0, angle=100;static bool first=false;texture * sun,* earth,* moon; //纹理指针//---------- 调入位图作为纹理数据unsigned char * LoadBmpFile(char * filename,BITMAPINFOHEADER * bmpInfoHeader){FILE * file;BITMAPFILEHEADER bmpFileHeader;unsigned char * image;unsigned int imageIdx =0;unsigned char tempRGB;file = fopen(filename,"rb");if(file == NULL)return 0;fread(& bmpFileHeader,sizeof(BITMAPFILEHEADER),1,file); // 读取BMP 文件头if (bmpFileHeader.bfType != BITMAP_ID) // 验证是否是一个BMP 文件{fclose(file);return 0;}fread(bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,file); // 读位图信息头fseek(file,bmpFileHeader.bfOffBits,SEEK_SET); // 将文件指针移到位图数据的开始处image = (unsigned char * )malloc(bmpInfoHeader->biSizeImage); // 分配内存给位图数据if (! image){free(image);fclose(file);return 0;}fread(image,1,bmpInfoHeader->biSizeImage,file); // 读取位图数据if (image == NULL){fclose(file);return 0;}// 反转R 和B 值以得到RGB,因为位图颜色格式是BGRfor (imageIdx = 0;imageIdx < bmpInfoHeader->biSizeImage;imageIdx += 3) {tempRGB = image[imageIdx];image[imageIdx] = image[imageIdx + 2];image[imageIdx + 2] = tempRGB;}fclose(file);return image;}//---------- 调入纹理文件texture * LoadTexFile(char * filename){BITMAPINFOHEADER texInfo;texture * thisTexture;thisTexture = (texture * )malloc(sizeof(texture));if(thisTexture == NULL)return 0;thisTexture->data = LoadBmpFile(filename,&texInfo); // 调入纹理数据并检查有效性if (thisTexture->data == NULL){free(thisTexture);return 0;}thisTexture->width = texInfo.biWidth; // 设置纹理的宽和高thisTexture->height = texInfo.biHeight;glGenTextures(1,&thisTexture->texID); // 生成纹理对象名return thisTexture;}//---------- 初始化所有纹理数据和属性BOOL LoadAllTextures(){sun = LoadTexFile("sun.bmp");if(sun == NULL)return FALSE;glBindTexture(GL_TEXTURE_2D,sun->texID);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINE AR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINE AR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA,sun->width,sun->height,G L_RGB,GL_UNSIGNED_BYTE,sun->data);earth = LoadTexFile("earth.bmp");if(earth == NULL)return FALSE;glBindTexture(GL_TEXTURE_2D,earth->texID);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEglTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINE AR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA,earth->width,earth->heigh t,GL_RGB,GL_UNSIGNED_BYTE,earth->data);moon = LoadTexFile("moon.bmp");if(moon == NULL)return FALSE;glBindTexture(GL_TEXTURE_2D,moon->texID);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINE AR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINE AR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA,moon->width,moon->heig ht,GL_RGB,GL_UNSIGNED_BYTE,moon->data);return TRUE;}void gltDrawSphere(GLfloat fRadius, GLint iSlices, GLint iStacks){GLfloat drho = (GLfloat)(3.141592653589) / (GLfloat) iStacks;GLfloat dtheta = 2.0f * (GLfloat)(3.141592653589) / (GLfloat) iSlices;GLfloat ds = 1.0f / (GLfloat) iSlices;GLfloat dt = 1.0f / (GLfloat) iStacks;GLfloat t = 1.0f;GLfloat s = 0.0f;GLint i, j;for (i = 0; i < iStacks; i++){GLfloat rho = (GLfloat)i * drho;GLfloat srho = (GLfloat)(sin(rho));GLfloat crho = (GLfloat)(cos(rho));GLfloat srhodrho = (GLfloat)(sin(rho + drho));GLfloat crhodrho = (GLfloat)(cos(rho + drho));glBegin(GL_TRIANGLE_STRIP);s = 0.0f;for ( j = 0; j <= iSlices; j++){GLfloat theta = (j == iSlices) ? 0.0f : j * dtheta;GLfloat stheta = (GLfloat)(-sin(theta));GLfloat ctheta = (GLfloat)(cos(theta));GLfloat x = stheta * srho;GLfloat y = ctheta * srho;GLfloat z = crho;glTexCoord2f(s, t);glNormal3f(x, y, z);glVertex3f(x * fRadius, y * fRadius, z * fRadius);x = stheta * srhodrho;y = ctheta * srhodrho;z = crhodrho;glTexCoord2f(s, t - dt);s += ds;glNormal3f(x, y, z);glVertex3f(x * fRadius, y * fRadius, z * fRadius);}glEnd();t -= dt;}}void drawCircle(GLfloat r){int j=0;glBegin(GL_POINTS);for (j=0;j<100;j++){GLfloat theta=j*2*PI/100;glVertex3f(r*cos(theta),0.0f,r*sin(theta));}glEnd();}Solar.cpp中的代码:#include "LoadBMP.h"void myinit(void){glClearColor (0.0, 0.0, 0.0, 0.0);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D); //启用二维纹理GLfloat light0_ambient[] = {1, 1, 1, 1}; //环境光GLfloat light0_diffuse[] = {1, 1, 1, 1}; //散射光GLfloat light0_position[] = {0, 0, 0, 1}; //光源位置glLightfv(GL_LIGHT0,GL_AMBIENT,light0_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light0_diffuse);glLightfv(GL_LIGHT0,GL_POSITION,light0_position);LoadAllTextures(); //调入纹理}void myidle(){day+=angle;glutPostRedisplay();}void mymouse(int button,int state,int x,int y){if(state==GLUT_DOWN && button==GLUT_LEFT_BUTTON){ if(first){glutIdleFunc(myidle);first=!first;}else{glutIdleFunc(0);first=!first;}}}void mykeyboard(unsigned char key, int x, int y){if (key == 27)exit(0);}void mydisplay(void){year=day/365;month=day/30;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);GLfloat mat_ambient1[] = {1,0,0,1};GLfloat mat_emission[] = {1,1,1,0};GLfloat mat_ambient2[] = {0.4,0.4,0.8,1};GLfloat no_emission[] = {0,0,0,1};glPushMatrix();glBindTexture(GL_TEXTURE_2D,sun->texID);glRotatef (month, 0.0, 1.0, 0.0); //太阳自转glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);glRotatef (90, -1, 0, 0);gltDrawSphere(1.0, 40, 40); //绘制太阳glPopMatrix();glPushMatrix();glRotatef (year, 0.0, 1.0, 0.0); //月亮与地球一起绕太阳转(地球公转)glPushMatrix();glBindTexture(GL_TEXTURE_2D,earth->texID);glTranslatef (3.0, 0.0, 0.0);glRotatef (month, 0.0, 1.0, 0.0); //地球自转glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient2);glMaterialfv(GL_FRONT, GL_EMISSION, no_emission);glRotatef (90, -1, 0, 0);gltDrawSphere(0.4, 40, 40); //绘制地球glPopMatrix();glPushMatrix();glBindTexture(GL_TEXTURE_2D,moon->texID);glTranslatef (3.0, 0.0, 0.0);glRotatef (60, -1, 1, 0);glRotatef (month, 0, 1.0, 0); //月球绕地球公转glTranslatef (0.6, 0.0, 0.0);glRotatef (90, -1, 0, 0);gltDrawSphere(0.07, 20, 20); //绘制月球glPopMatrix();glPopMatrix();glFlush();glutSwapBuffers();}void myreshape (int w, int h){glViewport (0, 0, (GLsizei) w, (GLsizei) h); //指定视口大小glMatrixMode (GL_PROJECTION);glLoadIdentity ();gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1, 20); //透视投影glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //指定照相机的位置}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize (1000, 600);glutInitWindowPosition (100, 100);glutCreateWindow (argv[0]);myinit ();glutDisplayFunc(mydisplay);glutReshapeFunc(myreshape);glutIdleFunc(myidle);glutMouseFunc(mymouse);glutKeyboardFunc(mykeyboard);glutMainLoop();return 0;}。

  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.运行结果截图。

相关文档
最新文档