计算机图形学课程设计_第1页
计算机图形学课程设计_第2页
计算机图形学课程设计_第3页
计算机图形学课程设计_第4页
计算机图形学课程设计_第5页
已阅读5页,还剩12页未读, 继续免费阅读

下载本文档

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

文档简介

1、皮球运动动画一、 设计方案圆皮球从某竖直高度以横向速度抛出,落地,弹起,最终静止。设弹起后所能上升的高度为上一次最大高度的4/5,实现运动轨迹动画。 整个设计包括两个方面,一是掌握动画的基本原理,二是圆的绘制。动画是将静止的画面变为动态的艺术。实现由静止到动态,主要是靠人眼的视觉残留效应。利用人的这种视觉生理特性可制作出具有高度想象力和表现力的动画影片。 动画中的皮球要用到中点画圆算法画圆, void MidCircle(int x0, int y0, int r)定义圆心的坐标和圆半径,用mLight.Ir, mLight.Ig, mLight.Ib来定义圆的颜色,glClearColor定

2、义显示框的背景颜色,int cx=100,cy=300,cr=20定义圆开始运动时的水平位置,垂直高度和体积大小,glClearColor定义显示框的背景颜色,int windowswidth = 1000,windowshight = 500定义显示框的宽度和高度。 void Init()用来初始化,void myDisplay()用来显示,glLoadIdentity()为加载身份,void RenderScene(void)为渲染现场,void TimerFunction(int value)为计时器功能。二、 程序流程图floatmo;returnmColor;mColor.Ir=Ka

3、Ia+mLight.Ir*Kd*theta+mLight.Ir*Ks*pow(alpha,n);alpha<0alpha=H.fx*N.fx+H.fy*N.fy+H.fx*N.fz;theta<0VectorN;d+=deltax;NOglVertex2i(x+x0,y+y0);d<0glEnd();x<yintx,y,deltax,deltay,d;mColor=Phong(x0,y0,r,i+x0,x+y0);WHILEmColor=Phong(x0,y0,r,i+x0,y+y0);i+i<=yi=-yi+i<=xi=-xintx,y,deltax,de

4、ltay,d;glClear(GL_COLOR_BUFFER_BIT);glViewport(0,0,(GLsizei)w,(GLsizei)h);glClear(GL_COLOR_BUFFER_BIT);flag=1;YESt=sqrt(2*h/g);Multiflag=1cy-cr>0&&cx+cr<windowswidth&&up=0h>1floatt=0,vv,s,hv;return0;glutInit(&argc,argv);三、程序清单#include <GL/glut.h>#include <stdio.

5、h>#include <stdlib.h>#include <math.h>#define NO_LIGHT 1#define LIGHT 2bool bLight = false;struct Vectorfloat fx, fy, fz;struct Colorfloat Ir, Ig, Ib;/*定义皮球的颜色*/;float KaIa;float Kd, n;Vector H,light;Color mLight, mColor;int cx=100,cy=300,cr=20;/*定义皮球开始运动时的水平位置,下落高度和体积大小*/int windowsw

6、idth = 1000,windowshight = 500;/*定义显示框的宽度和高度*/int xstep=0,ystep=0,flag=10,up=0;float vh =4,g=9.8,h=cy;void Init()float mo;Vector eye;mLight.Ir = 200;mLight.Ig =20;mLight.Ib =200;/*定义皮球的颜色*/KaIa=100;Kd = 0.7;n = 20;light.fx=0.10;light.fy=0.50;light.fz = sqrt(1-(light.fx*light.fx)-(light.fy*light.fy);

7、eye.fx=1;eye.fy=0;eye.fz=1;H.fx=light.fx+eye.fx;H.fy=light.fy+eye.fy;H.fz=light.fz+eye.fz;mo=sqrt(H.fx*H.fx+H.fy*H.fy+H.fz*H.fz);H.fx=(H.fx/mo);H.fy=(H.fy/mo);H.fz=(H.fz/mo);H.fx=(H.fx/mo);H.fy=(H.fy/mo);H.fz=(H.fz/mo);glClearColor(1.0, 1.0, 1.0, 0.0);glShadeModel(GL_SMOOTH);Color Phong(int x0, int

8、y0, int r, int x, int y)Vector N;float z,alpha,theta,Ks;Ks=1.0-Kd;z=sqrt(float)(r*r-(x-x0)*(x-x0)-(y-y0)*(y-y0);N.fx=(x-x0)*1.0/r;N.fy=(y-y0)*1.0/r;N.fz = z*1.0/r;theta = N.fx * light.fx + N.fy * light.fy + N.fz * light.fz;if(theta<0)theta=0;alpha=H.fx*N.fx+H.fy*N.fy+H.fx*N.fz;if(alpha<0)alpha

9、=0;mColor.Ir=KaIa+mLight.Ir*Kd*theta+mLight.Ir*Ks*pow(alpha,n);mColor.Ig=KaIa+mLight.Ig*Kd*theta+mLight.Ig*Ks*pow(alpha,n);mColor.Ib=KaIa+mLight.Ib*Kd*theta+mLight.Ib*Ks*pow(alpha,n);return mColor;void MidCircle(int x0, int y0, int r) /*中点画圆算法定义圆的圆心坐标和半径*/int x,y,deltax,deltay,d;x = 0;y = r;deltax =

10、 5;deltay = 5-r-r;d = 1-r;glColor3f (1.0f, 1.0f, 1.0f); glBegin(GL_POINTS);glVertex2i (x+x0,y+y0);glVertex2i (-x+x0,y+y0);glVertex2i (-x+x0,-y+y0);glVertex2i (x+x0,-y+y0);glVertex2i (y+y0, x+x0);glVertex2i (y+y0, -x+x0);glVertex2i (-y+y0, -x+x0);glVertex2i (-y+y0, x+x0);while(x<y)if(d<0)d += d

11、eltax;deltax += 2;deltay += 2;x+;elsed += deltay;deltax += 2;deltay += 4;x+;y-;glVertex2i (x+x0,y+y0);glVertex2i (-x+x0,y+y0);glVertex2i (-x+x0,-y+y0);glVertex2i (x+x0,-y+y0);glVertex2i (y+y0, x+x0);glVertex2i (y+y0, -x+x0);glVertex2i (-y+y0, -x+x0);glVertex2i (-y+y0, x+x0);glEnd();void MidCircleLig

12、ht(int x0, int y0, int r)int x,y,deltax,deltay,d;x = 0;y = r;deltax = 3;deltay = 5-r-r;d = 1-r;int i=0; glBegin(GL_POINTS);for( i=-x;i<=x;i+)mColor=Phong(x0,y0,r,i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i

13、(i+x0,-y+y0);for(i=-y;i<=y;i+)mColor=Phong(x0,y0,r,i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-x+y0);while(x<y)if(d<0)d += deltax;deltax += 2;deltay += 2;x+;elsed += deltay;deltax += 2;deltay

14、 += 4;x+;y-;for(i=-x;i<=x;i+)mColor=Phong(x0,y0,r,i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-y+y0);for(i=-y;i<=y;i+)mColor=Phong(x0,y0,r,i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);

15、 glVertex2i (i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-x+y0);glEnd();void myDisplay() /*用此函数来显示*/glClear(GL_COLOR_BUFFER_BIT);glColor3f (0.0f, 0.0f, 1.0f); MidCircleLight(cx, cy, cr);glFlush();void Reshape(int w, int h) /*加载身份*/glViewport(0, 0, (GLsizei) w, (GLsizei)

16、 h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);void RenderScene(void) /*渲染现场*/glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f, 0.0f, 0.0f);/*清空命令缓冲区并交换帧缓存*/glutSwapBuffers();void TimerFunction(int value) /*定义计时器功能*/*处理到达窗口边界的球形,使之反弹*/float t=0,vv,s,hv;i

17、f (h>1)if(cy-cr>0 && cx+cr<windowswidth && up = 0)t =sqrt(2*h/g);vv = g*t/5;/*hv = 0.5*g*g*t; s= vh*t;*/cx += vh;cy -= vv;else if(cy-cr<=0)flag = 1;up =1 ;if(flag = 1)h=4.0/5.0*h;flag = 0 ;printf("%d,%d,%d,%dn",up,flag,h,cy-cr);if(cy-cr<=h && up = 1)t

18、 = sqrt(2*h/g);vv = sqrt(2*g*h)/8;/*hv= vv*t - 0.5*g*t*t; s = vh *t;*/cy +=vv;cx +=vh;else if(cy-cr>=h)up = 0 ;/*用新坐标重新绘图*/ glutPostRedisplay();glutDisplayFunc(myDisplay);glutTimerFunc(33,TimerFunction, 1);int main(int argc, char *argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(windowswidth,windowshight );glutCreateWindow("Ball bouncing");Init();glutDisplayFunc(RenderScene);glutTimerFunc(33, TimerFunction, 1);glutReshapeFunc(Reshape);glut

温馨提示

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

评论

0/150

提交评论