计算机图形学论文.docx
《计算机图形学论文.docx》由会员分享,可在线阅读,更多相关《计算机图形学论文.docx(16页珍藏版)》请在冰豆网上搜索。
计算机图形学论文
课程设计(论文)
课程名称:
计算机图形学
题目:
小球三维碰撞
院(系):
理学院
专业班级:
应数0801
姓名:
学号:
指导教师:
2011年7月7日
摘要
本文以VC++6.0为平台,用OpenGL基础知识实现小球在三维场景中的碰撞以及三维现实场景模拟。
首先绘制一个小球,并定义小球材质等相关元素,显示出小球在光源照射下的效果。
另外通过碰撞反射等的计算实现小球从到静态画面的动态画面转换。
并通过场景的设置变化,实现三维场景的消隐,视角变换及人机交互等效果。
关键词:
OpenGLVC6.0三维空间小球碰撞
目录
三维空间碰撞小球仿真3
1.问题描述3
2.开发平台3
3.变量规则命名3
4.详细设计5
4.1三点所在法向量求解5
4.2小球碰撞处理7
4.3小球碰撞路径实现8
4.4背景设置伪天空代码10
4.5物体材质及光照设置12
5.课程设计结果12
5.1程序运行结果如下:
12
5.2需要改进的地方14
6.课程设计总结及心得体会14
7.参考文献16
1.问题描述
小球在三维场景中的碰撞以及三维现实场景模拟,是指通过运用计算机图形学所学知识在所建立的三维空间画面中,实现现实场景中小球从碰撞到反弹等一系列运动的模拟重现,首先绘制一个小球,并定义小球材质等相关元素,显示出小球在光源照射下的效果。
另外实现小球从到静态画面的动态画面转换。
并通过场景的设置变化,实现三维场景的消隐,视角变换及人机交互等效果。
同时通过OpenGL对三维场景的建模,熟悉并实现以下知识点的应用:
对场景图形有一定的几何变换充分利用投影、视点变换、消隐等、双缓冲等对物体的三维效果进行优化,使得其三维场景更加形象逼真。
2.开发平台
硬件
PC机,CPU2.0G,
内存256M以上
软件
Windows7操作系统、
编译软件及版本:
vc++6.0OpenGL环境
开发语言:
C++
3.变量命名规则
命名规则:
对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在函数的开始处。
见下:
GLfloatpos[]={-2,4,5,1},//光源的位置
amb[]={0.2,0.5,0.3,1.0};
GLfloatfront_amb_diff[]={0.7,0.5,0.1,1.0};
GLfloatback_amb_diff[]={0.4,0.7,0.1,1.0};
GLfloatspe[]={0.25,0.25,0.25,1.0};
GLfloattheta=0,dt=0.5,axes[3][3]={{1,0,0},{0,1,0},{0,0,1}};
floatskyPosition=(20,10);
GLfloatskyWidth=(600,600);
intaxis=0;
floatx=-0.5f;//x轴方向相对于初始位置的位移
floaty=-0.5f;//y轴方向相对于初始位置的位移
floatz=-0.5f;//z轴方向相对于初始位置的位移
floatstartPostion_x=0;//初始位置x轴坐标
floatstartPostion_y=0;//初始位置y轴坐标
floatstartPostion_z=0;//初始位置z轴坐标
floatmax_x=0.5f;//球沿x轴所能上升的最大值(从初始位置计算)
floatmax_y=0.5f;
floatmax_z=0.5f;
floatmin_x=-0.5f;//球沿x轴所能下降的最大值(从初始位置计算)
floatmin_y=-0.5f;
floatmin_z=-0.5f;
floatnv_x;
floatnv_y;
floatnv_z;
floatnum;//记录下降或者上升的时间
floatradious=0.1f;//设置圆的半径
floatvx=0.3f;//x轴方向速度
floatvy=-0.2f;//y轴方向速度
floatvz=0.2f;//z轴方向的速度
floatdistance=0.4f;//记录小球某时某刻距离斜面的位置
4.详细设计:
4.1根据已知的三点(不共线)求这三点所在面得法向量
4.2下面的要进行碰撞获得处理:
碰撞后速度的情况
经分析:
在不考虑能量损失的情况下,可列出以下三个方程:
1。
碰撞后合速度方向与法向量的夹角和碰撞前法向量与碰撞前合速度的大小夹角互补
2.碰撞后的速度(vx1,vy1,vz1)与碰撞前速度(vx,vy,vz)组成的向量(vx1-vx,vy1-vy,vz1-vz)与法向量平行,则如果碰撞前的法向量与碰撞后的法向量相加,则相加的结果与法向量垂直//此条件与条件1重复
3.(vx1,vy1,vz1)与(vx,vy,vz)的的差所得的向量与法向量平行
补充:
4.碰撞前与碰撞后的和速度大小相等
由此三个方程(1,3,4)即可求出碰撞后的速度
于是:
有方程组
1.(vx,vy,vz)*(nv_x,nv_y,nv_z)/sqrt(vx*vx+vy*vy+vz*vz)*sqrt(nv_x*nv_x+nv_y*nv_y+nv_z*nv_z)+(vx1,vy1,vz1)*(nv_x,nv_y,nv_z)/sqrt(vx1*vx1+vy1*vy1+vz1*vz1)*sqrt(nv_x*nv_x+nv_y*nv_y+nv_z*nv_z)=0
2.(vx-vx1,vy-vy1,vz-vz1)(nv_x,nv_y,nv_z)=0//次方程需根据条件3列出
3.vx*vx+vy*vy+vz*vz=vx1*vx1+vy1*vy1+vz1*vz1//此式根据补充的条件4列出
更改
由于上述方法所得出的三个方程中1与2等价,找第三个方程比较困难,所以换一种做法——利用数学中的向量知识求反射速度向量:
设入射向量Vin(vx,vy,vz)与反射向量Vout(vx1,vy1,vz1),法向量F(nv_x,nv_y,nv_z)
则入射向量在法向量上的投影向量S(x,y,z)=(Vin*F/sqrt(nv_x*nv_x+nv_y*nv_y+nv_z*nv_z))*F
则最终我们要求的反射向量Vout=Vin-2S
下面进行计算:
S=(Vin*F/1)*F//
S(x,y,z)=(vx,vy,vz)(nv_x,nv_y,nv_z)(nv_x,nv_y,nv_z)
=(vx*nv_x+vy*nv_y+vz*nv_z)(nv_x,nv_y,nv_z)
=k*(nv_x,nv_y,nv_z)//k=vx*nv_x+vy*nv_y+vz*nv_z
Vout(vx1,vy1,vz1)=(vx-2*k*nv_x,vy-2*k*nv_y,vz-2*k*nv_z)
这样即可求出碰撞后的速度
4.3.具体路径代码实现
voididle(void)
{
if(theta>=360)axis=(axis+1)%4;
theta=(theta<360)?
theta+dt:
dt;
num+=0.1f;
x=vx*num+startPostion_x;
z=vz*num+startPostion_z;
y=vy*num+startPostion_y;//+0.5f*a*num*num;
Sleep(100);
glutPostRedisplay();
if(y{
startPostion_x=x;
startPostion_z=z;
startPostion_y=min_y+radious;
vy=-vy;
num=0.0f;
}
if(y>max_y-radious)
{
startPostion_x=x;
startPostion_z=z;
startPostion_y=max_y-radious;
vy=-vy;
num=0.0f;
}
if(x>max_x-radious)
{
startPostion_x=max_x-radious;
startPostion_y=y;
startPostion_z=z;
vx=0.0f-vx;
vy=vy;
num=0.0f;
}
if(x{
startPostion_x=min_x+radious;
startPostion_y=y;
startPostion_z=z;
vx=0.0f-vx;//*dic;//x的速度变为反向
vy=vy;//+a*num;//y的初速度改变,初始位置也改变
num=0.0f;
}
if(z{
startPostion_z=min_z+radious;
startPostion_x=x;
startPostion_y=y;
vy=vy;//+a*num;//y的初速度改变,初始位置也改变
vz=0.0f-vz;//*dic;
num=0.0f;
}
if(z>max_z-radious)
{
startPostion_z=max_z-radious;
startPostion_x=x;
startPostion_y=y;
vy=vy;//y的初速度改变,初始位置也改变
vz=0.0f-vz;
num=0.0f;
}
}
4.4.绘制立方体
glPushMatrix();
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,front_amb_diff1);
glTranslatef(0,0,-10);
glFrontFace(GL_CW);
glBegin(GL_POLYGON);
glVertex3f(0.5,0.5,-0.501);
glVertex3f(-0.5,0.5,-0.501);
glVertex3f(-0.5,-0.5,-0.501);
glVertex3f(0.5,-0.5,-0.501);
glEnd();
glFrontFace(GL_CCW);
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,-10);
glBegin(GL_POLYGON);
glVertex3f(0.5,-0.501,0.5);
glVertex3f(-0.5,-0.501,0.5);
glVertex3f(-0.5,-0.501,-0.5);
glVertex3f(0.5,-0.501,-0.5);
glEnd();
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,-10);
glFrontFace(GL_CW);
glBegin(GL_POLYGON);
glVertex3f(-0.501,0.5,0.5);
glVertex3f(-0.501,-0.5,0.5);
glVertex3f(-0.501,-0.5,-0.5);
glVertex3f(-0.501,0.5,-0.5);
glEnd();
glFrontFace(GL_CCW);
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,-10);
glBegin(GL_POLYGON);
glVertex3f(0.501,0.5,0.5);
glVertex3f(0.501,-0.5,0.5);
glVertex3f(0.501,-0.5,-0.5);
glVertex3f(0.501,0.5,-0.5);
glEnd();
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,-10);
glFrontFace(GL_CW);
glBegin(GL_POLYGON);
glVertex3f(0.5,0.501,0.5);
glVertex3f(-0.5,0.501,0.5);
glVertex3f(-0.5,0.501,-0.5);
glVertex3f(0.5,0.501,-0.5);
glEnd();
glPopMatrix();
glFrontFace(GL_CCW);
glPushMatrix();
glTranslatef(0,0,-10);
glTranslatef(x,y,z);//平移
glutSolidSphere(0.1,20,30);
glPopMatrix();
glPushMatrix();
glTranslated(0,0,-10);
glutWireCube(1.0);//画一个立方体
glPopMatrix();
4.5.视角的变换
voidspecialKey(intkey,intx,inty)
{
if(key==GLUT_KEY_UP)
{Z=Z-0.5;}
if(key==GLUT_KEY_DOWN)
{Z=Z+0.5;}
if(key==GLUT_KEY_LEFT)
{X=X+0.1;}
if(key==GLUT_KEY_RIGHT)
{X=X+0.1;}
}
4.6.场景物体材质及光照等设置显示
voidMaterial(void)
{
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,front_amb_diff);
glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,back_amb_diff);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,spe);
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,75);
}
voidLight(void)
{
glLightfv(GL_LIGHT0,GL_AMBIENT,amb);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
glPushMatrix();
glTranslated(0,0,-5);
glLightfv(GL_LIGHT0,GL_POSITION,pos);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glPopMatrix();
}
5.程序运行结果及分析:
5.1.运行结果展示如下:
图一
图二
图三
5.2.程序需改进处:
首先可以看到,图中很好的体现了三维立体效果,同时对于光照、消隐等均有良好体现,但还存在以下问题:
场景设置简单,虽然现有的场景已经很好体现了课题所涉
及知识点的运用,但从整体效果来看,场面不够丰富,物体置太过简洁,略显单调,如果再键入更多物体则可能会显现出更好的模拟效果,比如背景的设置,地面处理等。
6.心得体会
三周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。
在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。
更加懂得OpenGL设计不仅仅需要逻辑思维地紧密,更加需要细心,,我掌握的OpenGL还十分有限,有待在以后的实验室的工作中进一步的学习;其次,我的编程能力和使用VC的能力进一步得到提高;总的来说,虽然有很多不足之处,但通过此次课程设计收获还是挺大的。
7.参考文献
[1]项志刚编著.计算机图形学.北京:
清华大学出版社,2008,7
[2]程思源,张群瞻编著.计算机图形学.北京:
冶金工业出版社,2003,
[3]徐鹏文编著.计算机图形学.北京.机械工业出版社,2007
[4]徐明亮,卢红星,王琬编著.OpenGL游戏编程.北京:
机械工业出版社,2008,1