ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:1.98MB ,
资源ID:11545958      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11545958.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《计算机图形学》课程设计报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《计算机图形学》课程设计报告.docx

1、计算机图形学课程设计报告计算机图形学课程设计报告课题名称: Solar System(大阳系) 课题负责人名(学号): 曾睿(0643111150) 同组成员名单(角色): 曾睿(0643111150) 指导教师: 李征 评阅成绩: 评阅意见: 提交报告时间:2008 年 12 月 17 日Solar System(太阳系)软件工程 专业学生 曾睿 指导老师 李征摘要太阳系(Solar System)是以太阳为中心,和所有受到太阳重力约束的天体的集合体,主要包括太阳,八大行星,以及卫星.此课题模拟太阳系围绕太阳运转的模型,以太阳,八大行星和月球形成大致的体系结构,以VC6.0为平台用OpenG

2、L基础知识实现从不同角度观测太阳系.关键词: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、星,各有各的大小,其中以木星最大,以各自不同的公转速度绕太阳运行,并自转.3.月球月球是围绕地球旋转的卫星.体积是系统中最小的,旋转周期比较快。五. 理论基础:用windows api创建窗口,使用OpenGL绘制函数绘制球体,实现位图文件读取,并转换为纹理,使用系统时间控制球体转动,设置视点视角,通过改变视角从不同角度观测.所使用的计算机图形学理论基础:1. 3D管道中的几何变换旋转矩阵行向量为该矩阵坐标系在原坐标系上的坐标,列向量为原坐标系的向量在本旋转矩阵坐标系上的坐标。旋转是欧氏变换;旋转、放缩是线性变换;旋转、放缩、平移是仿射变换;旋转、放缩、平移、透视投影是射影变换。线性变换在四维

4、空间,仿射变换在三维空间,射影必须采用摄像坐标系,仿射变换是到自身的一类变换.齐次坐标系就是将一个原本是n维的向量用一个n+1维向量来表示。 实数。显然一个向量的齐次表示是不唯一的,齐次坐标的h取不同的值都表示的是同一个点,比如齐次坐标8,4,2、4,2,1表示的都是二维点2,1。 它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。4维坐标的旋转到了3维坐标就是平移.世界坐标系描述了物体在空间的位置,角度在世界坐标系中可以设定物体的位置,决定物体以什么方式进行放置局部坐标系描述了物体的形状,大小,样式等,可以在这一坐标系中设定物体的形状当我们在虚拟

5、场景中放置物体时,必须将其从局部坐标系转换到世界坐标系局部到世界的坐标系转换可以看做向量的转化局部坐标系到世界坐标系:旋转,放缩,平移世界坐标系到观测坐标系:平移,旋转。透视投影,就是以中心投影为依据所作的透视图象。正交投影将物体垂直的投影在屏幕上,在正交投影当中,物体的大小不会随着视口屏幕等参数的改变而变化。在正交投影中,三维物体的坐标沿平行线投影到观察平面上,它保持物体的有关比例不变。虚拟摄像机的内部参数是指摄像机的几何和光学参数,包括焦距、缩放系数、摄像机光轴和像平面的交点,外部参数主要是指摄像机坐标系与世界坐标系的转换矩阵. OPENGL中有Glulookat, Glperspecti

6、ve, Glmodelviewmatrix等函数可以完成对摄像机内、外参数的指定.void gluLookAt( GLdouble eyex,GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz );eye=(eyex, eyey, eyez)是视点(原点)的位置 center = (centerx, centery, centerz)是视口中心点的位置 center - eye是z轴负方向 z =

7、(eye - center) / |eye - center| up = (upx, upy, upz) - eye表示上方 x轴正方向x = up z / |up z| y轴正方向(就是正上方)y = z xgluLookAt()相当于设定平移,旋转,倾斜三个基本的矩阵.void gluPerspective(GLdouble fovy, /角度GLdouble aspect,/视景体的宽高比GLdouble zNear,/沿z轴方向的两裁面之间的距离的近处GLdouble zFar /沿z轴方向的两裁面之间的距离的远处)2. 2D管道中的像素操作几何图形像素化就是将几何物体按照一些设定好的

8、方法投影到屏幕上的过程和方法. 像素化就是在图像上每隔一段距离取一个点,作为该区域的颜色代表。将其数字化。这种存储转化叫做像素化。因为计算机不能处理无限的,只能处理有限的,这样做能更好的抽象出对象,并处理。用几何线段和几何连接构成的图形叫做几何图形,一般是有点和线构成面,像素图形是像素化后得到的图形,只有这样才能处理这些图形.斜率-截距方程主要使用Bresenham画线算法逐像素的进行绘制如y=kx+m的方程参数方程中的圆因为各方位一致,所以只需考虑8分之1的段即可,而椭圆参数方程则要考虑4分支1的段。直线段在像素化过程中要先利用bresnham算法,d误差率被用来计算坐标,公式di+1=di

9、+k(xi+1-xi),根据d是否大于0.5决定y坐标是否递增。图像出现不准确的锯齿状的边缘等现象叫走样,产生原因是由于低频采样不充分而造成的信息失真或由离散量表示连续量引起的失真.超采样方法来进行直线反走样.原理是将每个像素分成nn个子像素,然后在子像素级对直线进行光栅化,这样就可以得到每个像素中被激活的子像素的个数.在nn伪光栅上,可以光栅化的子像素最多为n个.每个物理像素的光强与其被激活的子像素数与n的比值成正比.假设一个物理像素中被激活的子像素有m个,其可能的最大光强为Imax,为该像素的光强.3. 光照模型环境光是模拟2次、3次以及多次光反射形成的,是来自于周围环境没有固定方向的光,

10、在物体和周围环境之间多次反射后,最终达到平衡时的一种光,又称为背景光.环境光没有空间和方向上的特征,它在任何方向上的分布都相同,在所有方向上和所有物体表面上投射的环境光的量都是恒定不变的.环境光主要是通过背景光影与主体形成某种映衬和对比,达到突出主体的目的,还有表现特定环境、时间或造成某种特殊气氛和影调等作用.平行光源光线平行发散,点光源光线球体发散,二者在特定条件可以转化。聚光光源使用聚光镜头或反射镜等聚成的光,点光型比较简单.点光源达到无穷远就成为平行光源,点光源入射光源不同,聚光(点光源加衰减)入射方向不一样。平行光源发出光线各线条平行,点光源从某一点发散出光线,聚光光源从某一点按一定的

11、张角发射光线,面光源是一个平面发出光线.漫反射是由物体表面的粗糙不平引起的,它均匀地向各个方向传播,与视点无关。漫反射由于是球面型的,所以向四面八方都反射,镜面反射处理为平行光的反射,具体处理的时候,不记录具体值,而采用路径算法,大大简化了计算量。一般来说,从物体表面反射或折射出来的光的强度取决于光源的位置与光的强度、物体表面的位置和朝向、表面材质的性质和视点的位置。对于理想镜面,反射光都将集中在镜面的反射方向上,视线只有在与反射光线重合时才能观察到镜面反射光。但是,对于那些非理想的镜面,由于表面实际上是由许多不同朝向的微小平面组成,镜面反射光将分布于表面的镜面反射方向的周围.全局光照模型中射

12、线跟踪算法的基本原理:由光源发出的光到达景物表面后,产生反射和折射,简单光照明模型和简单光透射模型模拟了这两种现象。在简单光照明模型中,反射被分为理想漫反射和镜面反射光,在简单光透射模型中,把透射光分为理想漫透射光和规则透射光。由光源发出的光称为直接光,景物对直接光的反射或折射称为直接反射和直接折射,相对地,把景物表面间对光的反射和折射称为间接光,间接反射、间接折射,这些是光线在景物之间的传播方式,是光线跟踪算法的基础。 最基本的光线跟踪算法是跟踪镜面反射和折射。从光源发出的光遇到景物的表面,发生反射和折射,光就改变方向,沿着反射方向和折射方向继续前进,直到遇到新的景物。但是光源发出光线,经反

13、射与折射,只有很少的部分可以进入人的眼睛。因此实际光线跟踪算法的跟踪方向与光传播的方向是相反的,而是视线跟踪,由视点向象素发出一根射线,与第一个景物相交后,在其反射与折射方向上进行跟踪。六详细设计:设置视觉坐标系:利用实用库函数gluLookAt()设置视觉坐标系。void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);该函数定义一个视图矩阵,并与当前矩阵相

14、乘。eyex,eyey,eyez指定视点的位置;centerx,centery,centerz 指定参考点的位置;upx,upy,upz 指定视点向上的方向(如图)视点E、参考点C、视点向上的方向U实际上就是设定了一个视觉坐标系。模型变换:是在世界坐标系中进行的。在这个坐标系中,可以对物体实施平移glTranslatef()、旋转glRotatef()。glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); / 将坐标系绕X轴旋转-90度glTranslatef(1.7f, 0.0f, 0.0f); / 将坐标系右移1.7f绘制球体:每个三维物体包括两种形式:网状体(wire

15、)和实心体(solid)。网状体没有平面法向,而实心体有,能进行光影计算,有光照时采用实心体模型。GLUquadricObj *quadric; / 建立二次曲面对象quadric = gluNewQuadric();/ 建立一个曲面对象指针gluSphere(quadric, 0.3f, 32, 32); / 绘制太阳球体矩阵入栈和矩阵出栈:voidglPushMatrix();voidglPopMatrix();所有几何投影变换都是矩阵相乘的结果。这两个重要函数保存一个初始坐标点.释放缓存:不考虑信息缓存区是否放满,强制主机把命令传输出去。在高档体系结构中,每种操作是由图形硬件的不同部分分

16、别执行的,CPU负责控制,这样才可以保证计算机资源的充分利用,提高作图质量和作图速度。OpenGL中提供了解决这个问题的操作。glFlush();建立窗口:glutInitWindowSize(WIN_WIDTH, WIN_HEIGHT); / 初始化窗口大小glutInitWindowPosition(30,30); / 初始化窗口位置glutCreateWindow(WIN_TITLE); / 建立窗口七、源代码:loadTexture.h#ifndef LOADTEXTURE#define LOADTEXTURE/ 纹理图像结构typedef struct int imgWidth; /

17、 纹理宽度 int imgHeight; / 纹理高度 unsigned char byteCount; / 每个象素对应的字节数,3:24位图,4:带alpha通道的24位图 unsigned char *data; / 纹理数据TEXTUREIMAGE;/ BMP文件头#pragma pack(2)typedef struct unsigned short bfType; / 文件类型 unsigned long bfSize; / 文件大小 unsigned short bfReserved1; / 保留位 unsigned short bfReserved2; / 保留位 unsign

18、ed long bfOffBits; / 数据偏移位置BMPFILEHEADER;#pragma pack()/ BMP信息头typedef struct unsigned long biSize; / 此结构大小 long biWidth; / 图像宽度 long biHeight; / 图像高度 unsigned short biPlanes; / 调色板数量 unsigned short biBitCount; / 每个象素对应的位数,24:24位图,32:带alpha通道的24位图 unsigned long biCompression; / 压缩 unsigned long biSi

19、zeImage; / 图像大小 long biXPelsPerMeter;/ 横向分辨率 long biYPelsPerMeter;/ 纵向分辨率 unsigned long biClrUsed; / 颜色使用数 unsigned long biClrImportant; / 重要颜色数BMPINFOHEADER; /载入BMP位图文件void LoadBmp(char *filename, TEXTUREIMAGE *textureImg);/生成纹理void MakeTexture(TEXTUREIMAGE textureImg, GLuint * texName);#endifloadT

20、exture.cpp#include #include #include #include #include #include loadTexture.hvoid LoadBmp(char *filename, TEXTUREIMAGE *textureImg) / 载入图片 int i, j; FILE *file; BMPFILEHEADER bmpFile; BMPINFOHEADER bmpInfo; int pixel_size; / 初始化纹理数据 textureImg-imgWidth = 0; textureImg-imgHeight = 0; if (textureImg-d

21、ata != NULL) delete textureImg-data; / 打开文件 file = fopen(filename, rb); if (file = NULL) return; / 获取文件头 rewind(file); fread(&bmpFile, sizeof(BMPFILEHEADER), 1, file); fread(&bmpInfo, sizeof(BMPINFOHEADER), 1, file); / 验证文件类型 if (bmpFile.bfType != 0x4D42) return; / 获取图像色彩数 pixel_size = bmpInfo.biBit

22、Count 3; / 读取文件数据 textureImg-data = new unsigned charbmpInfo.biWidth * bmpInfo.biHeight * pixel_size; for(i = 0 ; i bmpInfo.biHeight; i+) fseek(file, bmpFile.bfOffBits + (bmpInfo.biHeight - i - 1) * bmpInfo.biWidth * pixel_size, SEEK_SET); for (j = 0; j data + (i * bmpInfo.biWidth + j) * pixel_size

23、+ 2, sizeof(unsigned char), 1, file); / 绿色分量 fread(textureImg-data + (i * bmpInfo.biWidth + j) * pixel_size + 1, sizeof(unsigned char), 1, file); / 蓝色分量 fread(textureImg-data + (i * bmpInfo.biWidth + j) * pixel_size + 0, sizeof(unsigned char), 1, file); / Alpha分量 if (pixel_size = 4) fread(textureImg

24、-data + (i * bmpInfo.biWidth + j) * pixel_size + 3, sizeof(unsigned char), 1, file); / 记录图像相关参数 textureImg-imgWidth = bmpInfo.biWidth; textureImg-imgHeight = bmpInfo.biHeight; textureImg-byteCount = pixel_size; fclose(file);void MakeTexture(TEXTUREIMAGE textureImg, GLuint * texName) /转换为纹理 glPixelSt

25、orei(GL_UNPACK_ALIGNMENT, 1); glGenTextures(1,texName); glBindTexture(GL_TEXTURE_2D , *texName); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParamete

26、rf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureImg.imgWidth,textureImg.imgHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, textureImg.data);Solar.cpp#include #include #include #include loadTexture.h/ 定义窗口的标题、宽度、高度、全屏布尔变量#define WIN_TITLE 模拟太阳系-0643111150-曾睿con

27、st int WIN_WIDTH = 800;const int WIN_HEIGHT = 600;BOOL isFullScreen = FALSE; / 初始不为全屏#define DEG_TO_RAD 0.017453float angle=0.0;static GLdouble viewer= 0,0,0,0,0; / 初始化视角GLUquadricObj *quadric; / 建立二次曲面对象GLfloat angle_Z; / 星空旋转角度bool g_bOrbitOn = true; / 控制转动暂停float g_fSpeedmodifier = 1.0f;/ 时间控制flo

28、at g_fElpasedTime;double g_dCurrentTime;double g_dLastTime;GLfloat LightAmbient = 1.0f, 1.0f, 1.0f, 0.0f ; / 环境光参数GLfloat LightDiffuse = 1.0f, 1.0f, 1.0f, 0.0f ; / 漫射光参数GLfloat LightPosition = 0.0f, 0.0f, 0.0f, 1.0f ; / 光源的位置/ 纹理图象TEXTUREIMAGE skyImg;TEXTUREIMAGE sunImg;TEXTUREIMAGE rayImg;TEXTUREIM

29、AGE mercuImg;TEXTUREIMAGE venusImg;TEXTUREIMAGE earthImg;TEXTUREIMAGE marsImg;TEXTUREIMAGE jupiterImg;TEXTUREIMAGE saturnImg;TEXTUREIMAGE uranusImg;TEXTUREIMAGE neptuneImg;TEXTUREIMAGE moonImg;GLuint texture12; / 纹理数组/ 星球速度定义static float fSunSpin = 0.0f; / 太阳自转速度static float fMercuSpin = 0.0f; / 水星自转速度static float fMercuOrbit = 0.0f; / 水星公转速度static float fVenusSpin = 0.0f; / 金星自转速度static float fVenusOrbit = 0.0f; / 金星公转速度static float fEarthSpin = 0.0f; / 地球自转速度static float fEarthOrbit = 0.0f; / 地球公转速度static float fMarsSpin = 0.0f; / 火星自转速度static float fMarsOrbit =

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1