opengl立方体简单三维交互式几何变换实验报告材料+代码

时间:2020-10-14 08:50:21 手机站 来源:网友投稿

立方体的简单三维交互式几何变换

这个学期对 opengl 的学习,使我对计算机图形学的一些算法过程 有了更多的了解。

 因为对三维图形的显示比较感兴趣, 就做了立方体 的简单三维交互式几何变换。

功能:键盘的方向键实现立方体的上下左右平移; A键,S键分别实 现向前,向后旋转;J键,K键分别实现放大,缩小;C键退出。

 程序模块 :

1. 该模块为绘制一个立方体。

 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);

//

四边形的右上

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);

// 四边形的右上

// 底面

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); //

四边形的左下

glVertex3f(-1.0f, -1.0f, 1.0f);

// 四边形的右下

glVertex3f(-1.0f, 1.0f, 1.0f);

// 四边形的右上

glVertex3f(-1.0f, 1.0f, -1.0f);

// 四边形的左上

glEnd();

}

2.该模块设置屏幕颜色和深度缓存,设置立方体的平移,缩放,旋 转变换。

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 轴的旋转变换

glRotatef(ratY, 0.0f, 1.0f, 0.0f);// 绕 Y 轴的旋转变换

glRotatef(ratZ, O.Of, O.Of, 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); //启动深度测试模式

}

该模块为设置键盘的交互式操作。

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){ 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); //指定键盘回调函数

glutSpecialFunc(myspecialKeyboard); //指定键盘回调函数

ini t();

glutMainLoop();〃进入无穷循环,等待事件处理

}

功能截图:

立方体的平移:

上平移

■立方荐的待单二雜处互式几何喪鞍

下平移:

左平移:

右平移:

放大:

缩小:

■立再体的简車三维交互式几何交换

旋转:

源程序:

#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);

//前面

// 四边形的左下

// 四边形的左下

// 四边形的右下

// 四边形的右上

// 四边形的左上

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,0);

glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右下

// 四边形的左上

// 四边形的左上

// 四边形的左下

// 四边形的左上

// 四边形的左下

// 四边形的右下

// 四边形的右上

1.0f, -1.0f);

1.0f, 1.0f);

1.0f, 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, glVertex3f(-1.0f, glVertex3f( 1.0f, glVertex3f( 1.0f,

// 底面

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); // 四边形的左下

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, O.Of, 0.0f);〃绕 X 轴的旋转变换

glRotatef(ratY, O.Of, 1.0f, 0.0f);〃绕 Y 轴的旋转变换

glRotatef(ratZ, O.Of, O.Of, 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); // 启动深度测试模式

}

}

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){

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); // 指定键盘回调函数 glutSpecialFunc(myspecialKeyboard); //指定键盘回调函数 init();

glutMainLoop();// 进入无穷循环,等待事件处理

}

推荐访问:实验报告 立方体 几何 变换 opengl立方体简单三维交互式几何变换实验报告材料+代码

版权声明 :以上文章中选用的图片文字均来源于网络或用户投稿 ,如果有侵权请立即联系我们 , 我们立即删除 。