版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、123計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告題目名稱: 機(jī)器人手臂 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù)班 級(jí) 學(xué) 號(hào) 姓 名 指導(dǎo)教師 王 玉 昆 2014年 6月 12 日機(jī)器人手臂一、設(shè)計(jì)內(nèi)容與要求1.1 設(shè)計(jì)題目機(jī)器人手臂1.2 設(shè)計(jì)內(nèi)容內(nèi)容:(1)掌握動(dòng)畫(huà)基本原理;(2)實(shí)現(xiàn)三維幾何變換及其組合;功能要求:(1)利用glutWireCube創(chuàng)建機(jī)器手臂:上臂,前臂,帶有手指的手(2)編寫(xiě)三維旋轉(zhuǎn)變換矩陣實(shí)現(xiàn)“上臂帶動(dòng)前臂轉(zhuǎn),前臂帶動(dòng)手轉(zhuǎn)”的效果;(3)使用鍵盤(pán)的上下左右控制鍵各部分的旋轉(zhuǎn);1.3 設(shè)計(jì)目標(biāo)通過(guò)課程設(shè)計(jì),使學(xué)生具備通過(guò)具體的平臺(tái)實(shí)現(xiàn)圖形算法的設(shè)計(jì)、編程與調(diào)試的能力,完成對(duì)實(shí)驗(yàn)結(jié)果分析、總結(jié)及撰寫(xiě)
2、技術(shù)報(bào)告的能力,達(dá)到:鞏固和實(shí)踐計(jì)算機(jī)圖形學(xué)課程中的理論和算法;學(xué)習(xí)表現(xiàn)計(jì)算機(jī)圖形學(xué)算法的技巧;培養(yǎng)認(rèn)真學(xué)習(xí)、積極探索的精神。二、方案設(shè)計(jì)2.1 總體方案設(shè)計(jì)1.圖形學(xué)基本原理(1)幾何變換相關(guān)原理視點(diǎn)變換和模型變換在計(jì)算機(jī)圖形學(xué)中統(tǒng)一稱為幾何變換。視點(diǎn)變換和模型變換只是考慮問(wèn)題的出發(fā)點(diǎn)不同,最后變換的結(jié)果都是一樣的。幾何變換是指三維場(chǎng)景中的物體運(yùn)動(dòng)姿態(tài)的變化,包括物體的平移,旋轉(zhuǎn)和縮放。在OpenGL中提供了3個(gè)命令函數(shù)來(lái)實(shí)現(xiàn)平移,旋轉(zhuǎn)和縮放。它們是glTranslate(),glRotate(),glScale(),從而可以確定一個(gè)物體在場(chǎng)景中的位置,旋轉(zhuǎn)角度和縮放比例。直接使用OpenG
3、L中的矩陣操作函數(shù)可以實(shí)現(xiàn)幾何變換,但是使用OpenGL中的變換函數(shù),變換的速度要快得多。(2)幾何圖形像素化相關(guān)原理是指單元格中顏色值相近的像素結(jié)成塊來(lái)清晰的定義一個(gè)選區(qū)。(3)光照模型相關(guān)原理當(dāng)光線照射到物體表面上時(shí),將出現(xiàn)3種情況:光從物體表面反射,形成反射光。光穿透物體,形成透射光。光被物體吸收,轉(zhuǎn)化稱為物體的內(nèi)能。在上述3種情形的光線中,通常只有前兩種情況的光線會(huì)對(duì)人眼產(chǎn)生視覺(jué)效果,使人察覺(jué)到物體的色彩變化。OpenGL用一種近似的光照模型模擬現(xiàn)實(shí)世界的光照效果。在該模型中,僅當(dāng)物體表面吸引和反射光線時(shí),光源才會(huì)起作用。每一個(gè)物體表面都假定是由具有某種特性的材料構(gòu)成的。一種材料可能發(fā)
4、出自己的光線,也可能在各個(gè)方向上發(fā)散一些射入的光線,還有可能象鏡子一樣在某個(gè)方向強(qiáng)烈地反射入射光。2.2.系統(tǒng)界面與操作說(shuō)明(1) 系統(tǒng)界面與圖形顯示示例 (2) 操作說(shuō)明(配合圖示進(jìn)行說(shuō)明)肩膀:'a'順時(shí)針旋轉(zhuǎn),'A'逆時(shí)針旋轉(zhuǎn) 手臂:'s'順時(shí)針旋轉(zhuǎn),'S'逆時(shí)針旋轉(zhuǎn)手掌:'d'順時(shí)針旋轉(zhuǎn),'D'逆時(shí)針旋轉(zhuǎn)大拇指:'g'向外翻轉(zhuǎn),'G'向內(nèi)翻轉(zhuǎn)大拇指指尖:'t'向外翻轉(zhuǎn),'T'向內(nèi)翻轉(zhuǎn)食指:'h'向內(nèi),'H
5、'向外食指指尖:'y'向外翻轉(zhuǎn),'Y'向內(nèi)翻轉(zhuǎn)中指:'j'向內(nèi),'J'向外中指指尖:'u'向外翻轉(zhuǎn),'U'向內(nèi)翻轉(zhuǎn)無(wú)名指:'k'向內(nèi),'K'向外無(wú)名指指尖:'i'向外翻轉(zhuǎn),'I'向內(nèi)翻轉(zhuǎn)小指:'l'向內(nèi),'L'向外小指指尖:'o'向外翻轉(zhuǎn),'O'向內(nèi)翻轉(zhuǎn)23 過(guò)程流程圖 五步初始化窗口的模式 調(diào)用 glutDisplayFunc 調(diào)用顯示模型 void displa
6、yglutReshapeFunc 可以重新構(gòu)造窗口 void reshapeglutKeyboardFunc 調(diào)用鍵盤(pán)函數(shù) void keyboard glutMainLoop三、詳細(xì)設(shè)計(jì)3.1、源程序與注釋#include <iostream>#include "gl/glut.h"/添加公用庫(kù),不然無(wú)窗口也無(wú)法使用鍵盤(pán)/一些函數(shù)要求OpenGL的類型作為參數(shù),GLfloat,32-bit 浮點(diǎn)GLfloat rotShoulder = 0.0; /肩 -4590GLfloat rotElbow = 0.0; /肘 0160GLfloat rotWrist =
7、 0.0; /腕 -8080/以下取值范圍為 090GLfloat rotFinger10 = 0.0; /拇指 和手掌相聯(lián)的關(guān)節(jié)GLfloat rotFinger11 = 0.0; / 手指上的關(guān)節(jié)GLfloat rotFinger20 = 0.0; /食指GLfloat rotFinger21 = 0.0;GLfloat rotFinger30 = 0.0; /中指GLfloat rotFinger31 = 0.0;GLfloat rotFinger40 = 0.0; /無(wú)名指GLfloat rotFinger41 = 0.0;GLfloat rotFinger50 = 0.0; /小指G
8、Lfloat 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);/建立窗口被創(chuàng)建成為什么背景色黃色 glShadeModel(GL_SMOOTH);/一個(gè)多邊形可以初始化為一個(gè)顏色(flat shading) 或者多個(gè)不同的顏色(smooth shading),此函數(shù)默認(rèn)指定為GL_SMOOTH glEnable
9、(GL_DEPTH_TEST);/狀態(tài)可以改變,和它相反的是glDisable() glEnable(GL_LIGHTING);/OpenGL必須明確定義光照,不然關(guān)照模型,光源, 材質(zhì)都無(wú)法顯示 glLightfv(GL_LIGHT0, GL_POSITION, light0_position); glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);/可以定以至少8種光,這 里是白光??梢远x為聚光燈還是泛光燈 glEnable(GL_LIGHT0);/定義了你要的燈的特征,你要把它們用此函數(shù)轉(zhuǎn)化,你 也需要調(diào)用glEnable()準(zhǔn)備運(yùn)行燈光函
10、數(shù)的計(jì)算參數(shù) void reshape(GLsizei w, GLsizei h)/32位整形,相當(dāng)于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_BUFFER_BIT);/清空色深緩 沖和
11、位深緩沖 glLoadIdentity();/當(dāng)視角轉(zhuǎn)換被指定,先要定義當(dāng)前矩陣,如果不定義會(huì)和上 次的矩陣一起 gluLookAt(0.0, 0.0, 60.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);/指定相機(jī)的放置,目標(biāo)指 向哪,什么方式(0,1,0)向上指示 glRotatef(30.0, 0.0, 1.0, 0.0);/關(guān)于y軸偏30° glPushMatrix(); /肩 glTranslatef(6.0, 0.0, 0.0);/把對(duì)象正移6個(gè)單位/把視點(diǎn)負(fù)移6個(gè)單位 glRotatef(rotShoulder, 0.0, 0.0, 1.0);/沿z
12、軸旋轉(zhuǎn)rotShoulder角度 glScalef(12.0, 2.0, 4.0);/這個(gè)函數(shù)用來(lái)指定沿三個(gè)軸縮放多少,x軸12,y軸2, z軸4 glutSolidCube(1.0); glScalef(1.0/12.0, 1.0/2.0, 1.0/4.0); /消除對(duì)之后坐標(biāo)的影響 glPushMatrix(); /肘 glTranslatef(6.0, 0.0, 0.0); glRotatef(rotElbow, 0.0, 0.0, 1.0); glTranslatef(6.0, 0.0, 0.0); /分兩次平移,第一次使得旋轉(zhuǎn)軸在立方體尾部 glScalef(12.0, 2.0, 4
13、.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(); /拇指 與手腕相聯(lián)的關(guān)節(jié) glTranslatef(-1.
14、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(); /拇指上的關(guān)節(jié) glTranslatef(0.0, 0.0, -1.0); glRotatef(rotFinger11, 1.0, 0.0, 0.0); glTransl
15、atef(0.0, 0.0, 0.0); glScalef(1.0, 1.0, 2.0); glutSolidCube(1.0); glPopMatrix(); glPopMatrix(); glPushMatrix(); /食指 與手腕相聯(lián)的關(guān)節(jié) 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.0, 1.0); glP
16、ushMatrix(); /食指上的關(guān)節(jié) 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();/食指關(guān)節(jié)出棧 glPopMatrix();/食指出棧 /*/ glPushMatrix();/中指 glTranslatef(3.0,0.0,-1.5); glRotatef(rotFinger30, 0.0, 0.0, 1.0); glTr
17、anslatef(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(); /*/ glPushMatrix();/無(wú)名指 glT
18、ranslatef(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); glutSolidCub
19、e(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.0,0.0,1.0);
20、 glTranslatef(1.25,0.0,0.0); glScalef(2.5,1.0,1.0); glutSolidCube(1.0); glPopMatrix(); glPopMatrix(); /*/ glPopMatrix();/手掌出棧 glPopMatrix();/上臂出棧 glPopMatrix();/整個(gè)手臂出棧 glutSwapBuffers();/交換緩沖區(qū) void keyboard(GLubyte key, GLint x, GLint y) /小寫(xiě)字母減少旋轉(zhuǎn)度數(shù),大寫(xiě)字母增加 switch(key) /肩 case 'a': If(rotShou
21、lder>-45.0) rotShoulder -= 5.0; glutPostRedisplay();/程序改變窗口的內(nèi)容 break; case 'A': if(rotShoulder<90.0) rotShoulder += 5.0; glutPostRedisplay(); break; /肘 case 's': if(rotElbow>0.0) rotElbow -= 5.0; glutPostRedisplay(); break; case 'S': if(rotElbow<160.0) rotElbow +=
22、 5.0; glutPostRedisplay(); break; /腕 case 'd': if(rotWrist>-80.0) rotWrist -= 5.0; glutPostRedisplay(); break; case 'D': if(rotWrist<80.0) rotWrist += 5.0; glutPostRedisplay(); break; /拇指 case 'g': if(rotFinger10>0.0) rotFinger10 -= 5.0; glutPostRedisplay(); break; c
23、ase 'G': if(rotFinger10<90.0) rotFinger10 += 5.0; glutPostRedisplay(); break; case 't': if(rotFinger11>0.0) rotFinger11 -= 5.0; glutPostRedisplay(); break; case 'T': if(rotFinger11<90.0) rotFinger11 += 5.0; glutPostRedisplay(); break; /食指 case 'h': if(rotFing
24、er20>0.0) rotFinger20 -= 5.0; glutPostRedisplay(); break; case 'H': if(rotFinger20<90.0) rotFinger20 += 5.0; glutPostRedisplay(); break; case 'y': if(rotFinger21>0.0) rotFinger21 -= 5.0; glutPostRedisplay(); break; case 'Y': if(rotFinger21<90.0) rotFinger21 += 5.0
25、; glutPostRedisplay(); break; case 'j': if(rotFinger30>0.0) rotFinger30 -= 5.0; glutPostRedisplay(); break; case 'J': if(rotFinger30<90.0) rotFinger30 += 5.0; glutPostRedisplay(); break; case 'u': if(rotFinger31>0.0) rotFinger31 -= 5.0; glutPostRedisplay(); break; ca
26、se 'U': if(rotFinger31<90.0) rotFinger31 += 5.0; glutPostRedisplay(); break; case 'k': if(rotFinger40>0.0) rotFinger40 -= 5.0; glutPostRedisplay(); break; case 'K': if(rotFinger40<90.0) rotFinger40 += 5.0; glutPostRedisplay(); break; case 'i': if(rotFinger41&
27、gt;0.0) rotFinger41 -= 5.0; glutPostRedisplay(); break; case 'I': if(rotFinger41<90.0) rotFinger41 += 5.0; glutPostRedisplay(); break; case 'l': if(rotFinger50>0.0) rotFinger50 -= 5.0; glutPostRedisplay(); break; case 'L': if(rotFinger50<90.0) rotFinger50 += 5.0; glu
28、tPostRedisplay(); break; case 'o': if(rotFinger51>0.0) rotFinger51 -= 5.0; glutPostRedisplay(); break; case 'O': if(rotFinger51<90.0) rotFinger51 += 5.0; glutPostRedisplay(); break; default: break; int main(int argc, char* argv) /五步初始化窗口的模式調(diào)用 glutInit(&argc, argv);/初始化glut和
29、任何命令線的參數(shù) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);/用 雙緩存,rgba顏色模式,深度緩存 glutInitWindowPosition(200, 100);/指定屏幕左上點(diǎn)位置 glutInitWindowSize(400, 300);/用像素指定大小 glutCreateWindow("機(jī)器人手臂");/直到glutMainLoop()被調(diào)用,此窗口開(kāi)始 被調(diào)用了 init(); glutDisplayFunc(display); /glutDisplayFunc(void (*func
30、)(void)是第一個(gè)也是最重要的回調(diào)函數(shù),不斷 要重復(fù)的函數(shù)就放在這里 glutReshapeFunc(reshape); /回調(diào)函數(shù),當(dāng)你初始打開(kāi)一個(gè)窗口或者之后移動(dòng)或者重新定義大小,窗口 會(huì)發(fā)送一個(gè)外部事件來(lái)通知你 /重新建立有新畫(huà)布的矩形區(qū) /定義物體將被畫(huà)的坐標(biāo)系統(tǒng) glutKeyboardFunc(keyboard);/調(diào)用鍵盤(pán)的函數(shù) glutMainLoop(); return 0;四、總結(jié)4.1、經(jīng)驗(yàn)總結(jié)總結(jié)在原理理解、程序設(shè)計(jì)中所遇到的困難是如何解決的,可以舉出1至2個(gè)例子。問(wèn)題分為3類,一類是大方向問(wèn)題,比如一開(kāi)始編程序時(shí)連OpenGL用VC編都不知道,這時(shí)去問(wèn)下老師是比較快的方法。聽(tīng)了老師的建議后,對(duì)自己做的東西拿捏就比較準(zhǔn),不至于盲目的前進(jìn)。問(wèn)了老師以后,老師只是大方向給了提示,具體還是要自己做,就快速的看一些相關(guān)的書(shū),這里的快速不是細(xì)細(xì)鉆研,而是快速的學(xué)習(xí)。書(shū)上給的程序和自己項(xiàng)目有關(guān)的就快速的用。差不多如此就可以大概的完成程序,畢竟我們的目的是完成程序,而
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 60287:2025 SER EN-FR Electric cables - ALL PARTS
- 224套名牌大學(xué)經(jīng)濟(jì)學(xué)初試真題
- 北師大版小學(xué)數(shù)學(xué)一年級(jí)下冊(cè)(2024)期中綜合素養(yǎng)測(cè)評(píng)B卷(含答案)
- 2024通信網(wǎng)絡(luò)信息安全防護(hù)項(xiàng)目合同3篇
- 企業(yè)競(jìng)爭(zhēng)圖譜:2024年磁性元件 頭豹詞條報(bào)告系列
- 2024智能倉(cāng)庫(kù)物流系統(tǒng)設(shè)計(jì)與實(shí)施合同
- 2024餐飲房屋租賃合同范本
- 2024銷售合同軟件
- 2024石材荒料國(guó)際貿(mào)易結(jié)算與外匯管理合同3篇
- 福建省南平市建陽(yáng)水吉中學(xué)2022年高一地理下學(xué)期期末試卷含解析
- 寶寶大便觀察及護(hù)理課件
- 公司月度安全生產(chǎn)綜合檢查表
- 開(kāi)題報(bào)告會(huì)記錄單
- 對(duì)話的力量:焦點(diǎn)解決取向在青少年輔導(dǎo)中的應(yīng)用
- 我的家鄉(xiāng)湖北荊門介紹
- (銀川市直部門之間交流)2022事業(yè)單位工作人員調(diào)動(dòng)表
- 廣州市小學(xué)生學(xué)籍表
- 法律與社會(huì)學(xué)習(xí)通章節(jié)答案期末考試題庫(kù)2023年
- 瓷磚采購(gòu)?fù)稑?biāo)方案
- 大學(xué)生職業(yè)生涯規(guī)劃-自我認(rèn)知-課件
- 化工設(shè)備安裝預(yù)算定額庫(kù)
評(píng)論
0/150
提交評(píng)論