华科图形学上机实验报告_第1页
华科图形学上机实验报告_第2页
华科图形学上机实验报告_第3页
华科图形学上机实验报告_第4页
华科图形学上机实验报告_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机图形学上机实验报告计算机科学与技术学院班 级: CS1209 学 号: 指导教师: 何云峰 完成日期: 2014.12.2 实验一 Kock雪花曲线的生成1.1实验目的与要求实验目的:1) 掌握用迭代算法实现Kock雪花曲线的方法。2) 熟悉opengl语法的使用。3) 理解窗口到视区的变化。实验要求:利用opengl实现六次迭代后的Kock雪花曲线。1.2实验内容Kock雪花曲线的生成元是一个等边三角形,生成规则是将三角形三条边分别等分为三等分,首尾俩段保持不变,中间用俩段等长且互成60度角的直线段代替,这样每一条边被分成四段,可以求出新的4段直线段的5个端点坐标。迭代次数n=6次,构

2、造迭代函数,将新的直线段按上述规则再分,每次迭代后n-1,直到n=1时开始画线,就可以生成雪花曲线了。考虑用键盘控制迭代次数。按方向键上和方向键右,迭代次数加一;按方向键下和方向键左,迭代次数减一。1.3实验结果1) 初始图形(n=0)如图1-3-1所示。2) 迭代三次的Kock雪花曲线(n=3)如图1-3-2所示。 1.4体会本次实验是图形学的第一次实验,对opengl的用法并不是特别熟悉,所以刚开始不知道怎么做,后来在老师的指导下懂了一点,然后自己慢慢调试,最终做出来了。1.5源程序#include <windows.h>#include <gl/glut.h>#i

3、nclude <stdio.h>#include <math.h>int n=6;/n迭代次数int Kock(float ax,float ay,float bx,float by,int n) float x1,y1,x2,y2,x3,y3; x1=ax+(bx-ax)/3; y1=ay+(by-ay)/3; x2=(ax+bx)/2-(ay-by)*sqrt(3)/6; y2=(ay+by)/2-(bx-ax)*sqrt(3)/6; x3=ax+2*(bx-ax)/3; y3=ay+2*(by-ay)/3; if(n=0) glBegin(GL_LINE_STRI

4、P); glVertex2f(ax,ay); glVertex2f(bx,by); glEnd(); else if(n!=1) Kock(ax,ay,x1,y1,n-1); Kock(x1,y1,x2,y2,n-1); Kock(x2,y2,x3,y3,n-1); Kock(x3,y3,bx,by,n-1); else glBegin(GL_LINE_STRIP); glVertex2f(ax,ay); glVertex2f(x1,y1); glVertex2f(x2,y2); glVertex2f(x3,y3); glVertex2f(bx,by); glEnd(); return 0;v

5、oid Initial(void) glClearColor(1.0f,1.0f,1.0f,1.0f); /设置窗口背景颜色 glMatrixMode(GL_PROJECTION); /指定设置投影参数 gluOrtho2D(0.0,200.0,0.0,150.0); /设置投影参数void ChangeSize(GLsizei w, GLsizei h)if(h = 0)h = 1; glViewport(0, 0, w, h);/设置视区尺寸/ 重置坐标系统glMatrixMode(GL_PROJECTION);glLoadIdentity();/ 建立修剪空间的范围 if (w <

6、= h)glOrtho (0.0f, 300.0f, 0.0f, 300.0f*h/w, 1.0, -1.0); elseglOrtho (0.0f, 300.0f*w/h, 0.0f, 300.0f, 1.0, -1.0);void Display(void) float ax=60.0,ay=70.0,bx=260.0,by=70.0,cx,cy; cx=160.0; cy=100*sqrt(3)+70; glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0, 0.0, 0.0); Kock(ax,ay,bx,by,n); Kock(bx,by,cx,c

7、y,n); Kock(cx,cy,ax,ay,n); glFlush();void SpecialKeys(int key,int x,int y)/键盘控制函数 if(key=GLUT_KEY_LEFT|key=GLUT_KEY_DOWN)&&n>0) n-; printf("n=%dn",n); glutPostRedisplay(); else if(key=GLUT_KEY_RIGHT|key=GLUT_KEY_UP)&&n<6) n+; printf("n=%dn",n); glutPostRedis

8、play(); else printf("Warning!0n6n");int main(int argc,char*argv) glutInit(&argc,argv); /初始化,对命令行参数进行处理 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); /设定窗口的显示模式(包括缓存和显示模式) glutInitWindowSize(400,300); /指定窗口的大小 glutInitWindowPosition(100,100); /指定窗口的位置 glutCreateWindow("Kock曲线正三角形"

9、;); /创建一个窗口 printf("n=6n"); glutDisplayFunc(Display); /设置当前窗口的显示回调函数 glutReshapeFunc(ChangeSize); /设置窗口再整形回调函数 glutSpecialFunc(SpecialKeys); /键盘方向键响应回调函数 Initial(); /完成窗口初始化 glutMainLoop(); /启动主GLUT事件处理循环 return 0;实验二 日地月运动模型2.1 实验目的与要求实验目的:1) 理解opengl中的变换方法和光照模型;2) 掌握产生阴影的方法;3) 了解深度测试,学会调

10、整观察的位置和方向。实验要求:实现太阳,地球和月亮的运动模型,并加上相应的光照模型。2.2 实验内容对老师给出的原子核模型例子做出修改,就可以得到类似于题目要求的模型。在所给代码上减少一个球,并且调整相应的球体大小和旋转步长,就得到了太阳,地球和月亮的运动模型。然后就需要加入光照,考虑建立三个漫反射光源,分别作用于太阳,地球和月亮,在画太阳前打开光源light0,关闭另外俩个光源,注意调整光源位置,得到太阳的球体模型。然后打开光源light1,关闭light0,画地球;再打开光源light2,关闭light1,画出月亮的模型。这样就能产生日地月模型的立体效果了。2.3 实验结果1) 地球与月亮

11、在太阳的左侧时,如图2-3-1所示。图 2-3-1 地月在太阳左侧时的运动图形2) 地球与月亮在太阳的前侧时,如图2-3-2所示。图2-3-2 地月在太阳前侧时的运动图形图2-3-3 地月在太阳右侧时的运动图形3) 地球与月亮在太阳的后侧时,如图2-3-4所示。图2-3-4 地月在太阳后侧时的运动图形2.4 体会老师给出了相应的原子核例子,所以做出日地月的运动模型还是相对比较轻松的。我们主要做的就是改变相对运动的速度和光照,光照方面对我来说较难,但最终在老师和同学的指导下完成了实验内容。2.5 源程序#include <windows.h>#include <gl/glut.

12、h>void Initial()glEnable(GL_DEPTH_TEST); / 启用深度测试glClearColor(1.0f, 1.0f, 1.0f, 1.0f );/背景为白色GLfloat mat_ambient= 0.2f, 0.2f, 0.2f, 1.0f ;GLfloat mat_diffuse= 0.8f, 0.8f, 0.8f, 1.0f ;GLfloat mat_specular = 1.0f, 1.0f, 1.0f, 1.0f ;GLfloat mat_shininess = 50.0f ; /定义3个漫反射光源GLfloat light0_diffuse= 1

13、.8f, 1.8f, 0.0f, 1.0f;GLfloat light0_position = 1.0f, 1.0f, 1.0f, 0.0f ;GLfloat light1_diffuse= 0.0f, 0.0f, 5.0f, 1.0f ;GLfloat light1_position = 0.0f, 30.0f, -250.0f, 1.0f ; GLfloat light2_diffuse= 5.0f, 0.0f, .0f, 1.0f ;GLfloat light2_position = 0.0f, 30.0f, -250.0f, 1.0f ;GLfloat spot_direction=

14、1.0f, 1.0f, -1.0f;glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS,mat_shininess);glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);glLightfv(GL_LIGHT0, GL_POSITION,lig

15、ht0_position);glLightfv(GL_LIGHT1,GL_DIFFUSE,light1_diffuse);glLightfv(GL_LIGHT1,GL_POSITION,light1_position);glLightfv(GL_LIGHT2,GL_DIFFUSE,light2_diffuse);glLightfv(GL_LIGHT2,GL_POSITION,light2_position);glEnable(GL_DEPTH_TEST);void ChangeSize(int w, int h)if(h = 0)h = 1; glViewport(0, 0, w, h); /

16、 设置视区尺寸glMatrixMode(GL_PROJECTION); / 指定当前操作投影矩阵堆栈glLoadIdentity(); / 重置投影矩阵GLfloat fAspect;fAspect = (float)w/(float)h; / 计算视区的宽高比gluPerspective(45.0, fAspect, 1.0, 500.0); / 指定透视投影的观察空间glMatrixMode(GL_MODELVIEW);glLoadIdentity();void Display(void)static float fElect1 = 0.0f; / 绕核旋转的角度static float

17、fElect2 = 0.0f;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /清除颜色和深度缓冲区glMatrixMode(GL_MODELVIEW); / 指定当前操作模型视图矩阵堆栈glLoadIdentity(); / 重置模型视图矩阵glTranslatef(0.0f, 0.0f, -250.0f); /将图形沿z轴负向移动 /绘制太阳 glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDisable(GL_LIGHT1); glDisable(GL_LIGHT2);glColor3f(

18、1.0f, 0.0f, 0.0f);glutSolidSphere(20.0f, 30, 30); glDisable(GL_LIGHT0); glEnable(GL_LIGHT1); /绘制地球glColor3f(0.0f, 0.0f, 0.0f);glPushMatrix(); / 保存当前的模型视图矩阵glRotatef(fElect1, 0.0f, 1.0f, 0.0f); / 绕y轴旋转一定的角度glTranslatef(90.0f, 0.0f, 0.0f); / 平移一段距离glutSolidSphere(8.0f, 15, 15); / 画出第一个电子 glDisable(GL_LIGHT1); glEnable(GL_LIGHT2); /绘制月亮glRotatef(45.0f, 0.0f, 0.0f, 1.0f); /绕z轴旋转45°glRotatef(fElect2, 0.0f, 1.0f,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论