南邮计算机图形学实验报告(完整版)
- 格式:doc
- 大小:62.50 KB
- 文档页数:9
实验报告
实验名称指导教师
实验类型综合实验学时 2 实验时间
一、实验目的和要求
能够灵活的运用OpenGL图形API函数,基于C++程序语言,自行设计出各种各样的计算机图形方案并调整不同的透视模型。学会配置OpenGL 图形函数API,设计(1)在屏幕上显示基本3D图形;(2)设置图形的表面光照模型及投影变换模型。
1.所有图形(例如球体,正方体)有清晰的轮廓。
2.学会设置图形表面的光照色彩以及投影变换模型。
3.尽可能采用高效的算法,以降低时间复杂性和空间复杂性。
二、实验环境(实验设备)
硬件:微机
软件:vs2012
实验报告三、实验过程描述与结果分析
实验代码:
#include
// 绘制立方体
// 将立方体的八个顶点保存到一个数组里面static const float vertex_list[][3] =
{
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
};
// 将要使用的顶点的序号保存到一个数组里面static const GLint index_list[][2] =
{
{0, 1},
{2, 3},
{4, 5},
{6, 7},
{0, 2},
{1, 3},
{4, 6},
{5, 7},
{0, 4},
{1, 5},
{7, 3},
{2, 6}
};
//光照模型
void init(void)
{
GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };
GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };
GLfloat local_view[] = { 0.0 };
glClearColor(0.0, 0.1, 0.1, 0.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, position);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
// 绘制立方体
void DrawCube(void)
{
int i,j;
glBegin(GL_LINES);
for(i=0; i<12; ++i) // 12 条线段
{
for(j=0; j<2; ++j) // 每条线段2个顶点
{
glVertex3fv(vertex_list[index_list[i][j]]);
}
}
glColor3f(1.0f, 1.0f, 1.0f);
glVertex2f(0.0f, 0.0f);
for(i=0; i<=8; ++i)
{
glColor3f(i&0x04, i&0x02, i&0x01);
}
glEnd();
}
static float rotate = 0;
static int times = 0;
void renderScene(void)
{
int w;int h;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
// gluPerspective(45.0f,0.5,0.1f,200.0f);
// glMatrixMode(GL_MODELVIEW);
// glLoadIdentity();
// gluPerspective()
glPushMatrix();
// glTranslatef(-0.2, 0, 0); // 平移
// glScalef(2, 1, 1); // 缩放
times++;
if(times > 100)
{
times = 0;
}
if(times % 100 == 0)
{
rotate += 0.3;
}
glRotatef(rotate, 0, 1, 0);
glRotatef(rotate, 1, 0, 0);
glColor3f(1, 0, 0);
DrawCube();
glPopMatrix();
glutSwapBuffers();
}
void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);