1、GIS 专 业 实 验 报 告 ( 计 算 机 图 形 学 )实验 4 使用 opengl 进行层次模型的编程设计-以简单自行车模型为例姓名 系别班级 学号 实验日期 指导教师 实验成绩殷悦 地信 10.4 2010203482 2013.6.12 肖燕一实验目的及要求用 c+调用 opengl 图形函数库,通过显示列表的嵌套实现复杂物体的层次建模。设计一个包含框架和两个轮子的自行车。二 理论基础1. 显示列表:2. 显示列表的调用:3. OpenGL 划线函数:4. OpenGL 画圆函数:5. OpenGL 绘制闭合画线函数:三 算法设计与分析程序源码如下:#include #includ
2、e GLuint Wheel;GLuint Frame; void Initial(void)glClearColor(1.0f, 1.0f, 1.0f, 1.0f); Wheel = glGenLists(1);glNewList(Wheel, GL_COMPILE);glColor3f(1.0, 0.0, 1.0);glTranslatef(-42.0, -30.0, 0.0);glutSolidTorus(0.3, 20.0, 15, 1000); /线条粗细,半径, /*前轮 */glColor3f(1.0, 0.0, 1.0);glTranslatef(84.0, 0.0, 0.0)
3、;glutSolidTorus(0.3, 20.0, 15, 50); /*后轮 */glColor3f(1.0, 0.0, 1.0);glTranslatef(-84.0, 0.0, 0.0);glutSolidTorus(0.2, 5.0, 15, 50);/*前齿轮 */ glColor3f(0.0, 1.0, 0.0);glTranslatef(40.0, 0.0, 0.0);glutSolidTorus(0.2, 7.0, 15, 50);/*中间齿轮 */ glColor3f(0.0, 1.0, 0.0);glTranslatef(44.0, 0.0, 0.0);glutSolid
4、Torus(0.2, 5.0, 15, 50);/*后齿轮 */ glEndList();Frame = glGenLists(1);glNewList(Frame, GL_COMPILE);glColor3f(0.0, 0.0, 1.0);glLineWidth(3);glTranslatef(-20.0, 20.0, 0.0);glBegin(GL_LINES); /三角形支架 glVertex2i(-10,5);glVertex2i(50,5);glEnd();glBegin(GL_LINES);glVertex2i(-10,5);glVertex2i(20,-35);glEnd();
5、glBegin(GL_LINES); glVertex2i(20,-35);glVertex2i(50,5);glEnd(); /*三角形支架 */glBegin(GL_LINES); /前轮连杆 glVertex2i(-6,20);glVertex2i(-20,-35);glEnd();/*前轮连杆 */glBegin(GL_LINES); /车把 glVertex2i(-15,21);glVertex2i(3,19);glEnd();glBegin(GL_LINES);glVertex2i(-15,21);glVertex2i(-8,25);glEnd();glBegin(GL_LINES
6、);glVertex2i(3,19);glVertex2i(9,23);glEnd();/*车把 */glBegin(GL_LINES); /后轮连杆 glVertex2i(50,5);glVertex2i(64,-35);glEnd(); glBegin(GL_LINES); glVertex2i(50,5); glVertex2i(50,6 );glEnd(); glBegin(GL_LINES);glVertex2i(20,-35);glVertex2i(25,-45);glEnd();glBegin(GL_LINES);glVertex2i(25,-45);glVertex2i(22,
7、-48);glEnd();/*后轮连杆 */glColor3f(0.5, 1, 0.5);glLineWidth(2);glBegin(GL_LINES); /链条(上) glVertex2i(20,-28);glVertex2i(64,-30);glEnd();/*链条(上) */glBegin(GL_LINES); /链条 (下) glVertex2i(20,-42);glVertex2i(64,-40);glEnd();/*链条(下)*/*车座*/glColor3f(1.0, 0.5, 0.0);glLineWidth(3);glBegin(GL_LINE_LOOP); /车座 glVe
8、rtex2i(45,10);glVertex2i(44,9);glVertex2i(44,8);glVertex2i(55,5);glVertex2i(55,6);glVertex2i(55,7);glVertex2i(54,12);glVertex2i(53,13);glEnd();glEndList();void ChangeSize(int w, int h)glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D (-70.0f, 70.0f, -70.0f, 70.0f);void D
9、isplay(void)glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, 0.0);glCallList(Frame); /调用支架显示列表glTranslatef(22.0, -5.0, 0.0);glCallList(Wheel); /调用轮子显示列表glFlush(); int main(int argc, char* argv)glutInit(glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutI
10、nitWindowSize(800,600); glutInitWindowPosition(200,200); glutCreateWindow(“OpenGL 二维自行车姓名:殷悦 学号:2010203482“); glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);Initial(); glutMainLoop(); return 0;四 程序调试及运行结果的自我分析与自我评价大家根据自己能力调试自行车。下面是参考。代码中调用了三个 OpenGL 函数,利用 OpenGL 画线函数绘制出了自行车的框架、车把、链条,利用 OpenGL
11、画圆函数绘制出了自行车前后轮以及前后齿轮,利用 OpenGL 闭合画线函数绘制出了自行车车座,并用显示列表对各个部分进行管理,最终绘制成了一个简易的二维自行车。并对自行车的不同部位设置了不同的颜色,以增强其美观度。精力有限,本作品整体比较简单, 仅仅实现了自行车的二维简单表示,没有绘制出三维自行车。运行结果见下图 1。图 1 调试结果注:直接运行文件夹中的 EXE 文件就可以看到运行结果。五 实验心得及建议通过这次自己动手作程序,加深了对以往所学知识的了解和应用。把老师讲的东西,通过自己的努力和探索并加以研究,变成自己所能理解的东西。在已经基本上掌握了 VB 基础,又加深了各项功能的认识理解。我会把这次作业当作起点,更加加深对 VB 软件的研究,为自己可以早日熟练掌握此软件的各项操作步骤而努力。