OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学实验报告
1、实验目的和要求
利用第七章所学的知识,试在OpenGL中创建一个球体动画,使球体在窗口内做自
由落体运动,并在撞击地面后能够反弹回来。

并用相应的代码表示出来。

2、实验内容
利用glutSolidSphere函数等其它函数,在OpenGL中创建一个球体动画,使球体在
窗口内做自由落体运动,并在撞击地面后能够反弹回来
3、实验步骤
1)相关算法及原理描述
我们所使用的glut实用工具中,正好就有一个绘制球体的现成函数: glutSolidSphere,这个函数在“原点”绘制出一个球体。

由于坐标是可以通过glTranslate*和glRotate*两个函数进行随意变换的,所以我们就可以在任意位置绘制球体了。

2)运行结果如下图,程序调试成功,并且能正常显示
4、实验总结
通过本次试验,进一步认识,感觉OpenGL的功能很强大,各种各样的物理模拟实验他都不在话下!!不得不说,这软件很好很强大!!由于自己不太擅长编程, 所以有些功能还不能完全实现,但我会尽自己最大努力来克服自己的编程不足之处,多加练习。

5、附录
带注释的源程序
#include "glut.h"
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<math.h>
#define PI 3.1415926
double move=20.0;
int i=0;
int down=1;
int count=1;
double timeSpan=0; // 下降到底所需时间
double movey=0.0;
double duration=0.0; //持续时间
double length=0.0;
clock_t start,end;
void init(void)
{
GLfloat mat_specular[]={220.220,220.0,220.0,220.0};
GLfloat mat_shininess[]={100.0};
GLfloat light_position[]={0.0, 0.0, 0.0, -2.0}; //r-l u-d f-b
GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat diffuseLight[] = { 0.6f, 0.6f, 0.6f, 1.0f };
GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f};
glClearColor(0.2,0.2,1.5,2.0); //bgc glColor3ub(100, 100, 215);
glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);
glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST);
void reshape(int w,int h)
{ glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-12,12,-12*(GLfloat)(h)/(GLfloat)(w),12*(GLfloat)(h)/(GLfloat)(w), -1.0,1.0); }
else
glOrtho(-12*(GLfloat)(w)/(GLfloat)(h),12*(GLfloat)(w)/(GLfloat)(h),-12,12,-1.0,1.0) J
glMatrixMode(GL_MODELVIEW); glLoadIdentity();
}
void initDisplay(void)
{
down=1; //向下运动
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0,20.0,0.0);
glutSolidSphere(0.4,40,50); glutSwapBuffers();
}
void display(void)
{ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity();
glTranslatef(0,move,0.0); glutSolidSphere(0.4,40,50);
glutSwapBuffers();
}
void MoveSphereUp()
{
end=clock();
duration = (double)(end - start-16.0) /CLOCKS_PER_SEC;
length=5*(timeSpan-duration)*(timeSpan-duration); move=20-length;
if(move>19.932) {
move=20;
down=1;
printf("%i",down);
start=clock();
}
display();
glLoadIdentity();
}
void MoveSphereDown()
{
if(count==1){
start=clock();
count=0;
}
end=clock();
duration = (double)(end - start) /CLOCKS_PER_SEC;
length=5*duration*duration;
move=20-length;
if(move<-20) {
timeSpan=duration; //记下下降所经历的时间move=-20;
start=clock();
down=0; //向上运动
}
display();
glLoadIdentity();
}
void TimerFunc2(int value){
if(i==0){ //left
GLfloat light_position[]={2.0,0.0,0.0,0.0}; //r-l u-d f-b
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
}
if(i==1){ //left-up
GLfloat light_position[]={2.0,2.0,0.0,0.0}; //r-l u-d f-b
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
}
if(i==2){ //up
GLfloat light_position[]={0.0,2.0,0.0,0.0}; //r-l u-d f-b
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
}
if(i==3){ //up-right
GLfloat light_position[]={-2.0,2.0,0.0,0.0}; //r-l u-d f-b
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
}
if(i==4){ //right
GLfloat light_position[]={-2.0,0.0,0.0,0.0}; //r-l u-d f-b
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
}
if(i==5){ //right-down
GLfloat light_position[]={-2.0,-2.0,0.0,0.0}; //r-l u-d f-b
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
}
if(i==6){ //down
GLfloat light_position[]={0.0,-2.0,0.0,0.0}; //r-l u-d f-b
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
}
if(i==7){ //down-left
GLfloat light_position[]={2.0,-2.0,0.0,0.0}; //r-l u-d f-b
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
}
i=(++i)%8; //控制小球旋转的
glutTimerFunc(60,TimerFunc2,1);
}
void TimerFunc1(int value){
if(down==1){
MoveSphereDown();
}
if(down==0){
MoveSphereUp();
}
glutTimerFunc(10,TimerFunc1,0);
}
int main(int argc,char **argv)
{
glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(400,740); glutInitWindowPosition(300,20);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(initDisplay);
glutReshapeFunc(reshape);
glutTimerFunc(1400,TimerFunc1,0); //毫秒
glutTimerFunc(400,TimerFunc2,1); // 毫秒glutMainLoop();
return 0;
}。

相关文档
最新文档