OPENGL动画

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()

相关文档
最新文档