1、计算机图形学设计计算机图形学课程设计报告题目名称: 机器人手臂 专 业 计算机科学与技术 班 级 学 号 姓 名 指导教师 王 玉 昆 2014年 6月 12 日机器人手臂一、设计内容与要求1.1 设计题目机器人手臂1.2 设计内容内容:(1)掌握动画基本原理;(2)实现三维几何变换及其组合;功能要求:(1)利用glutWireCube创建机器手臂:上臂,前臂,带有手指的手(2)编写三维旋转变换矩阵实现“上臂带动前臂转,前臂带动手转”的效果;(3)使用键盘的上下左右控制键各部分的旋转;1.3 设计目标通过课程设计,使学生具备通过具体的平台实现图形算法的设计、编程与调试的能力,完成对实验结果分析
2、、总结及撰写技术报告的能力,达到:巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。二、方案设计2.1 总体方案设计1.图形学基本原理(1)几何变换相关原理视点变换和模型变换在计算机图形学中统一称为几何变换。视点变换和模型变换只是考虑问题的出发点不同,最后变换的结果都是一样的。几何变换是指三维场景中的物体运动姿态的变化,包括物体的平移,旋转和缩放。在OpenGL中提供了3个命令函数来实现平移,旋转和缩放。它们是glTranslate(),glRotate(),glScale(),从而可以确定一个物体在场景中的位置,旋转角度和缩放比例。直接使
3、用OpenGL中的矩阵操作函数可以实现几何变换,但是使用OpenGL中的变换函数,变换的速度要快得多。(2)几何图形像素化相关原理是指单元格中颜色值相近的像素结成块来清晰的定义一个选区。(3)光照模型相关原理当光线照射到物体表面上时,将出现3种情况:光从物体表面反射,形成反射光。光穿透物体,形成透射光。光被物体吸收,转化称为物体的内能。在上述3种情形的光线中,通常只有前两种情况的光线会对人眼产生视觉效果,使人察觉到物体的色彩变化。OpenGL用一种近似的光照模型模拟现实世界的光照效果。在该模型中,仅当物体表面吸引和反射光线时,光源才会起作用。每一个物体表面都假定是由具有某种特性的材料构成的。一
4、种材料可能发出自己的光线,也可能在各个方向上发散一些射入的光线,还有可能象镜子一样在某个方向强烈地反射入射光。2.2.系统界面与操作说明(1) 系统界面与图形显示示例 (2) 操作说明(配合图示进行说明)肩膀:a顺时针旋转,A逆时针旋转 手臂:s顺时针旋转,S逆时针旋转手掌:d顺时针旋转,D逆时针旋转大拇指:g向外翻转,G向内翻转大拇指指尖:t向外翻转,T向内翻转食指:h向内,H向外食指指尖:y向外翻转,Y向内翻转中指:j向内,J向外中指指尖:u向外翻转,U向内翻转无名指:k向内,K向外无名指指尖:i向外翻转,I向内翻转小指:l向内,L向外小指指尖:o向外翻转,O向内翻转23 过程流程图 五步
5、初始化窗口的模式 调用 glutDisplayFunc 调用显示模型 void displayglutReshapeFunc 可以重新构造窗口 void reshapeglutKeyboardFunc 调用键盘函数 void keyboard glutMainLoop三、详细设计3.1、源程序与注释#include #include gl/glut.h/添加公用库,不然无窗口也无法使用键盘/一些函数要求OpenGL的类型作为参数,GLfloat,32-bit 浮点GLfloat rotShoulder = 0.0; /肩 -4590GLfloat rotElbow = 0.0; /肘 0160
6、GLfloat rotWrist = 0.0; /腕 -8080/以下取值范围为 090GLfloat rotFinger10 = 0.0; /拇指 和手掌相联的关节GLfloat rotFinger11 = 0.0; / 手指上的关节GLfloat rotFinger20 = 0.0; /食指GLfloat rotFinger21 = 0.0;GLfloat rotFinger30 = 0.0; /中指GLfloat rotFinger31 = 0.0;GLfloat rotFinger40 = 0.0; /无名指GLfloat rotFinger41 = 0.0;GLfloat rotFi
7、nger50 = 0.0; /小指GLfloat rotFinger51 = 0.0;void init() static GLfloat light0_position = 1.0, 1.0, 1.0, 0.0; static GLfloat light0_diffuse = 0.0, 1.0, 1.0, 1.0; glClearColor(1.0, 1.0, 0.0, 0.0);/建立窗口被创建成为什么背景色黄色 glShadeModel(GL_SMOOTH);/一个多边形可以初始化为一个颜色(flat shading) 或者多个不同的颜色(smooth shading),此函数默认指定为
8、GL_SMOOTH glEnable(GL_DEPTH_TEST);/状态可以改变,和它相反的是glDisable() glEnable(GL_LIGHTING);/OpenGL必须明确定义光照,不然关照模型,光源, 材质都无法显示 glLightfv(GL_LIGHT0, GL_POSITION, light0_position); glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);/可以定以至少8种光,这 里是白光。可以定义为聚光灯还是泛光灯 glEnable(GL_LIGHT0);/定义了你要的灯的特征,你要把它们用此函数转化,你 也需要调
9、用glEnable()准备运行灯光函数的计算参数 void reshape(GLsizei w, GLsizei h)/32位整形,相当于long if(0=h) h=1; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 0.1, 500.0); glMatrixMode(GL_MODELVIEW); void display() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUF
10、FER_BIT);/清空色深缓 冲和位深缓冲 glLoadIdentity();/当视角转换被指定,先要定义当前矩阵,如果不定义会和上 次的矩阵一起 gluLookAt(0.0, 0.0, 60.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);/指定相机的放置,目标指 向哪,什么方式(0,1,0)向上指示 glRotatef(30.0, 0.0, 1.0, 0.0);/关于y轴偏30 glPushMatrix(); /肩 glTranslatef(6.0, 0.0, 0.0);/把对象正移6个单位/把视点负移6个单位 glRotatef(rotShoulder, 0.0, 0
11、.0, 1.0);/沿z轴旋转rotShoulder角度 glScalef(12.0, 2.0, 4.0);/这个函数用来指定沿三个轴缩放多少,x轴12,y轴2, z轴4 glutSolidCube(1.0); glScalef(1.0/12.0, 1.0/2.0, 1.0/4.0); /消除对之后坐标的影响 glPushMatrix(); /肘 glTranslatef(6.0, 0.0, 0.0); glRotatef(rotElbow, 0.0, 0.0, 1.0); glTranslatef(6.0, 0.0, 0.0); /分两次平移,第一次使得旋转轴在立方体尾部 glScalef(
12、12.0, 2.0, 4.0); glutSolidCube(1.0); glScalef(1.0/12.0, 1.0/2.0, 1.0/4.0); glPushMatrix(); /手掌 glTranslatef(6.0, 0.0, 0.0); glRotatef(rotWrist, 0.0, 0.0, 1.0); glTranslatef(3.0, 0.0, 0.0); glScalef(6.0, 1.0, 4.0); glutSolidCube(1.0); glScalef(1.0/6.0, 1.0, 1.0/4.0); glPushMatrix(); /拇指 与手腕相联的关节 glTr
13、anslatef(-1.0, 0.0, -1.0); glRotatef(-rotFinger10, 0.0, 0.0, 1.0); glRotatef(rotFinger10, 1.0, 0.0, 0.0); glTranslatef(-1.0, 0.0, -2.0); glScalef(1.0, 1.0, 2.0); glutSolidCube(1.0); glScalef(1.0, 1.0, 1.0/2.0); glPushMatrix(); /拇指上的关节 glTranslatef(0.0, 0.0, -1.0); glRotatef(rotFinger11, 1.0, 0.0, 0.
14、0); glTranslatef(0.0, 0.0, 0.0); glScalef(1.0, 1.0, 2.0); glutSolidCube(1.0); glPopMatrix(); glPopMatrix(); glPushMatrix(); /食指 与手腕相联的关节 glTranslatef(3.0, 0.0, -1.5); glRotatef(rotFinger20, 0.0, 0.0, 1.0); glTranslatef(1.0, 0.0, 0.0); glScalef(2.0, 1.0, 1.0); glutSolidCube(1.0); glScalef(1.0/2.0, 1.
15、0, 1.0); glPushMatrix(); /食指上的关节 glTranslatef(1.0, 0.0, 0.0); glRotatef(rotFinger21, 0.0, 0.0, 1.0); glTranslatef(1.25, 0.0, 0.0); glScalef(2.5, 1.0, 1.0); glutSolidCube(1.0); glPopMatrix();/食指关节出栈 glPopMatrix();/食指出栈 /*/ glPushMatrix();/中指 glTranslatef(3.0,0.0,-1.5); glRotatef(rotFinger30, 0.0, 0.0
16、, 1.0); glTranslatef(1.0,0.0,1.0); glScalef(2.5,1.0,1.0); glutSolidCube(1.0); glScalef(1.0/2.0,1.0,1.0); glPushMatrix(); glTranslatef(1.0,0.0,0.0); glRotatef(rotFinger31,0.0,0.0,1.0); glTranslatef(1.25,0.0,0.0); glScalef(2.5,1.0,1.0); glutSolidCube(1.0); glPopMatrix(); glPopMatrix(); /*/ glPushMatri
17、x();/无名指 glTranslatef(3.0,0.0,-1.5); glRotatef(rotFinger40,0.0,0.0,1.0); glTranslatef(1.0,0.0,2.0); glScalef(2.0,1.0,1.0); glutSolidCube(1.0); glScalef(1.0/2.0,1.0,1.0); glPushMatrix(); glTranslatef(1.0,0.0,0.0); glRotatef(rotFinger41,0.0,0.0,1.0); glTranslatef(1.25,0.0,0.0); glScalef(2.5,1.0,1.0);
18、glutSolidCube(1.0); glPopMatrix(); glPopMatrix(); /*/ glPushMatrix();/小指 glTranslatef(3.0,0.0,-1.5); glRotatef(rotFinger50,0.0,0.0,1.0); glTranslatef(1.0,0.0,3.0); glScalef(1.5,1.0,1.0); glutSolidCube(1.0); glScalef(1.0/1.5,1.0,1.0); glPushMatrix(); glTranslatef(1.0,0.0,0.0); glRotatef(rotFinger51,0
19、.0,0.0,1.0); glTranslatef(1.25,0.0,0.0); glScalef(2.5,1.0,1.0); glutSolidCube(1.0); glPopMatrix(); glPopMatrix(); /*/ glPopMatrix();/手掌出栈 glPopMatrix();/上臂出栈 glPopMatrix();/整个手臂出栈 glutSwapBuffers();/交换缓冲区 void keyboard(GLubyte key, GLint x, GLint y) /小写字母减少旋转度数,大写字母增加 switch(key) /肩 case a: If(rotSh
20、oulder-45.0) rotShoulder -= 5.0; glutPostRedisplay();/程序改变窗口的内容 break; case A: if(rotShoulder0.0) rotElbow -= 5.0; glutPostRedisplay(); break; case S: if(rotElbow-80.0) rotWrist -= 5.0; glutPostRedisplay(); break; case D: if(rotWrist0.0) rotFinger10 -= 5.0; glutPostRedisplay(); break; case G: if(rot
21、Finger100.0) rotFinger11 -= 5.0; glutPostRedisplay(); break; case T: if(rotFinger110.0) rotFinger20 -= 5.0; glutPostRedisplay(); break; case H: if(rotFinger200.0) rotFinger21 -= 5.0; glutPostRedisplay(); break; case Y: if(rotFinger210.0) rotFinger30 -= 5.0; glutPostRedisplay(); break; case J: if(rot
22、Finger300.0) rotFinger31 -= 5.0; glutPostRedisplay(); break; case U: if(rotFinger310.0) rotFinger40 -= 5.0; glutPostRedisplay(); break; case K: if(rotFinger400.0) rotFinger41 -= 5.0; glutPostRedisplay(); break; case I: if(rotFinger410.0) rotFinger50 -= 5.0; glutPostRedisplay(); break; case L: if(rot
23、Finger500.0) rotFinger51 -= 5.0; glutPostRedisplay(); break; case O: if(rotFinger5190.0) rotFinger51 += 5.0; glutPostRedisplay(); break; default: break; int main(int argc, char* argv) /五步初始化窗口的模式调用 glutInit(&argc, argv);/初始化glut和任何命令线的参数 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);/用 双
24、缓存,rgba颜色模式,深度缓存 glutInitWindowPosition(200, 100);/指定屏幕左上点位置 glutInitWindowSize(400, 300);/用像素指定大小 glutCreateWindow(机器人手臂);/直到glutMainLoop()被调用,此窗口开始 被调用了 init(); glutDisplayFunc(display); /glutDisplayFunc(void (*func)(void)是第一个也是最重要的回调函数,不断 要重复的函数就放在这里 glutReshapeFunc(reshape); /回调函数,当你初始打开一个窗口或者之后
25、移动或者重新定义大小,窗口 会发送一个外部事件来通知你 /重新建立有新画布的矩形区 /定义物体将被画的坐标系统 glutKeyboardFunc(keyboard);/调用键盘的函数 glutMainLoop(); return 0;四、总结4.1、经验总结总结在原理理解、程序设计中所遇到的困难是如何解决的,可以举出1至2个例子。问题分为3类,一类是大方向问题,比如一开始编程序时连OpenGL用VC编都不知道,这时去问下老师是比较快的方法。听了老师的建议后,对自己做的东西拿捏就比较准,不至于盲目的前进。问了老师以后,老师只是大方向给了提示,具体还是要自己做,就快速的看一些相关的书,这里的快速不是细细钻研,而是快速的学习。书上给的程序和自己项目有关的就快速的用。差不多如此就可以大概的完成程序,毕竟我们的目的是完成程序,而不是搞研究,这样基本就可以完成了。 大程序完成后就一般会有第二类问题,是自己创新的问题。因为是自己的东西,所以一定要有创新,要加一些自己的东西。这时就要对程序有个比较深入的了解了。细细研究一下程序的算法等等,问问老师,多和同学交流,上网看高手的博客,或者在群里讨论,有时候别人的一句话就可能让你恍然大悟。不然很
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1