华科图形学上机实验报告.docx
- 文档编号:4173940
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:11
- 大小:78.86KB
华科图形学上机实验报告.docx
《华科图形学上机实验报告.docx》由会员分享,可在线阅读,更多相关《华科图形学上机实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
华科图形学上机实验报告
计算机图形学上机实验报告
计算机科学与技术学院
班级:
CS1209
学号:
指导教师:
何云峰
完成日期:
2014.12.2
实验一Kock雪花曲线的生成
1.1实验目的与要求
实验目的:
1)掌握用迭代算法实现Kock雪花曲线的方法。
2)熟悉opengl语法的使用。
3)理解窗口到视区的变化。
实验要求:
利用opengl实现六次迭代后的Kock雪花曲线。
1.2实验内容
Kock雪花曲线的生成元是一个等边三角形,生成规则是将三角形三条边分别等分为三等分,首尾俩段保持不变,中间用俩段等长且互成60度角的直线段代替,这样每一条边被分成四段,可以求出新的4段直线段的5个端点坐标。
迭代次数n=6次,构造迭代函数,将新的直线段按上述规则再分,每次迭代后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
#include
#include
#include
intn=6;//n迭代次数
intKock(floatax,floatay,floatbx,floatby,intn)
{
floatx1,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_STRIP);
glVertex2f(ax,ay);
glVertex2f(bx,by);
glEnd();
}
elseif(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();
}
return0;
}
voidInitial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色
glMatrixMode(GL_PROJECTION);//指定设置投影参数
gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数
}
voidChangeSize(GLsizeiw,GLsizeih)
{
if(h==0)h=1;
glViewport(0,0,w,h);//设置视区尺寸
//重置坐标系统
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//建立修剪空间的范围
if(w<=h)
glOrtho(0.0f,300.0f,0.0f,300.0f*h/w,1.0,-1.0);
else
glOrtho(0.0f,300.0f*w/h,0.0f,300.0f,1.0,-1.0);
}
voidDisplay(void)
{
floatax=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,cy,n);
Kock(cx,cy,ax,ay,n);
glFlush();
}
voidSpecialKeys(intkey,intx,inty)//键盘控制函数
{
if((key==GLUT_KEY_LEFT||key==GLUT_KEY_DOWN)&&n>0)
{
n--;
printf("n=%d\n",n);
glutPostRedisplay();
}
elseif((key==GLUT_KEY_RIGHT||key==GLUT_KEY_UP)&&n<6)
{
n++;
printf("n=%d\n",n);
glutPostRedisplay();
}
else
printf("Warning!
0≤n≤6\n");
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);//初始化,对命令行参数进行处理
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//设定窗口的显示模式(包括缓存和显示模式)
glutInitWindowSize(400,300);//指定窗口的大小
glutInitWindowPosition(100,100);//指定窗口的位置
glutCreateWindow("Kock曲线—正三角形");//创建一个窗口
printf("n=6\n");
glutDisplayFunc(Display);//设置当前窗口的显示回调函数
glutReshapeFunc(ChangeSize);//设置窗口再整形回调函数
glutSpecialFunc(SpecialKeys);//键盘方向键响应回调函数
Initial();//完成窗口初始化
glutMainLoop();//启动主GLUT事件处理循环
return0;
}
实验二日地月运动模型
2.1实验目的与要求
实验目的:
1)理解opengl中的变换方法和光照模型;
2)掌握产生阴影的方法;
3)了解深度测试,学会调整观察的位置和方向。
实验要求:
实现太阳,地球和月亮的运动模型,并加上相应的光照模型。
2.2实验内容
对老师给出的原子核模型例子做出修改,就可以得到类似于题目要求的模型。
在所给代码上减少一个球,并且调整相应的球体大小和旋转步长,就得到了太阳,地球和月亮的运动模型。
然后就需要加入光照,考虑建立三个漫反射光源,分别作用于太阳,地球和月亮,在画太阳前打开光源light0,关闭另外俩个光源,注意调整光源位置,得到太阳的球体模型。
然后打开光源light1,关闭light0,画地球;再打开光源light2,关闭light1,画出月亮的模型。
这样就能产生日地月模型的立体效果了。
2.3实验结果
1)地球与月亮在太阳的左侧时,如图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
#include
voidInitial()
{
glEnable(GL_DEPTH_TEST);//启用深度测试
glClearColor(1.0f,1.0f,1.0f,1.0f);//背景为白色
GLfloatmat_ambient[]={0.2f,0.2f,0.2f,1.0f};
GLfloatmat_diffuse[]={0.8f,0.8f,0.8f,1.0f};
GLfloatmat_specular[]={1.0f,1.0f,1.0f,1.0f};
GLfloatmat_shininess[]={50.0f};
//定义3个漫反射光源
GLfloatlight0_diffuse[]={1.8f,1.8f,0.0f,1.0f};
GLfloatlight0_position[]={1.0f,1.0f,1.0f,0.0f};
GLfloatlight1_diffuse[]={0.0f,0.0f,5.0f,1.0f};
GLfloatlight1_position[]={0.0f,30.0f,-250.0f,1.0f};
GLfloatlight2_diffuse[]={5.0f,0.0f,.0f,1.0f};
GLfloatlight2_position[]={0.0f,30.0f,-250.0f,1.0f};
GLfloatspot_direction[]={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,light0_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);
}
voidChangeSize(intw,inth)
{
if(h==0)h=1;
glViewport(0,0,w,h);//设置视区尺寸
glMatrixMode(GL_PROJECTION);//指定当前操作投影矩阵堆栈
glLoadIdentity();//重置投影矩阵
GLfloatfAspect;
fAspect=(float)w/(float)h;//计算视区的宽高比
gluPerspective(45.0,fAspect,1.0,500.0);//指定透视投影的观察空间
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
voidDisplay(void)
{
staticfloatfElect1=0.0f;//绕核旋转的角度
staticfloatfElect2=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(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,0.0f);
glTranslatef(-15.0f,0.0f,0.0f);
glutSolidSphere(3.0f,15,15);//画出第二个电子
glPopMatrix();//恢复模型视图矩阵
fElect1+=5.0f;//增加旋转步长,产生动画效果
if(fElect1>360.0f)fElect1=5.0f;
fElect2+=15.0f;
if(fElect1>360.0f)fElect2=15.0f;
glutSwapBuffers();
}
voidTimerFunc(intvalue)
{
glutPostRedisplay();
glutTimerFunc(100,TimerFunc,1);
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutCreateWindow("日地月模型");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(Display);
glutTimerFunc(500,TimerFunc,1);//指定时间回调函数
Initial();
glutMainLoop();
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形学 上机 实验 报告