版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、123計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告題目名稱: 機(jī)器人手臂 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù)班 級 學(xué) 號 姓 名 指導(dǎo)教師 王 玉 昆 2014年 6月 12 日機(jī)器人手臂一、設(shè)計(jì)內(nèi)容與要求1.1 設(shè)計(jì)題目機(jī)器人手臂1.2 設(shè)計(jì)內(nèi)容內(nèi)容:(1)掌握動畫基本原理;(2)實(shí)現(xiàn)三維幾何變換及其組合;功能要求:(1)利用glutWireCube創(chuàng)建機(jī)器手臂:上臂,前臂,帶有手指的手(2)編寫三維旋轉(zhuǎn)變換矩陣實(shí)現(xiàn)“上臂帶動前臂轉(zhuǎn),前臂帶動手轉(zhuǎn)”的效果;(3)使用鍵盤的上下左右控制鍵各部分的旋轉(zhuǎn);1.3 設(shè)計(jì)目標(biāo)通過課程設(shè)計(jì),使學(xué)生具備通過具體的平臺實(shí)現(xiàn)圖形算法的設(shè)計(jì)、編程與調(diào)試的能力,完成對實(shí)驗(yàn)結(jié)果分析、總結(jié)及撰寫
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)變換和模型變換只是考慮問題的出發(fā)點(diǎn)不同,最后變換的結(jié)果都是一樣的。幾何變換是指三維場景中的物體運(yùn)動姿態(tài)的變化,包括物體的平移,旋轉(zhuǎn)和縮放。在OpenGL中提供了3個命令函數(shù)來實(shí)現(xiàn)平移,旋轉(zhuǎn)和縮放。它們是glTranslate(),glRotate(),glScale(),從而可以確定一個物體在場景中的位置,旋轉(zhuǎn)角度和縮放比例。直接使用OpenG
3、L中的矩陣操作函數(shù)可以實(shí)現(xiàn)幾何變換,但是使用OpenGL中的變換函數(shù),變換的速度要快得多。(2)幾何圖形像素化相關(guān)原理是指單元格中顏色值相近的像素結(jié)成塊來清晰的定義一個選區(qū)。(3)光照模型相關(guān)原理當(dāng)光線照射到物體表面上時,將出現(xiàn)3種情況:光從物體表面反射,形成反射光。光穿透物體,形成透射光。光被物體吸收,轉(zhuǎn)化稱為物體的內(nèi)能。在上述3種情形的光線中,通常只有前兩種情況的光線會對人眼產(chǎn)生視覺效果,使人察覺到物體的色彩變化。OpenGL用一種近似的光照模型模擬現(xiàn)實(shí)世界的光照效果。在該模型中,僅當(dāng)物體表面吸引和反射光線時,光源才會起作用。每一個物體表面都假定是由具有某種特性的材料構(gòu)成的。一種材料可能發(fā)
4、出自己的光線,也可能在各個方向上發(fā)散一些射入的光線,還有可能象鏡子一樣在某個方向強(qiáng)烈地反射入射光。2.2.系統(tǒng)界面與操作說明(1) 系統(tǒng)界面與圖形顯示示例 (2) 操作說明(配合圖示進(jìn)行說明)肩膀:'a'順時針旋轉(zhuǎn),'A'逆時針旋轉(zhuǎn) 手臂:'s'順時針旋轉(zhuǎn),'S'逆時針旋轉(zhuǎn)手掌:'d'順時針旋轉(zhuǎn),'D'逆時針旋轉(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)無名指:'k'向內(nèi),'K'向外無名指指尖:'i'向外翻轉(zhuǎn),'I'向內(nèi)翻轉(zhuǎn)小指:'l'向內(nèi),'L'向外小指指尖:'o'向外翻轉(zhuǎn),'O'向內(nèi)翻轉(zhuǎn)23 過程流程圖 五步初始化窗口的模式 調(diào)用 glutDisplayFunc 調(diào)用顯示模型 void displa
6、yglutReshapeFunc 可以重新構(gòu)造窗口 void reshapeglutKeyboardFunc 調(diào)用鍵盤函數(shù) void keyboard glutMainLoop三、詳細(xì)設(shè)計(jì)3.1、源程序與注釋#include <iostream>#include "gl/glut.h"/添加公用庫,不然無窗口也無法使用鍵盤/一些函數(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; /無名指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);/一個多邊形可以初始化為一個顏色(flat shading) 或者多個不同的顏色(smooth shading),此函數(shù)默認(rèn)指定為GL_SMOOTH glEnable
9、(GL_DEPTH_TEST);/狀態(tài)可以改變,和它相反的是glDisable() glEnable(GL_LIGHTING);/OpenGL必須明確定義光照,不然關(guān)照模型,光源, 材質(zhì)都無法顯示 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)前矩陣,如果不定義會和上 次的矩陣一起 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);/把對象正移6個單位/把視點(diǎn)負(fù)移6個單位 glRotatef(rotShoulder, 0.0, 0.0, 1.0);/沿z
12、軸旋轉(zhuǎn)rotShoulder角度 glScalef(12.0, 2.0, 4.0);/這個函數(shù)用來指定沿三個軸縮放多少,x軸12,y軸2, z軸4 glutSolidCube(1.0); glScalef(1.0/12.0, 1.0/2.0, 1.0/4.0); /消除對之后坐標(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();/無名指 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();/整個手臂出棧 glutSwapBuffers();/交換緩沖區(qū) void keyboard(GLubyte key, GLint x, GLint y) /小寫字母減少旋轉(zhuǎn)度數(shù),大寫字母增加 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)用,此窗口開始 被調(diào)用了 init(); glutDisplayFunc(display); /glutDisplayFunc(void (*func
30、)(void)是第一個也是最重要的回調(diào)函數(shù),不斷 要重復(fù)的函數(shù)就放在這里 glutReshapeFunc(reshape); /回調(diào)函數(shù),當(dāng)你初始打開一個窗口或者之后移動或者重新定義大小,窗口 會發(fā)送一個外部事件來通知你 /重新建立有新畫布的矩形區(qū) /定義物體將被畫的坐標(biāo)系統(tǒng) glutKeyboardFunc(keyboard);/調(diào)用鍵盤的函數(shù) glutMainLoop(); return 0;四、總結(jié)4.1、經(jīng)驗(yàn)總結(jié)總結(jié)在原理理解、程序設(shè)計(jì)中所遇到的困難是如何解決的,可以舉出1至2個例子。問題分為3類,一類是大方向問題,比如一開始編程序時連OpenGL用VC編都不知道,這時去問下老師是比較快的方法。聽了老師的建議后,對自己做的東西拿捏就比較準(zhǔn),不至于盲目的前進(jìn)。問了老師以后,老師只是大方向給了提示,具體還是要自己做,就快速的看一些相關(guān)的書,這里的快速不是細(xì)細(xì)鉆研,而是快速的學(xué)習(xí)。書上給的程序和自己項(xiàng)目有關(guān)的就快速的用。差不多如此就可以大概的完成程序,畢竟我們的目的是完成程序,而
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)氧涂料行業(yè)的投資價值及風(fēng)險(xiǎn)研究
- 現(xiàn)代企業(yè)管理中的危機(jī)管理與領(lǐng)導(dǎo)力
- Module 1 Unit 1 Did you come back yesterday?(說課稿)-2024-2025學(xué)年外研版(三起)英語五年級上冊
- 1 古詩詞三首(說課稿)-2023-2024學(xué)年統(tǒng)編版語文四年級下冊001
- 2024年四年級英語上冊 Unit 2 My schoolbag The first period說課稿 人教PEP
- Unit 1 Science and Scientists Listening and Speaking說課稿+ 學(xué)案 高中英語同步備課系列人教版2019選擇性必修第二冊
- 2024-2025學(xué)年高中物理 第三章 傳感器 1 傳感器說課稿1 教科版選修3-2
- 2023八年級語文上冊 第二單元 8 列夫 托爾斯泰配套說課稿 新人教版
- Unit7 At the Restaurant(說課稿)-2023-2024學(xué)年北師大版(一起)英語三年級下冊
- 16 表里的生物 說課稿-2023-2024學(xué)年語文六年級下冊統(tǒng)編版
- 2025年研究生考試考研英語(二204)試卷與參考答案
- DB31∕731-2020 船舶修正總噸單位產(chǎn)品能源消耗限額
- 2024-年全國醫(yī)學(xué)博士外語統(tǒng)一入學(xué)考試英語試題
- 天津市-2024年-社區(qū)工作者-上半年筆試真題卷
- 2024年衛(wèi)生專業(yè)技術(shù)資格考試衛(wèi)生檢驗(yàn)技術(shù)(初級(師)211)相關(guān)專業(yè)知識試題及答案指導(dǎo)
- 公務(wù)用車分時租賃實(shí)施方案
- 《手衛(wèi)生知識培訓(xùn)》培訓(xùn)課件
- 《祛痘產(chǎn)品祛痘產(chǎn)品》課件
- 江蘇省南京鼓樓區(qū)2024年中考聯(lián)考英語試題含答案
- 人輪狀病毒感染
- 兒科護(hù)理學(xué)試題及答案解析-神經(jīng)系統(tǒng)疾病患兒的護(hù)理(二)
評論
0/150
提交評論