OPENGL动画
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学实验报告
OpenGL 图形显示综合作业
一、实验目的与要求:
1.OpenGL在MFC环境下运行和图形显示;
2.建立基本的几何模型
3.光源和材料颜色设定,显示出光照效果。
4.作业要包含一个简单的动画。
二、实验原理
1、本次作业建立的几何模型描述如下:首先绘制一张桌子,然后在桌面上绘制一个小球和一个箱子,小球在平面的右端,箱子在平面的中心位置。
2、动画设计如下:用小球来撞击箱子,通过多次撞击把箱子撞到桌面下方。
3、作业中用到了图形学的知识,比如创建纹理,灯光和材料的设置,视点的设置等。
三、算法设计
1、参数说明:
dz:球心的z坐标
deltaZ:球走过的路程
ball_v:球的速度
deltaZ_Box:箱子z坐标
box_v:箱子的速度
box_v_drop:箱子下落速度
deltaZ_Box_Drop:箱子下落距离
2、函数说明:
void MyLight()//灯光设置
void DrawSphere() //绘制球
void DrawBox() //绘制箱子
void Display() //显示图形
void IdleFunction() //发生碰撞后箱子和球的运动
四、关键程序代码
1、void Display()
{
MyLight();
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(12,15,4,0,0,0,0,1,0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texture[0]);
glBegin(GL_QUADS);
glColor3f(0,1.0,1.0);
glTexCoord2f(0.0f,1.0f);glVertex3f(-6.0f,0.0f,-6.0f);
glTexCoord2f(0.0f,0.0f);glVertex3f(-6.0f,0.0f,6.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(6.0f,0.0f,6.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 6.0f, 0.0f,-6.0f); glEnd();
glPushMatrix();
glTranslatef(0,-1,0);
auxSolidCylinder(1 ,20);
glPopMatrix();
glFlush();
DrawSphere();
DrawBox();
SwapBuffers(m_pDC->GetSafeHdc()); }
2、void MyLight()
{
//灯光
GLfloat ambient[]={0.4f, 0.4f, 0.4f, 0.4f};
GLfloat diffuse[]={1.0f, 1.0f, 1.0f, 1.0f };
GLfloat position[]={6,8,10,0};
glLightfv(GL_LIGHT0,GL_AMBIENT,ambient); //指定环境RGBA强度的光
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse); //指定光的漫射RGBA强度
glLightfv(GL_LIGHT0,GL_POSITION,position); //光源位置
glEnable(GL_LIGHTING); //启用灯源
glEnable(GL_LIGHT0); //启用0号灯
glEnable(GL_DEPTH_TEST); //启用深度测试。根据坐标的远近自动隐藏被遮住的图形
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
glDepthFunc(GL_LESS);
}
3、void IdleFunction()
{
dz+=ball_v;
deltaZ=dz-BALL_START; //球走过的路程
degree=deltaZ*360/(RADIUM*2*PI);
//发生碰撞
if (dz+RADIUM>deltaZ_Box-EDGE/(GLfloat)2)
{
box_v=BOX_V;
ball_v=BALL_V_NEW;
bCrash=true;
}
if (box_v!=0)
{
deltaZ_Box+=box_v; //箱子z坐标
box_v-=BOX_V_DELTA; //箱子速度
if (box_v<=0)
{
box_v=0;
}
}
if (true==bCrash)
{
ball_v+=BALL_V_DELTA;
if (ball_v>=0)
{
ball_v=0;
}
}
//下落
if (deltaZ_Box>=6)
{
bDrop=true;
}
if (true==bCrash&&box_v==0&&false==bDrop) {
bCrash=false;
bDrop=false;
bStart=false;
deltaZ=BALL_START;
ball_v=BALL_V;
}
}
4、void DrawSphere()