ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:91.22KB ,
资源ID:27838455      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27838455.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机图形学设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

计算机图形学设计.docx

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