实验报告
实验名称指导教师
实验类型综合实验学时 2 实验时间
一、实验目的和要求
能够灵活的运用OpenGL图形API函数,基于C++程序语言,结合操作系统交互接口实现交互式3D动画。
基于实验1的基本内容,设计增加键盘及鼠标输入的互动,实现三维物体交互式运动效果。(物体的旋转或平移);
1.所有图形(例如球体,正方体)有清晰的轮廓,实现3D交互动画效果。
2.学会导入Vertex的其他属性,如normal,texture,实现纹理映射。
1
二、实验环境(实验设备)
硬件:微机
软件:vs2012
2
实验报告
3
三、实验过程描述与结果分析
实验代码:
#include<stdlib.h>
#include<GL/glut.h>
#include<windows.h>
float ratX = 60;
float ratY = 60;
float ratZ = 60;
float tx=0;
float ty=0;
float sf=0;
void DrawBox()
{
glBegin(GL_QUADS);
//前面
glColor3f(1,0,0);
glVertex3f(-1.0f, -1.0f, 1.0f);
// 四边形的左下
glVertex3f( 1.0f, -1.0f, 1.0f);
// 四边形的右下
glVertex3f( 1.0f, 1.0f, 1.0f);
// 四边形的右上
4
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上
// 后面
glColor3f(0,1,0);
glVertex3f(-1.0f, -1.0f, -1.0f);
// 四边形的右下
glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的右上
glVertex3f( 1.0f, 1.0f, -1.0f);
// 四边形的左上
glVertex3f( 1.0f, -1.0f, -1.0f);
// 四边形的左下// 顶面glColor3f(0,0,1);
glVertex3f(-1.0f, 1.0f, -1.0f);
// 四边形的左上
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下
glVertex3f( 1.0f, 1.0f, -1.0f);
// 四边形的右上
// 底面
5
glColor3f(1,1,0);
glVertex3f(-1.0f, -1.0f, -1.0f);
// 四边形的右上
glVertex3f( 1.0f, -1.0f, -1.0f);
// 四边形的左上
glVertex3f( 1.0f, -1.0f, 1.0f);
// 四边形的左下
glVertex3f(-1.0f, -1.0f, 1.0f);
// 四边形的右下
// 右面
glColor3f(0,1,1);
glVertex3f( 1.0f, -1.0f, -1.0f);
// 四边形的右下
glVertex3f( 1.0f, 1.0f, -1.0f);
// 四边形的右上
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上
glVertex3f( 1.0f, -1.0f, 1.0f);
// 四边形的左下
// 左面
glColor3f(1,0,1);
glVertex3f(-1.0f, -1.0f, -1.0f);
6
// 四边形的左下
glVertex3f(-1.0f, -1.0f, 1.0f);
// 四边形的右下
glVertex3f(-1.0f, 1.0f, 1.0f);
// 四边形的右上
glVertex3f(-1.0f, 1.0f, -1.0f);
// 四边形的左上
glEnd();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//清空颜色和深度缓存
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//gluLookAt(2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glTranslatef(0.0f+tx,0.0f+ty,-4.0f);
//平移变换
glScalef(1+sf,1+sf,1+sf);
//缩放变换
glRotatef(ratX, 1.0f, 0.0f, 0.0f);
//绕X轴的旋转变换
7
glRotatef(ratY, 0.0f, 1.0f, 0.0f);
//绕Y轴的旋转变换
glRotatef(ratZ, 0.0f, 0.0f, 1.0f);
//绕Z轴的旋转变换
DrawBox();
glFlush();
glutSwapBuffers();
}
void reshape(int w, int h) //重绘回调函数,在窗口首次创建或用户改变窗口尺寸时被调用
{
glViewport(0, 0, w, h);// 指定视口的位置和大小
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//glFrustum(-1.0, 1.0, -1.0, 1.0, 3.1, 10.0);
//gluPerspective(45,1,0.1,10.0);
glOrtho(-2.0, 2.0, -2.0, 2.0, 2.0, 10.0);
}
void init()
{
glClearColor (1.0, 1.0, 1.0, 1.0);
glEnable(GL_DEPTH_TEST);
8
//启动深度测试模式
}
void myKeyboard(unsigned char key, int x, int y) {
if(key == 'a' || key == 'A')
ratX += 2;
ratY += 2;
ratZ += 2;
if(key == 's' || key == 'S')
ratX -= 2;
ratY -= 2;
ratZ -= 2;
if(key == 'j' || key == 'J')
sf+=0.1;
if(key == 'k' || key == 'K')
sf-=0.1;
if(key == 'c' || key == 'C')
exit(0);
glutPostRedisplay(); //重新调用绘制函数
}
void myspecialKeyboard(int key,int x,int y)
{
9
if(key == GLUT_KEY_UP )
ty+=0.1;
if(key == GLUT_KEY_DOWN)
ty-=0.1;
if(key ==GLUT_KEY_LEFT)
tx-=0.1;
if(key==GLUT_KEY_RIGHT)
tx+=0.1;
glutPostRedisplay();
}
int main(int argc, char** argv)
{
glutInit(&argc,argv); // 初始GLUT.
glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|
GLUT_RGB); //设定显示模式
glutInitWindowSize(400,400); // 设定窗口大小
glutInitWindowPosition(50,100); // 设定窗口位置
glutCreateWindow("立方体的简单三维交互式几何变换"); // 用前面指定参数创建
glutReshapeFunc(reshape); //指定重绘回调函数
glutDisplayFunc(display); // 进行一些初始化工作
glutKeyboardFunc( myKeyboard); //指定键盘回调函数
10
glutSpecialFunc(myspecialKeyboard); //指定键盘回调函数init();
glutMainLoop();// 进入无穷循环,等待事件处理
}
实验结果图:
实验报告
11
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
通过此次实验灵活的运用OpenGL图形API函数,基于C++程序语言,结合操作系统交互接口实现了交互式3D动画。
基于实验1的基本内容,增加了键盘及鼠标输入的互动,实现了三维物体交互式运动效果。(物体的旋转或平移);
五、指导教师评语
成绩批阅人日期
12