版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 1 引言</b></p><p> OpenGL作為一種三維工具軟件包,在交互式三維圖形建模能力和編程方面具有無(wú)可比擬的優(yōu)越性。OpenGL是SGI公司開(kāi)發(fā)的,可獨(dú)立?操作系統(tǒng)和硬件環(huán)境的三維圖形庫(kù),已在各種工作站和高檔微機(jī)中運(yùn)行,由于其強(qiáng)大的圖形功能和跨平臺(tái)的能力,已成為事實(shí)上的圖形標(biāo)準(zhǔn),被人們廣泛應(yīng)用于科學(xué)可視化、實(shí)體造型、CAD/CAM、模擬仿真等諸多
2、領(lǐng)域。</p><p> 在醫(yī)學(xué)應(yīng)用中,人體骨骼的使用能使醫(yī)生和病人之間有一個(gè)良好的溝通,使病人能知道自己的病情,能很好的配合醫(yī)生進(jìn)行有效的治療;在實(shí)踐教學(xué)中,通過(guò)對(duì)人體骨骼的展示,教師能很好的講解各個(gè)骨骼關(guān)節(jié)之間的運(yùn)動(dòng)關(guān)系,從而使學(xué)生對(duì)骨骼和骨骼關(guān)節(jié)之間的運(yùn)動(dòng)關(guān)系有更深刻的理解。</p><p> 課題來(lái)源于徐州翰林高科技公司,該公司主要從事醫(yī)學(xué)圖像處理軟件研究與開(kāi)發(fā)。課題“人體三維
3、骨骼運(yùn)動(dòng)仿真研究”的目的是利用三維仿真技術(shù),利用骨骼模型進(jìn)行編程和控制展示人體骨骼及運(yùn)動(dòng),主要包括三維建模技術(shù)及實(shí)現(xiàn),人體運(yùn)動(dòng)方式設(shè)計(jì)等.</p><p> 課題是以visual C++和OpenGL為編程環(huán)境來(lái)仿真人體骨骼運(yùn)動(dòng),通過(guò)對(duì)人體主要骨骼和骨骼之間的運(yùn)動(dòng)關(guān)系來(lái)展示人體的奇妙之處。</p><p><b> 2 需求分析</b></p>&
4、lt;p> 2.1 功能需求分析</p><p> 本設(shè)計(jì)是根據(jù)徐州翰林軟件公司的要求,整理出人體骨骼的運(yùn)動(dòng)過(guò)程,并對(duì)該過(guò)程進(jìn)行了細(xì)心的分析得出了如下的需求分析。</p><p> 通過(guò)對(duì)徐州翰林軟件公司的要求分析,得出系統(tǒng)應(yīng)具有的功能如下:</p><p> 2.1.1 全景視圖</p><p> 1) 點(diǎn)頭:當(dāng)用戶想了解點(diǎn)
5、頭的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作能使骨骼做點(diǎn)頭動(dòng)作。</p><p> 2) 搖頭:當(dāng)用戶想了解搖頭運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做搖頭運(yùn)動(dòng)。</p><p> 3) 抬左臂:當(dāng)用戶想了解左臂運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬左臂運(yùn)動(dòng)。</p><p> 4) 抬左肘:當(dāng)用戶想了解左肘運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬左肘
6、運(yùn)動(dòng)。</p><p> 5) 抬右臂:當(dāng)用戶想了解右臂的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬右臂運(yùn)動(dòng)。</p><p> 6) 抬右肘:當(dāng)用戶想了解右肘運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬右肘運(yùn)動(dòng)。</p><p> 7) 抬左大腿:當(dāng)用戶想了解左大腿運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬左大腿運(yùn)動(dòng)。</p><p&
7、gt; 8) 抬左小腿:當(dāng)用戶想了解左小腿運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬左小腿運(yùn)動(dòng)。</p><p> 9) 抬右大腿:當(dāng)用戶想了解右大腿運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬右大腿運(yùn)動(dòng)。</p><p> 10) 抬右小腿:當(dāng)用戶想了解右小腿運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬右小腿運(yùn)動(dòng)。</p><p> 11) 旋轉(zhuǎn):
8、當(dāng)用戶想了解旋轉(zhuǎn)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使整個(gè)骨骼做旋轉(zhuǎn)運(yùn)動(dòng)。</p><p> 12) 走步:當(dāng)用戶想了解走步的具體細(xì)節(jié)時(shí),通過(guò)鍵盤操作使骨骼進(jìn)行走步運(yùn)動(dòng)。</p><p> 13) 放大:當(dāng)用戶想了解放大的具體細(xì)節(jié)時(shí),通過(guò)鼠標(biāo)操作來(lái)放大骨骼。</p><p> 2.1.2 側(cè)頂視圖</p><p> 1) 點(diǎn)頭:當(dāng)用戶想了
9、解點(diǎn)頭運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作能使骨骼做點(diǎn)頭動(dòng)作。</p><p> 2) 搖頭:當(dāng)用戶想了解搖頭運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做搖頭運(yùn)動(dòng)。</p><p> 3) 抬左臂:當(dāng)用戶想了解左臂運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬左臂運(yùn)動(dòng)。</p><p> 4) 抬左肘:當(dāng)用戶想了解左肘運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼
10、做抬左肘運(yùn)動(dòng)。</p><p> 5) 抬右臂:當(dāng)用戶想了解右臂運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬右臂運(yùn)動(dòng)。</p><p> 6) 抬右肘:當(dāng)用戶想了解右肘運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬右肘運(yùn)動(dòng)。</p><p> 7) 抬左大腿:當(dāng)用戶想了解左大腿運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬左大腿運(yùn)動(dòng)。</p>
11、<p> 8) 抬左小腿:當(dāng)用戶想了解左小腿運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬左小腿運(yùn)動(dòng)。</p><p> 9) 抬右大腿:當(dāng)用戶想了解右大腿運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬右大腿運(yùn)動(dòng)。</p><p> 10) 抬右小腿:當(dāng)用戶想了解右小腿運(yùn)動(dòng)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使骨骼做抬右小腿運(yùn)動(dòng)。</p><p> 1
12、1) 旋轉(zhuǎn):當(dāng)用戶想了解旋轉(zhuǎn)的具體細(xì)節(jié)時(shí),通過(guò)鍵盤或鼠標(biāo)操作使整個(gè)骨骼做旋轉(zhuǎn)運(yùn)動(dòng)。</p><p> 2.2 性能需求分析</p><p> 正確性:根據(jù)人體骨骼系統(tǒng)的運(yùn)動(dòng)設(shè)計(jì)軟件,運(yùn)動(dòng)中的每一個(gè)操作在系統(tǒng)中都必須有所體現(xiàn),保證程序的正確性。</p><p><b> 3 概要設(shè)計(jì)</b></p><p> 3.
13、1 模型格式選擇</p><p> 保存三維圖形數(shù)據(jù)的方法多種多樣,有參數(shù)曲線法、CSG描述法等等,但常用的保存三維模型的方法是多邊形逼近法,即用許多小多邊形拼出模型的外觀,文件中保存這些多邊形的信息。由于OpenGL中提供了最基本的由多邊形構(gòu)造三維模型的方法,因此從三維圖形數(shù)據(jù)文件中讀取模型數(shù)據(jù)并在OpenGL中繪制就很容易。</p><p> 3ds模型數(shù)據(jù)格式和obj模型數(shù)據(jù)格式
14、都是三維圖形數(shù)據(jù)格式,3ds模型數(shù)據(jù)格式是目前大多數(shù)圖形數(shù)據(jù)素材庫(kù)中保存三維圖形數(shù)據(jù)的最常用格式。3ds文件由許多塊組成,每個(gè)塊首先描述其后的信息類別,即該塊是如何組成的,塊的信息類別是用ID來(lái)標(biāo)識(shí)的,塊還包含了下一個(gè)塊的相對(duì)位置信息,其具體信息附錄A。</p><p> Wavefront 的obj模型文件結(jié)構(gòu)非常簡(jiǎn)單。首先,它是由一些文本行組成的,每一行文本都是由一個(gè)關(guān)鍵字開(kāi)頭,緊跟著后面是該關(guān)鍵字所表示含
15、義的具體參數(shù),obj文件不僅可以定義多邊形模型,也可以定義自由曲面模型。多邊形模型就是可以用點(diǎn)、線、面等基本元素構(gòu)造的模型 ,而自由曲面模型是指使用參數(shù)曲面造型定義的模型。Obj模型數(shù)據(jù)格式的詳細(xì)信息見(jiàn)附錄A。</p><p> 本系統(tǒng)是采取Wavefront的obj格式。 </p><p><b> 3.2 模型選擇</b></p><p&g
16、t; 從Poser 5.0中導(dǎo)出人體骨骼模型,有成人和小孩的骨骼模型,有男性和女性模型。本系統(tǒng)采用的是成人男性的骨骼模型。將其按3ds格式從Poser 5.0中導(dǎo)出,然后通過(guò)三維軟件quick3d將3ds格式轉(zhuǎn)換為obj格式(三維軟件quick3d的介紹和使用方法見(jiàn)附錄B)。</p><p> 3.3 單文檔與控制臺(tái)的選擇</p><p> 用控制臺(tái)來(lái)編程需要使用OpenGL的輔助庫(kù)
17、函數(shù),則其通用性較差且一些控制比較困難。用單文檔則很容易解決這些問(wèn)題。單文檔下的OpenGL編程環(huán)境設(shè)置請(qǐng)見(jiàn)附錄C.</p><p><b> 3.4 菜單設(shè)計(jì)</b></p><p> 菜單設(shè)計(jì)的好壞會(huì)直接影響到用戶操作的難易程度,從而影響到軟件的推廣使用。菜單設(shè)計(jì)的簡(jiǎn)單明了會(huì)受到用戶的歡迎。菜單中包括退出應(yīng)用程序、開(kāi)頭側(cè)頂視圖、點(diǎn)頭、搖頭、抬手、抬腿、旋轉(zhuǎn)等操
18、作。</p><p><b> 3.5 工具欄設(shè)計(jì)</b></p><p> 制作工具欄的目的是:通過(guò)單擊就能訪問(wèn)常用命令,工具欄按鈕是菜單命令的快捷方式,但是它也實(shí)現(xiàn)了菜單中沒(méi)有的命令</p><p><b> 3.6 狀態(tài)欄設(shè)計(jì)</b></p><p> 狀態(tài)欄不僅能顯示菜單操作命令的幫
19、助信息,還可以劃分為一個(gè)或多個(gè)區(qū)域,它們分別對(duì)應(yīng)著窗格、面板或指示符??梢詥为?dú)設(shè)置每個(gè)窗格的文本,這樣,一個(gè)窗格可以顯示文檔的當(dāng)前行、頁(yè)號(hào),可以顯示當(dāng)前Caps Lock和Num Lock的狀態(tài),還可以包含進(jìn)度控件,以顯示如保存、加載文檔等較長(zhǎng)的操作中所完成任務(wù)的比例。</p><p> 3.7 彈出菜單設(shè)計(jì)</p><p> 彈出菜單是主菜單的快捷方式,可以很方便地進(jìn)行操作,包括一些
20、主要操作,如:開(kāi)關(guān)側(cè)頂視圖,播放等操作。</p><p> 3.8 放大方式的選擇</p><p> 是用OpenGL中的選擇與拾取機(jī)制進(jìn)行局部放大,還是用OpenGL中的函數(shù)進(jìn)行全體放大。要使用OpenGL的選擇與拾取機(jī)制,首先要將場(chǎng)景繪制到幀緩存中,然后進(jìn)入選擇模式并重新繪制場(chǎng)景。進(jìn)入選擇模式后,幀緩存的內(nèi)容將不會(huì)發(fā)生變化,直到退出該模式。退出選擇模式時(shí),OpenGL將返回一系列與
21、視景體相交的圖元,與視景體相交的每個(gè)圖元都將導(dǎo)致一次選擇命中。進(jìn)行局部放大時(shí)會(huì)喪失人體骨骼的整體性。進(jìn)行全體放大時(shí),需用到OpenGL中的glScaled()函數(shù),能較好的展示人體骨骼的完整性。</p><p> 本系統(tǒng)采用OpenGL中的glScaled()函數(shù)進(jìn)行全體放大。</p><p> 3.9 人體骨骼的基本控制</p><p> 人體骨骼的基本控制
22、包括點(diǎn)頭、搖頭、抬左手、抬右手、抬左腿、抬右腿等等。</p><p> 3.10 人體骨骼走步運(yùn)動(dòng)</p><p> 當(dāng)進(jìn)入走步模式時(shí),為走步布置場(chǎng)景,并進(jìn)行走步運(yùn)動(dòng)。</p><p><b> 3.11 拖放操作</b></p><p> 按住鼠標(biāo)左鍵不放,拖動(dòng)鼠標(biāo),人體骨骼則隨著鼠標(biāo)的移動(dòng)進(jìn)行相應(yīng)的旋轉(zhuǎn)。 &
23、lt;/p><p><b> 4 詳細(xì)設(shè)計(jì)</b></p><p> 4.1 各個(gè)骨骼部分介紹</p><p> a) 頭骨骼(如圖4.1):</p><p> 左大腿骨骼(如圖4.3)</p><p> 左小腿骨骼(如圖4.4)</p><p> 左腳骨骼(如圖4
24、.5)</p><p> 右大腿骨骼(如圖4.6)</p><p> 右小腿骨骼(如圖4.7)</p><p> 右腳骨骼(如圖4.8)</p><p> 左臂骨骼(如圖4.9)</p><p> 左肘骨骼(如圖4.10)</p><p> 左手骨骼(如圖4.11)</p>
25、;<p> 右臂骨骼(如圖4.12)</p><p> 右肘骨骼(如圖4.13)</p><p> 右手骨骼(如圖4.14)</p><p> 4.2 菜單詳細(xì)設(shè)計(jì)</p><p> 主菜單分為:文件子菜單,控制子菜單,窗口子菜單,幫助子菜單。</p><p> 4.2.1 文件子菜單<
26、/p><p> 文件子菜單有“退出”命令:關(guān)閉應(yīng)用程序并釋放繪圖描述表。</p><p> 4.2.2 控制子菜單</p><p> 控制子菜單由抬手子菜單,抬腿子菜單,頭控制子菜單,旋轉(zhuǎn)子菜單,移動(dòng)子菜單,“播放”命令和“復(fù)原”命令組成。</p><p> a)抬手子菜單由“抬左手”和“抬右手”命令組成。</p><
27、p> “抬左手”:由小鍵盤的數(shù)字鍵1來(lái)控制抬左臂,按一下則左臂向上旋轉(zhuǎn)一度,左肘也向上旋轉(zhuǎn)一度,當(dāng)?shù)竭_(dá)45度時(shí)則從原路逐漸返回到正常狀態(tài)。</p><p> “抬右手”:由小鍵盤的數(shù)字鍵2來(lái)控制抬右臂,按一下則右臂向上旋轉(zhuǎn)一度,左肘也向上旋轉(zhuǎn)一度,當(dāng)?shù)降?5度時(shí)則從原路逐漸返回到正常狀態(tài)。</p><p> b)抬腿子菜單由“抬左腿”和“抬右腿”命令組成。</p>
28、<p> “抬左腿”:由小鍵盤的數(shù)字鍵3來(lái)控制抬左腿,按一下則左大腿向上旋轉(zhuǎn)一度,而左小腿向下旋轉(zhuǎn)一度,當(dāng)達(dá)到45度時(shí)則從原路逐漸返回到正常狀態(tài)。</p><p> “抬右腿”:由小鍵盤的數(shù)字鍵4來(lái)控制抬右腿,按一下則右大腿向上旋轉(zhuǎn)一度,而右小腿向下旋轉(zhuǎn)一度,當(dāng)達(dá)到45度進(jìn)則從原路逐漸返回到正常狀態(tài)。</p><p> c)頭控制子菜單由“點(diǎn)頭”和“搖頭”命令組成。<
29、;/p><p> “點(diǎn)頭”:由小鍵盤的數(shù)字鍵5來(lái)控制點(diǎn)頭,按一下則頭向下旋轉(zhuǎn)一度,當(dāng)?shù)竭_(dá)45度時(shí)則從原路逐漸返回到正常狀態(tài)。</p><p> “搖頭”:由小鍵盤的數(shù)字鍵6來(lái)控制搖頭,按一下則頭向左或向右旋轉(zhuǎn)一度,當(dāng)向左或向右達(dá)45度時(shí)則從原路逐漸返回到正常狀態(tài)。</p><p> d)旋轉(zhuǎn)子菜單由“向左”、“向右”、“向上”和“向下”命令組成。</p>
30、;<p> “向左”:由向左方向鍵控制,按一下則整個(gè)人體骨骼向左旋轉(zhuǎn)一度,為了更好的觀察,沒(méi)有對(duì)此度數(shù)設(shè)限制。</p><p> “向右”:由向右方向鍵控制,按一下則整個(gè)人體骨骼向右旋轉(zhuǎn)一度,為了更好的觀察,沒(méi)有對(duì)此度數(shù)設(shè)限制。</p><p> “向上”:由向上方向鍵控制,按一下則整個(gè)人體骨骼向上旋轉(zhuǎn)一度,為了更好的觀察,沒(méi)有對(duì)此度數(shù)設(shè)限制。</p>&
31、lt;p> e)移動(dòng)子菜單由“向左”、“向右”、“向上”和“向下”命令組成。</p><p> “向左”:由字母“a”或“A”來(lái)控制,按一下則整個(gè)人體骨骼向左平移一段距離,當(dāng)平移到一定程度時(shí),人體骨骼會(huì)從原路逐漸返回到正常狀態(tài)。</p><p> “向右”:由字母“d”或“D“來(lái)控制,按一下則整個(gè)人體骨骼向右平移一段距離,當(dāng)平移到一定程度時(shí),人體骨骼會(huì)從原路逐漸返回到正常狀態(tài)。
32、</p><p> “向上”:由字母“w”或“W”來(lái)控制,按一下則整個(gè)人體骨骼向上平移一段距離,當(dāng)平移到一定程度時(shí),人體骨骼會(huì)從原路逐漸返回到正常狀態(tài)。</p><p> “向下”:由字母“s”或“S”來(lái)控制,按一下則整個(gè)人體骨骼向下平移一段距離,當(dāng)平移到一定程度時(shí),人體骨骼會(huì)從原路逐漸返回到正常狀態(tài)。</p><p> f)“播放”命令:由“p”或“P”來(lái)控
33、制,按一下則啟動(dòng)定時(shí)器進(jìn)行人體骨骼的自動(dòng)旋轉(zhuǎn)運(yùn)動(dòng),再按一下則關(guān)閉定時(shí)器,人體骨骼停止旋轉(zhuǎn)。</p><p> g)“復(fù)原”命令:由“r”或“R”來(lái)控制,按一下則恢復(fù)到剛啟動(dòng)時(shí)的最初狀態(tài)。</p><p> 4.2.3 窗口子菜單:</p><p> 窗口子菜單有“開(kāi)側(cè)頂視圖”命令,點(diǎn)擊一下則打開(kāi)側(cè)視圖,再點(diǎn)擊一下則關(guān)閉側(cè)頂視圖。</p><
34、p> 4.2.4 幫助子菜單</p><p> 幫助子菜單由“操作說(shuō)明”和“關(guān)于畢業(yè)設(shè)計(jì)”命令組成。</p><p> a)“操作說(shuō)明”:介紹了一些基本操作,方便用戶操作。</p><p> b)“關(guān)于畢業(yè)設(shè)計(jì)”:介紹本應(yīng)用程序的一些基本信息。</p><p> 4.3 工具欄詳細(xì)設(shè)計(jì)</p><p>
35、 工具欄主要由兩個(gè)按鈕組成:“播放”和“?”。</p><p> 4.3.1 “播放”命令</p><p> 由“p”或“P”來(lái)控制,按一下則啟動(dòng)定時(shí)器進(jìn)行人體骨骼的自動(dòng)旋轉(zhuǎn)運(yùn)動(dòng),再按一下則關(guān)閉定時(shí)器,人體骨骼停止旋轉(zhuǎn)。</p><p> 4.3.2 “?”命令</p><p> 調(diào)用主菜單的幫助子菜單“操作說(shuō)明”,介紹了一些基本
36、操作,方便用戶使用</p><p> 4.4 狀態(tài)欄詳細(xì)設(shè)計(jì)</p><p> 狀態(tài)欄由三個(gè)窗格組成:顯示常用命令狀態(tài),顯示大小寫(xiě)的狀態(tài),顯示播放狀態(tài)。</p><p> 4.4.1 顯示常用命令狀態(tài)</p><p> 當(dāng)鼠標(biāo)放在所要點(diǎn)擊的命令上時(shí),該窗格會(huì)顯示這個(gè)命令的一些提示信息,用戶根據(jù)這些提示信息能很快地熟悉本系統(tǒng)。</
37、p><p> 4.4.2 顯示大小寫(xiě)狀態(tài)</p><p> 當(dāng)大小寫(xiě)鍵處于開(kāi)的狀態(tài)時(shí),則在該窗格上顯示其狀態(tài);處于關(guān)的狀態(tài)時(shí),則不顯示。</p><p> 4.4.3 顯示播放狀態(tài)</p><p> 當(dāng)處于播放狀態(tài)時(shí),在該窗格顯示其播放狀態(tài);處于暫停狀態(tài)時(shí)則不顯示其狀態(tài)。</p><p> 4.5 彈出菜單詳細(xì)設(shè)
38、計(jì)</p><p> 彈出菜單由一般控制子菜單、開(kāi)關(guān)側(cè)頂視圖子菜單、“復(fù)原”命令和“播放”命令組成。</p><p> 4.5.1 一般控制子菜單</p><p> 一般控制子菜單由抬手子菜單、抬腿子菜單、頭控制子菜單、旋轉(zhuǎn)子菜單和移動(dòng)子菜單組成。</p><p> a) 抬手子菜單由“抬左手”命令、“抬右手”命令組成。</p&
39、gt;<p> a1) “抬左手”命令:由小鍵盤的數(shù)字鍵1來(lái)控制抬左臂,按一下則左臂向上旋轉(zhuǎn)一度,左肘也向上旋轉(zhuǎn)一度,當(dāng)達(dá)到45度時(shí)則從原路逐漸返回。</p><p> a2) “抬右手”命令:由小鍵盤的數(shù)字鍵2來(lái)控制抬右臂,按一下則右臂向上旋轉(zhuǎn)一度,右肘也向上旋轉(zhuǎn)一度,當(dāng)達(dá)到45度時(shí)則從原路逐漸返回。</p><p> b) 抬腿子菜單由“抬左腿”命令、“抬右腿”命令
40、組成。</p><p> b1) “抬左腿”命令:由小鍵盤的數(shù)字鍵3來(lái)控制抬左腿,按一下則左大腿向上旋轉(zhuǎn)度,而左小腿則向下旋轉(zhuǎn)一度,當(dāng)達(dá)到45度時(shí)則從原路逐漸返回。</p><p> b2) “抬右腿”命令:由小鍵盤的數(shù)字鍵4來(lái)控制抬右腿,按一下則右大腿向上旋轉(zhuǎn)一度,而右小腿則向下旋轉(zhuǎn)一度,當(dāng)達(dá)到45度時(shí)則從原路逐漸返回。</p><p> c) 頭控制子菜單
41、由“點(diǎn)頭”命令和“搖頭”組成。</p><p> c1) “點(diǎn)頭”命令:由小鍵盤的數(shù)字鍵5來(lái)控制點(diǎn)頭,按一下則頭向下旋轉(zhuǎn)一度,當(dāng)達(dá)到45度時(shí)則從原路逐漸返回。</p><p> c2) “搖頭”命令:由小鍵盤的數(shù)字鍵6來(lái)控制搖頭,按一下則頭向左或向右旋轉(zhuǎn)一度,當(dāng)向左或向右達(dá)到45度時(shí)則從原路返回。</p><p> d) 旋轉(zhuǎn)子菜單由“向左”命令、“向右”命令
42、、“向上”命令和“向下”命令組成。</p><p> d1) “向左”命令:由向左方向鍵來(lái)控制向左轉(zhuǎn),按一下則人體骨骼以Z軸為對(duì)稱軸向左旋轉(zhuǎn),為了更好的觀察,對(duì)此命令度數(shù)沒(méi)有限制。</p><p> d2) “向右”命令:由向右方向鍵來(lái)控制向右轉(zhuǎn),按一下則人體骨骼以Z軸為對(duì)稱軸向右旋轉(zhuǎn),為了更好的觀察,對(duì)此命令度數(shù)沒(méi)有限制。</p><p> d3) “向上”
43、命令:由向上方向鍵來(lái)控制向上轉(zhuǎn),按一下則人體骨骼以X軸為對(duì)稱軸向上旋轉(zhuǎn),為了更好的觀察,對(duì)此命令度數(shù)沒(méi)有限制。</p><p> d4) “向下”命令:由向下方向鍵來(lái)控制向下轉(zhuǎn),按一下則人體骨骼能X軸為對(duì)稱軸向下旋轉(zhuǎn),為了更好的觀察,對(duì)此命令度數(shù)沒(méi)有限制。</p><p> e) 移動(dòng)子菜單由“向左”命令、“向右”命令、“向上”命令和“向下”命令組成。</p><p
44、> e1) “向左”命令:由“a”或“A”來(lái)控制向左平移,按一下則整個(gè)人體骨骼向左平移一定的距離。當(dāng)?shù)竭_(dá)一定的次數(shù)時(shí),人體骨骼會(huì)恢復(fù)到開(kāi)始狀態(tài)。</p><p> e2) “向右”命令:由“d”或“D”來(lái)控制向右平移,按一下則人體骨骼向右平移一定的距離。當(dāng)?shù)竭^(guò)一定次數(shù)時(shí),人體骨骼會(huì)恢復(fù)到開(kāi)始狀態(tài)。</p><p> e3) “向上”命令:由“w”或“W”來(lái)控制向上平移,按一下則
45、人體骨骼向上平移一定的距離。當(dāng)達(dá)到一定次數(shù)時(shí),人體骨骼會(huì)恢復(fù)到開(kāi)始狀態(tài)。</p><p> e4) “向下”命令:由“s”或“S”來(lái)控制向下平移,按一下則人體骨骼向下平移一定的距離。當(dāng)達(dá)到一定次數(shù)時(shí),人體骨骼會(huì)恢復(fù)到開(kāi)始狀態(tài)。</p><p> 4.5.2 開(kāi)關(guān)側(cè)頂視圖子菜單</p><p> 開(kāi)關(guān)側(cè)頂視圖子菜單由“開(kāi)側(cè)頂視圖”命令和“關(guān)側(cè)頂視圖”命令組成。&
46、lt;/p><p> a) “開(kāi)側(cè)頂視圖”命令:打開(kāi)側(cè)頂視圖,能讓用戶能比較清楚地知道人體骨骼的狀態(tài)。如圖4.15所示。</p><p> b) “關(guān)側(cè)頂視圖”命令:關(guān)閉側(cè)頂視圖,讓用戶能在此視圖下進(jìn)行放大、平移操作,比較直觀。如圖4.16所示。</p><p> 4.5.3 “播放”命令</p><p> 當(dāng)點(diǎn)擊 “播放”命令時(shí),啟動(dòng)定
47、時(shí)器進(jìn)行人體骨骼以Z軸為對(duì)稱軸進(jìn)行旋轉(zhuǎn),產(chǎn)生動(dòng)畫(huà)效果。當(dāng)再次點(diǎn)擊“播放”命令時(shí),關(guān)閉定時(shí)器,人體骨骼停止旋轉(zhuǎn)。</p><p> 4.5.4 “復(fù)原”命令</p><p> 當(dāng)點(diǎn)擊“復(fù)原”命令時(shí),則將人體骨骼模型的狀態(tài)設(shè)為啟動(dòng)的最初狀態(tài)。不會(huì)對(duì)側(cè)頂視圖狀態(tài)產(chǎn)生影響。最初狀態(tài):頭、腿、手、旋轉(zhuǎn)、移動(dòng)等都設(shè)為起始狀態(tài)。</p><p><b> 4.6
48、放大操作</b></p><p> 使用glScaled()對(duì)模型進(jìn)行整體放大,使放大后的模型具有整體感,點(diǎn)擊鼠標(biāo)左鍵一次,整個(gè)模型就在原來(lái)的基礎(chǔ)上放大2倍,當(dāng)放大到8倍后,再將模型還原為起始狀態(tài)。如圖4.17和圖4.18</p><p> 當(dāng)放大后的人體骨骼超出屏幕顯示范圍,可以使用平移來(lái)調(diào)整模型的位置,使用戶清楚地觀察到想要顯示的位置。</p><p
49、> 為了放大后的觀察效果,只能在全景視圖下進(jìn)行放大操作,而不能在側(cè)頂視圖下進(jìn)行放大操作。圖4.19是在全景視圖下的放大圖像;圖4.20是在側(cè)頂視圖下的放大圖像。</p><p> 由上可知在全景視圖下的放大的圖像比較美觀,而在側(cè)頂視圖下的放大的圖像則很不美觀,所以不在側(cè)頂視圖下進(jìn)行放大操作。</p><p> 4.7 全局坐標(biāo)系與局部坐標(biāo)系變換</p><p
50、> 在全局坐標(biāo)系中考慮問(wèn)題,矩陣乘法將以與指定順序相反的順序進(jìn)行。另一種看待矩陣乘法的方法是,將要變換的模型所在的全局坐標(biāo)系拋到一邊,設(shè)想有一個(gè)與要繪制的物體捆綁在一起的局部坐標(biāo)系,所有變換都將導(dǎo)致該坐標(biāo)系發(fā)生變化。采用這種方式看待變換時(shí),代碼中矩陣乘法的順序?qū)⑹亲匀豁樞?。本系統(tǒng)中所采用的是局部坐標(biāo)系的觀點(diǎn)。關(guān)于全局坐標(biāo)系與局部坐標(biāo)系變換的詳細(xì)信息見(jiàn)附錄D。</p><p> 4.8 基本控制的數(shù)據(jù)選擇
51、</p><p> 基本控制的數(shù)據(jù)是從obj文件中搜索出來(lái)的。根據(jù)找出來(lái)的數(shù)據(jù)進(jìn)行控制,有時(shí)并不是很準(zhǔn)確的</p><p> 4.8.1 頭與身體數(shù)據(jù)選擇</p><p> 從頭模型的obj文件中搜索出數(shù)據(jù)是0.603228,這樣可以看出當(dāng)點(diǎn)頭時(shí)明顯發(fā)生了頭骨骼與身體骨骼部分的分離。因?yàn)閺念^骨骼模型中找出來(lái)的數(shù)據(jù)是相對(duì)于頭而言的最小的Z值,而身體骨骼部分最大的
52、Z值是高于頭骨骼的最小的Z值,當(dāng)旋轉(zhuǎn)時(shí)會(huì)以頭的最小的Z值為對(duì)稱軸進(jìn)行旋轉(zhuǎn),從而產(chǎn)生骨骼之間的脫節(jié)。頭與身體之間的接合點(diǎn)是身體的最大的Z值,所以應(yīng)從身體模型的obj文件中搜索最大的Z值(0.619229)。</p><p> 4.8.2 左臂與身體數(shù)據(jù)選擇</p><p> 當(dāng)控制左臂的上抬動(dòng)作時(shí),須找到左臂與身體部分的接合點(diǎn)。從左臂模型的obj文件中搜索出來(lái)的左臂的最大的Z值為0.56
53、3242,當(dāng)以此數(shù)據(jù)來(lái)控制左臂的運(yùn)動(dòng)時(shí),會(huì)使左臂與身體之間發(fā)生脫離。這是因?yàn)樽蟊勰P偷淖畲骦值不是左臂旋轉(zhuǎn)的數(shù)據(jù)。經(jīng)過(guò)不斷的測(cè)試,得到旋轉(zhuǎn)的接近的Z值為0.5575,當(dāng)以此數(shù)據(jù)來(lái)控制左臂的旋轉(zhuǎn)還不能產(chǎn)生令人滿意的結(jié)果。這是因?yàn)樵赮方向上產(chǎn)生的偏移導(dǎo)致骨骼運(yùn)動(dòng)脫節(jié),經(jīng)不斷測(cè)試,得出Y值為0.05時(shí),能產(chǎn)生較為滿意的結(jié)果。</p><p> 4.8.3 左肘與左臂數(shù)據(jù)選擇</p><p>
54、 當(dāng)控制左肘的上抬運(yùn)動(dòng)時(shí),須找到左肘與左臂的接合部分的數(shù)據(jù),從左肘模型的obj文件中搜索出的左肘的最大的Z值為0.481069, 當(dāng)以此數(shù)據(jù)來(lái)控制左肘的運(yùn)動(dòng)時(shí),會(huì)使左肘與左臂之間發(fā)生脫離。這是因?yàn)樽笾饽P偷淖畲骦值不是左肘旋轉(zhuǎn)的數(shù)據(jù)。經(jīng)過(guò)不斷的測(cè)試,得到旋轉(zhuǎn)的接近的Z值為0.5575,當(dāng)以此數(shù)據(jù)來(lái)控制左肘的旋轉(zhuǎn)還不能產(chǎn)生令人滿意的結(jié)果。這是因?yàn)樵赮方向上產(chǎn)生的偏移導(dǎo)致骨骼運(yùn)動(dòng)脫節(jié),經(jīng)不斷測(cè)試,得出Y值為0.05時(shí),能產(chǎn)生較為滿意的結(jié)果。
55、</p><p> 4.8.4 右臂與身體數(shù)據(jù)選擇</p><p> 當(dāng)控制右臂的上抬動(dòng)作時(shí),須找到右臂與身體部分的接合點(diǎn)。從右臂模型的obj文件中搜索出來(lái)的右臂的最大的Z值為0.563242,當(dāng)以此數(shù)據(jù)來(lái)控制右臂的運(yùn)動(dòng)時(shí),會(huì)使右臂與身體之間發(fā)生脫離。這是因?yàn)橛冶勰P偷淖畲骦值不是右臂旋轉(zhuǎn)的數(shù)據(jù)。經(jīng)過(guò)不斷的測(cè)試,得到旋轉(zhuǎn)的接近的Z值為0.5575,當(dāng)以此數(shù)據(jù)來(lái)控制右臂的旋轉(zhuǎn)還不能產(chǎn)生令
56、人滿意的結(jié)果。這是因?yàn)樵赮方向上產(chǎn)生的偏移導(dǎo)致骨骼運(yùn)動(dòng)脫節(jié),經(jīng)不斷測(cè)試,得出Y值為0.05時(shí),能產(chǎn)生較為滿意的結(jié)果。</p><p> 4.8.5 右肘與右臂數(shù)據(jù)選擇</p><p> 當(dāng)控制右肘的上抬運(yùn)動(dòng)時(shí),須找到右肘與右臂的接合部分的數(shù)據(jù),從右肘模型的obj文件中搜索出的右肘的最大的Z值為0.481069, 當(dāng)以此數(shù)據(jù)來(lái)控制右肘的運(yùn)動(dòng)時(shí),會(huì)使右肘與右臂之間發(fā)生脫離。這是因?yàn)橛抑饽P?/p>
57、的最大Z值不是右肘旋轉(zhuǎn)的數(shù)據(jù)。經(jīng)過(guò)不斷的測(cè)試,得到旋轉(zhuǎn)的接近的Z值為0.5575,當(dāng)以此數(shù)據(jù)來(lái)控制右肘的旋轉(zhuǎn)還不能產(chǎn)生令人滿意的結(jié)果。這是因?yàn)樵赮方向上產(chǎn)生的偏移導(dǎo)致骨骼運(yùn)動(dòng)脫節(jié),經(jīng)不斷測(cè)試,得出Y值為0.05時(shí),能產(chǎn)生較為滿意的結(jié)果。</p><p> 4.8.6 左大腿與身體數(shù)據(jù)選擇</p><p> 當(dāng)控制左大腿的上抬動(dòng)作時(shí),須找到左大腿與身體部分的接合點(diǎn)。從左大腿模型的obj文
58、件中搜索出來(lái)的左大腿的最大的Z值為0.377953,當(dāng)以此數(shù)據(jù)來(lái)控制左大腿的運(yùn)動(dòng)時(shí),會(huì)使左大腿與身體之間發(fā)生脫離。這是因?yàn)樵赬方向上產(chǎn)生的偏移導(dǎo)致骨骼運(yùn)動(dòng)脫節(jié),經(jīng)不斷測(cè)試,得出X值為0.12時(shí),能產(chǎn)生較為滿意的結(jié)果。</p><p> 4.8.7 左小腿與左大腿數(shù)據(jù)選擇</p><p> 當(dāng)控制左小腿的上抬動(dòng)作時(shí),須找到左小腿與左大腿部分的接合點(diǎn)。從左小腿模型的obj文件中搜索出來(lái)的左
59、小腿的最大的Z值為0.200885,當(dāng)以此數(shù)據(jù)來(lái)控制左大腿的運(yùn)動(dòng)時(shí),會(huì)使左小腿與左大腿之間發(fā)生脫離。這是因?yàn)樵赬方向上產(chǎn)生的偏移導(dǎo)致骨骼運(yùn)動(dòng)脫節(jié),經(jīng)不斷測(cè)試,得出X值為-0.164時(shí),能產(chǎn)生較為滿意的結(jié)果。</p><p> 4.8.8 右大腿與身體數(shù)據(jù)選擇</p><p> 當(dāng)控制右大腿的上抬動(dòng)作時(shí),須找到右大腿與身體部分的接合點(diǎn)。從右大腿模型的obj文件中搜索出來(lái)的右大腿的最大的Z
60、值為0.377953,當(dāng)以此數(shù)據(jù)來(lái)控制右大腿的運(yùn)動(dòng)時(shí),會(huì)使右大腿與身體之間發(fā)生脫離。這是因?yàn)樵赬方向上產(chǎn)生的偏移導(dǎo)致骨骼運(yùn)動(dòng)脫節(jié),經(jīng)不斷測(cè)試,得出X值為0.12時(shí),能產(chǎn)生較為滿意的結(jié)果。</p><p> 4.8.9 右小腿與右大腿數(shù)據(jù)選擇</p><p> 當(dāng)控制右小腿的上抬動(dòng)作時(shí),須找到右小腿與右大腿部分的接合點(diǎn)。從右小腿模型的obj文件中搜索出來(lái)的右小腿的最大的Z值為0.2008
61、85,當(dāng)以此數(shù)據(jù)來(lái)控制右大腿的運(yùn)動(dòng)時(shí),會(huì)使右小腿和右大腿之間發(fā)生脫離。這是因?yàn)樵赬方向上產(chǎn)生的偏移導(dǎo)致骨骼運(yùn)動(dòng)脫節(jié),經(jīng)不斷測(cè)試,得出X值為-0.164時(shí),能產(chǎn)生較為滿意的結(jié)果。</p><p> 4.9 走步運(yùn)動(dòng)的詳細(xì)設(shè)計(jì)</p><p> 通過(guò)走步運(yùn)動(dòng)方案的設(shè)計(jì),能更好地展示人體骨骼之間的協(xié)調(diào)性。</p><p> 4.9.1 走步運(yùn)動(dòng)場(chǎng)景的設(shè)置</p
62、><p> 當(dāng)選擇進(jìn)入走步運(yùn)動(dòng)時(shí),就會(huì)在屏幕上顯示一條道路,以藍(lán)色為路面的顏色。該路是一個(gè)矩形進(jìn)行適當(dāng)?shù)男D(zhuǎn)繪制而成的。為路設(shè)置一個(gè)無(wú)窮遠(yuǎn)的光源,使走步時(shí)更具有真實(shí)感。</p><p> 4.9.2 走步運(yùn)動(dòng)控制</p><p> 本系統(tǒng)模仿的是正常人的走路:左臂向前擺動(dòng)時(shí),右臂向后擺動(dòng),左腿向后擺動(dòng),右腿向前擺動(dòng);左臂向后擺動(dòng)時(shí),右臂向前擺動(dòng),左腿向前擺動(dòng),右腿
63、向后擺動(dòng)。</p><p> a) 左臂擺動(dòng):左臂擺動(dòng)時(shí),左臂的旋轉(zhuǎn)幅度一般不大于左肘的旋轉(zhuǎn)角度且左臂與豎直向下的方向的夾角不能大于45度。向前擺動(dòng)時(shí),左臂與左肘的夾角度數(shù)不能低于120度;向后擺動(dòng)時(shí),左臂與左肘的夾角度數(shù)不能高于180度。</p><p> b) 右臂擺動(dòng):右臂擺動(dòng)時(shí),右臂的旋轉(zhuǎn)幅度一般不大于右肘的旋轉(zhuǎn)角度且右臂與豎直向下的方向的夾角不能大于45度。向前擺動(dòng)時(shí),右臂與
64、右肘的夾角度數(shù)不能低于120度;向后擺動(dòng)時(shí),右臂與右肘的夾角度數(shù)不能高于180度。</p><p> c) 左腿擺動(dòng):左腿擺動(dòng)時(shí),左大腿與豎直向下的方向的夾角不能大于45度。向前擺動(dòng)時(shí),左大腿與左小腿的夾角不能低于240度、高于270度;向后擺動(dòng)時(shí),左大腿與左小腿的夾角不能低于180度。</p><p> d) 右腿擺動(dòng):右腿擺動(dòng)時(shí),右大腿與豎直向下的方向的夾角不能大于45度。向前擺動(dòng)
65、時(shí),右大腿與右小腿的夾角不能低于240度、高于270度;向后擺動(dòng)時(shí),右大腿與右小腿的夾角不能低于180度。</p><p> 走步運(yùn)動(dòng)控制的關(guān)鍵在于協(xié)調(diào)各骨骼關(guān)節(jié)之間的運(yùn)動(dòng)關(guān)系,控制好骨骼運(yùn)動(dòng)的角度。</p><p> 4.10 拖放操作詳細(xì)設(shè)計(jì)</p><p> 在正常模式下,按下鼠標(biāo)左鍵并拖動(dòng),人體骨骼會(huì)根據(jù)鼠標(biāo)移動(dòng)的位移進(jìn)行相應(yīng)的旋轉(zhuǎn);在放大模式下,當(dāng)人
66、體骨骼處于起始狀態(tài)時(shí),點(diǎn)擊字母“l(fā)”或“L”進(jìn)入拖放操作。</p><p> 當(dāng)按下鼠標(biāo)左鍵時(shí)發(fā)送WM_MOUSEDOWN消息,并記錄下鼠標(biāo)此時(shí)的位置。移動(dòng)鼠標(biāo)時(shí)發(fā)送WM_MOUSEMOVE消息,用鼠標(biāo)移動(dòng)后的位置與左鍵按下時(shí)的位置相減,得到移動(dòng)前后的偏移量,再用此偏移量除以一個(gè)合適的數(shù)就得到人體骨骼模型所要旋轉(zhuǎn)的角度。當(dāng)左鍵抬起時(shí),清除鼠標(biāo)位置,為下一次的拖放操作做準(zhǔn)備。記錄鼠標(biāo)位置與開(kāi)始按下時(shí)的位置進(jìn)行相應(yīng)
67、變換就可得到人體骨骼的旋轉(zhuǎn)角度。</p><p><b> 5 編碼</b></p><p> 編碼是根據(jù)詳細(xì)設(shè)計(jì)階段得到的流程圖進(jìn)行的代碼書(shū)寫(xiě),編碼以部分界面的部分控件為例解釋代碼的設(shè)計(jì)時(shí)需要考慮的因素和設(shè)計(jì)思路以及設(shè)計(jì)方法。</p><p> 部分代碼及解釋如下:</p><p> 5.1 設(shè)置像素格式&l
68、t;/p><p> 要想在MFC的DC上繪圖,必須為其設(shè)置正確的像素格式,其部分代碼如下:</p><p> int m_PixelFormat;</p><p> m_PixelFormat = ::ChoosePixelFormat( m_hDC, &pfd ); </p><p> 為DC選擇用戶自己設(shè)置的pfd的像素格式,
69、其中參數(shù)m_hDC為DC的句柄,pfd為PIXELFORMATDESCRIPTOR的對(duì)象。</p><p> SetPixelFormat(m_hDC, m_PixelFormat, &pfd );</p><p> 為設(shè)備描述表設(shè)置所選擇的像素格式,為以下正確的創(chuàng)建繪圖準(zhǔn)備好必須的條件。</p><p> 5.2 創(chuàng)建繪圖描述表</p>
70、<p> m_hRC = ::wglCreateContext( m_hDC );</p><p> 在設(shè)備描述表上創(chuàng)建繪圖描述表。m_hRC是繪圖描述表的句柄。</p><p> if( m_hRC == NULL )</p><p> return false;</p><p> 判斷繪圖描述表是否創(chuàng)建成功,如果不成
71、功,則返回false;</p><p> if( wglMakeCurrent( m_hDC, m_hRC )==false)</p><p> return false;</p><p> 將繪圖描述表與設(shè)備描述表關(guān)聯(lián)起來(lái),如果關(guān)聯(lián)不成功,則返回false;</p><p> 5.3 清除窗口閃爍問(wèn)題</p><
72、p> OpenGL有自己刷新背景的函數(shù)glClear(),故而應(yīng)禁止Windows刷新窗口背景。否則,當(dāng)窗口需要重畫(huà)時(shí),Windows會(huì)自動(dòng)先發(fā)送WM_ERASEBKGND,而缺省的處理函數(shù)使用白色的背景刷。當(dāng)OpenGL使用的背景顏色不是白色時(shí),作圖時(shí)有一幀白色的閃爍。這種現(xiàn)象在自動(dòng)旋轉(zhuǎn)時(shí)特別明顯。</p><p> 5.4 銷毀函數(shù)程序</p><p> 有了創(chuàng)建事件服務(wù)程
73、序,就應(yīng)該有銷毀函數(shù)服務(wù)程序。在銷毀函數(shù)中,將在創(chuàng)建函數(shù)中建立的像素格式和繪圖描述表全部釋放。程序部分代碼如下:</p><p> if( wglGetCurrentContext() != NULL )</p><p> wglMakeCurrent( NULL, NULL );</p><p> 判斷當(dāng)前繪圖描述表是否為空,如果不為空,則清除當(dāng)前繪圖描述表
74、。</p><p> if( m_hRC )</p><p><b> ?。?lt;/b></p><p> wglDeleteContext( m_hRC );</p><p> m_hRC = NULL;</p><p><b> ?。?lt;/b></p>&l
75、t;p> 判斷繪圖描述表是否為空,如果不為空,則刪除繪圖描述表并將繪圖描述表句柄清空。</p><p> 5.5 窗口大小改變事件響應(yīng)函數(shù)</p><p> 當(dāng)窗口大小改變時(shí)會(huì)調(diào)用窗口大小改變事件消息,窗口大小改變事件消息對(duì)應(yīng)窗口大小改變事件響應(yīng)函數(shù)。在窗口大小改變事件響應(yīng)函數(shù)中設(shè)置視口和投影矩陣,程序的部分代碼如下:</p><p> glViewp
76、ort( 0, 0, cx, cy );</p><p> 設(shè)置視區(qū)矩形,視區(qū)的左下角的坐標(biāo)為(0,0),cx、cy分別為窗口的寬度和高度。視區(qū)的寬高比等于取景體積的寬高比。</p><p> glMatrixMode( GL_PROJECTION );</p><p> glLoadIdentity();</p><p> 進(jìn)入投影
77、模式,將當(dāng)前矩陣設(shè)為投影矩陣,使OpenGL函數(shù)影響投影矩陣,將當(dāng)前矩陣清空,消除以前投影變換所產(chǎn)生的影響。</p><p> if( w <= h )</p><p> glOrtho( -1.5, 1.5, -1.5*(GLdouble)h/(GLdouble)w, 1.5*(GLdouble)h/(GLdouble)w, -10.0, 10.0 );</p>
78、<p><b> else</b></p><p> glOrtho( -1.5*(GLdouble)w/(GLdouble)h, 1.5*(GLdouble)w/(GLdouble)h, -1.5, 1.5, -10.0, 10.0 );</p><p> 判斷視區(qū)的寬高比,根據(jù)寬度比來(lái)設(shè)置正交平行取景體積,由正交平行取景體積來(lái)創(chuàng)建一個(gè)矩陣</
79、p><p> glMatrixMode( GL_MODELVIEW );</p><p> glLoadIdentity();</p><p> 進(jìn)入視圖模式,將當(dāng)前矩陣設(shè)為視圖矩陣,使OpenGL函數(shù)影響視圖矩陣,將當(dāng)前矩陣清空,消除以前視圖變換所產(chǎn)生的影響。</p><p><b> 5.6 創(chuàng)建工具欄</b>&
80、lt;/p><p> 在CMainFrame類的OnCreate函數(shù)中創(chuàng)建工具欄,具體代碼如下;</p><p> if( !m_wndToolBar.Create( this ) )</p><p><b> {</b></p><p> TRACE( "FAILED TO CREATE THIS&quo
81、t; );</p><p> return -1;</p><p><b> }</b></p><p> m_wndToolBar是一個(gè)工具欄句柄,如果創(chuàng)建不成功,則提示錯(cuò)誤信息。</p><p> m_wndToolBar.LoadToolBar( IDR_TOOLBAR1 );</p>&l
82、t;p> 載入工具欄資源IDR_TOOLBAR1。</p><p> m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY );</p><p> EnableDocking( CBRS_ALIGN_ANY );</p><p> FloatControlBar( &m_wndToolBar, CPoint(
83、100, 100 ));</p><p> DockControlBar( &m_wndToolBar );</p><p> 設(shè)置工具欄的懸浮狀態(tài)和大小。</p><p><b> 5.7 創(chuàng)建狀態(tài)欄</b></p><p> 在CMainFrame類的OnCreate()函數(shù)中創(chuàng)建狀態(tài)欄,部分代碼如下
84、:</p><p> if( !m_wndStatusBar.Create( this) )</p><p><b> {</b></p><p> TRACE0( "failed to create status bar" );</p><p> return -1;</p>
85、<p><b> }</b></p><p> m_wndStatusBar是狀態(tài)欄的句柄,如果創(chuàng)建不成功,則提示錯(cuò)誤信息。</p><p> m_wndStatusBar.SetIndicators(indicators,</p><p> sizeof( indicators)/sizeof( UINT ));</p
86、><p> 設(shè)置狀態(tài)欄的窗格數(shù)以及一些狀態(tài)。</p><p> m_wndStatusBar.MoveWindow( 0, rect.bottom-20, rect.right, 20 );</p><p> 將狀態(tài)欄放于窗口的底部。</p><p> 5.8 側(cè)頂視圖實(shí)現(xiàn)</p><p> glEnable(
87、GL_SCISSOR_TEST );</p><p> 啟用裁剪測(cè)試,允許對(duì)繪圖區(qū)進(jìn)行裁剪。</p><p> glScissor( 0, 0, w/2, h );</p><p> 設(shè)置裁剪后的繪圖區(qū)的大小為整個(gè)繪圖區(qū)的左半部分。</p><p> glClearColor( 0.0, 0.0, 0.0, 1.0 );</p&
88、gt;<p> glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );</p><p> 用當(dāng)前的清除色和深度值來(lái)清除繪圖區(qū)的顏色緩存和深度緩存。</p><p> glDisable( GL_SCISSOR_TEST );</p><p><b> 禁用裁剪測(cè)試。</b>
89、;</p><p> glViewport( 0, 0, w/2, h );</p><p> 設(shè)置裁剪后的視口大小。</p><p> glMatrixMode( GL_PROJECTION );</p><p> glLoadIdentity();</p><p> 進(jìn)入投影模式,將當(dāng)前矩陣設(shè)為投影矩陣,
90、使OpenGL函數(shù)影響投影矩陣,將當(dāng)前矩陣清空,消除以前投影變換所產(chǎn)生的影響。</p><p> if( (w/2) <= h )</p><p><b> {</b></p><p> glOrtho(-1.5,1.5,-1.5*(GLdouble)h/(GLdouble)(w/2), 1.5*(GLdouble)h/(GLdou
91、ble)(w/2), -10.0, 10.0 );</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> glOrtho(-1.5*(GLdouble)(w/2)/(GLdouble)h
92、,1.5*(GLdouble)(w/2)</p><p> /(GLdouble)h, -1.5, 1.5, -10.0, 10.0 );</p><p><b> }</b></p><p> 判斷視區(qū)的寬高比,根據(jù)寬度比來(lái)設(shè)置正交平行取景體積,由正交平行取景體積來(lái)創(chuàng)建一個(gè)矩陣</p><p> glMatri
93、xMode( GL_MODELVIEW );</p><p> glLoadIdentity();</p><p> 進(jìn)入視圖模式,將當(dāng)前矩陣設(shè)為視圖矩陣,使OpenGL函數(shù)影響視圖矩陣,將當(dāng)前矩陣清空,消除以前視圖變換所產(chǎn)生的影響。</p><p><b> 5.9 定時(shí)器</b></p><p> 定時(shí)器是每
94、隔一段時(shí)間發(fā)送WM_TIMER消息,部分代碼如下:</p><p> SetTimer( 1, 500, NULL );</p><p> 每隔500毫秒發(fā)送WM_TIMER消息。</p><p> KillTimer( 1 );</p><p> 取消定時(shí)器定時(shí)發(fā)送WM_TIMER消息。</p><p>
95、switch( nIDEvent )</p><p><b> {</b></p><p> case 0:break;</p><p> case 1:rotate_left_right +=1;</p><p> Invalidate();</p><p><b> b
96、reak;</b></p><p> default: {}</p><p><b> }</b></p><p> CView::OnTimer(nIDEvent);</p><p> WM_TIMER消息所對(duì)應(yīng)的消息響應(yīng)函數(shù),當(dāng)有WM_TIMER消息時(shí),就會(huì)調(diào)用該代碼執(zhí)行以Z軸為對(duì)稱軸的旋轉(zhuǎn)運(yùn)動(dòng)。
97、</p><p><b> 6 測(cè)試</b></p><p><b> 6.1 測(cè)試目的</b></p><p> 軟件測(cè)試是軟件代碼生成后必不可少的一步,測(cè)試的目的是盡可能多的發(fā)現(xiàn)程序中的錯(cuò)誤,通過(guò)測(cè)試使軟件的錯(cuò)誤減少,使系統(tǒng)的可靠性進(jìn)一步提高。</p><p><b> 6.2
98、 軟件測(cè)試</b></p><p> 6.2.1 測(cè)試程序的正確運(yùn)行。</p><p> 程序運(yùn)行以來(lái)至今未出現(xiàn)令整個(gè)系統(tǒng)崩潰的致命錯(cuò)誤,一切運(yùn)行正常。</p><p> 6.2.2 快捷鍵是否沖突</p><p> 經(jīng)測(cè)試至今未發(fā)現(xiàn)快捷鍵有沖突。 </p><p> 6.2.3 前后狀態(tài)的一致性
99、。</p><p> 在全景視圖下放大后的模型是否影響到到側(cè)頂視圖下的模型。正常情況下,在全景視圖下放大后的模型不影響側(cè)頂視圖下的模型。經(jīng)測(cè)試,在全景視圖下放大后的模型不影響側(cè)頂視圖下的模型。</p><p> 在一般模式和放大模式下,放大操作、抬手、抬腿、點(diǎn)頭、搖頭、旋轉(zhuǎn)是否影響到走步模式下人體骨骼模型狀態(tài)。經(jīng)測(cè)試,在一般模式和放大模式下,放大操作、抬手、抬腿、點(diǎn)頭、搖頭、旋轉(zhuǎn)不影響
100、到走步模式下人體骨骼模型狀態(tài)。</p><p> 在走步模式下,走步運(yùn)動(dòng)的操作是否影響到一般模式和放大模式下的人體骨骼模型狀態(tài),經(jīng)測(cè)試,在走步模式下的走步運(yùn)動(dòng)不影響一般模式和放大模式下的人體骨骼模型狀態(tài)。</p><p><b> 結(jié) 論</b></p><p> 設(shè)計(jì)是針對(duì)醫(yī)學(xué)應(yīng)用和實(shí)踐教學(xué)上人體骨骼的仿真運(yùn)動(dòng)而提出的。在醫(yī)學(xué)應(yīng)用上,
101、人體骨骼的仿真運(yùn)動(dòng)能有效地增進(jìn)醫(yī)生和病人的溝通,醫(yī)生可以快速方便的向病人介紹病情,病人可以快速的了解自己的病情;在實(shí)踐教學(xué)中,人體骨骼的仿真運(yùn)動(dòng)能較好的體現(xiàn)骨骼關(guān)節(jié)之間的運(yùn)動(dòng)關(guān)系,教師可以清楚的向?qū)W生講解人體骨骼的組成,學(xué)生可以快速的對(duì)骨骼的組成有一個(gè)清晰的了解,提高教學(xué)效果。</p><p> 以當(dāng)今流行的Microsoft Visual C++為構(gòu)建人體三維骨骼運(yùn)動(dòng)的編程平臺(tái);以當(dāng)今流行的三維圖形標(biāo)準(zhǔn)Ope
102、nGL為人體三維骨骼運(yùn)動(dòng)的應(yīng)用程序接口。對(duì)使用OpenGL來(lái)控制人體骨骼的點(diǎn)頭、搖頭、抬手、抬腿、旋轉(zhuǎn)、放大、走步等,特別是走步運(yùn)動(dòng),能較好的展示人體骨骼之間的協(xié)調(diào)性</p><p> 軟件在編制過(guò)程中以軟件工程理論為指導(dǎo),以客戶需求為目的,滿足了用戶在質(zhì)量上的要求。但系統(tǒng)中仍有不足,如界面美化不夠,用戶接口及系統(tǒng)靈活性等方面還有待在以后的運(yùn)行維護(hù)中進(jìn)一步改進(jìn)。當(dāng)然,由于個(gè)人的能力及時(shí)間等因素的制約,其中可能還
103、存在許多沒(méi)有發(fā)現(xiàn)的缺陷,還望更多的老師和同學(xué)們給本系統(tǒng)提出寶貴的意見(jiàn)!</p><p><b> 致 謝</b></p><p> 本系統(tǒng)在制作過(guò)程中遇到不少困難,在此要感謝我的搭檔xx,感謝他在在整個(gè)軟件設(shè)計(jì)過(guò)程中對(duì)系統(tǒng)實(shí)現(xiàn)方法和思路和我一起討論,給予了我很大的幫助,再次對(duì)郁其雨表示誠(chéng)摯的感謝。</p><p> 感謝我的指導(dǎo)老師xx
104、老師,感謝他在設(shè)計(jì)過(guò)程中給我提出的許多寶貴意見(jiàn)。感謝趙建洋老師對(duì)我的設(shè)計(jì)一直都很關(guān)心,提出了許多寶貴意見(jiàn),那些知識(shí)是我平時(shí)學(xué)不到的。在軟件的測(cè)試過(guò)程中,xx老師要求軟件要經(jīng)過(guò)不斷的測(cè)試,不斷的發(fā)現(xiàn)問(wèn)題,研究問(wèn)題,然后解決問(wèn)題,做到精益求精,這種嚴(yán)謹(jǐn)?shù)目蒲袘B(tài)度讓我受益終身,對(duì)我以后的工作和學(xué)習(xí)都有很大的指導(dǎo)意義,在此向xx老師表示衷心的感謝!</p><p> 在整個(gè)畢業(yè)設(shè)計(jì)過(guò)程中,我用到了許多知識(shí)和方法,有課堂
105、上學(xué)到的和生活中學(xué)到的,因此,我還要感謝所有教過(guò)我、關(guān)心我、幫助過(guò)我的老師及系領(lǐng)導(dǎo),也感謝一直在我身邊支持我、鼓勵(lì)我的朋友和同學(xué)們!</p><p><b> 參 考 文 獻(xiàn)</b></p><p> 1 OpenGL Architecture Review Board.OpenGL參考手冊(cè).北京:機(jī)械工業(yè)出版社,2001.1</p><p&
106、gt; 2 OpenGL體系結(jié)構(gòu)審核委員會(huì).OpenGL編程指南.北京:人民郵電出版社,2005.4</p><p> 3 孫波.OpenGL編程實(shí)例學(xué)習(xí)教程.北京:北京大學(xué)出版社,2000.12</p><p> 4 彭曉明,王堅(jiān).OpenGL深入編程與實(shí)例揭秘.北京:人民郵電出版社,1999.6</p><p> 5 和平鴿工作室.OpenGL高級(jí)編
107、程與可視化系統(tǒng)開(kāi)發(fā).高級(jí)編程篇.北京:中國(guó)水利水電出版社,2003.1</p><p> 6 Steve Holzner.Visual C++ 6.0高級(jí)編程.北京:人民郵電出版社,2000.2</p><p> 7 尹立民,王興東.Visual C++ 6.0應(yīng)用編程150例.北京:北京電子工業(yè)出版社,2004.3</p><p> 8 官章全,韓云君,李罡
108、.Visual C++ 6.0高級(jí)編程范例.北京:北京電子工業(yè)出版社,2001.1</p><p> 9 官章全,劉加明.Visual C++ 6.0類庫(kù)大全.北京:北京電子工業(yè)出版社,1999.12</p><p> 10 費(fèi)廣正,喬林.Visual C++ 6.0高級(jí)編程技術(shù).OpenGL篇.北京:中國(guó)鐵道出版社,2000.9</p><p> 11 李穎
109、,薛海斌,朱伯立,朱仲立.OpenGL技術(shù)應(yīng)用實(shí)例精粹.北京:國(guó)防工業(yè)出版社,2001.1</p><p> 12 李鑫,白雪.Visual C++ 6.0編程基礎(chǔ)與范例.北京:北京電子工業(yè)出版社,2000.5</p><p> 13 林銳,顧曉剛,謝義軍.高質(zhì)量程序設(shè)計(jì)指南.C/C++語(yǔ)言.北京:北京電子工業(yè)出版社,2002.6</p><p> 14 唐克
110、.MFC程序設(shè)計(jì).Using Visual C++ 6.0.北京希望電子出版社,2002.6</p><p> 15 周鳴揚(yáng).Visual C++界面編程技術(shù).北京:希望電子出版社,2003.2</p><p> 附錄A obj文件格式和3DS文件格式的介紹</p><p> A1 obj文件格式</p><p> Wavefront
111、的.obj模型文件結(jié)構(gòu)非常簡(jiǎn)單。首先,它是由一些文本行組成的,每一行文本都是由一個(gè)關(guān)鍵字開(kāi)頭,緊跟著后面是該關(guān)鍵字所表示含義的具體參數(shù),例如以“v”開(kāi)頭表示該行將描述一個(gè)頂點(diǎn)信息,那么后面一定將跟著三個(gè)double型字符串,分別用于描述該頂點(diǎn)的三維坐標(biāo)。</p><p> .obj文件不僅可以定義多邊形模型,也可以定義自由曲面模型。多邊形模型就是可以用點(diǎn)、線、面等基本元素構(gòu)造的模型,而自由曲面模型是指使用參數(shù)曲
112、面造型定義的模型。</p><p> 表A1中給出了.obj文件中最常用的一些關(guān)鍵字及其所表示的含義。</p><p> 表A1 Wavefront關(guān)鍵字取值及其含義</p><p> 簡(jiǎn)要說(shuō)明它們的定義語(yǔ)法。</p><p> 頂點(diǎn)的定義語(yǔ)法如:v x y z w 其中v表示頂點(diǎn)幾何坐標(biāo)關(guān)鍵字,x,y,z分別表示頂點(diǎn)位置的三維坐標(biāo),
113、它們都取float型值。w是一個(gè)齊次坐標(biāo),一般情況下可以缺省,缺省值為1.0。</p><p> 法向量的定義方法如:vn i j k vn主要影響繪制幾何場(chǎng)景時(shí)的smooth-shading等效果。對(duì)于多邊形模型,我們一般指定頂點(diǎn)法向量,而不是面法向量。面中法向量就是在幾個(gè)頂點(diǎn)之間插值。</p><p> 紋理坐標(biāo)的定義語(yǔ)法如:vt u v w 用于定義的紋理坐標(biāo),其中一維紋理坐標(biāo)
114、僅使用u坐標(biāo),二維紋理使用u、v兩個(gè)坐標(biāo),三維紋理則使用所有三個(gè)坐標(biāo)。其中u代表橫向紋理,v代表垂直方向紋理,w是一個(gè)可選項(xiàng),可用于表示紋理的深度,缺省值為0。</p><p> 定義一個(gè)多邊形的語(yǔ)法如:f v/vt/vn v/vt/vn v/vt/vn... ...表示可以定義任意多邊形。</p><p> A2 3DS文件格式</p><p> A2.1
115、3DS文件格式總覽</p><p> 3DS文件由許多塊組成,每個(gè)塊首先描述其后的信息類別,即該塊是如何組成的,塊的信息類別是用ID來(lái)標(biāo)識(shí)的,塊還包含了下一個(gè)塊的相對(duì)位置信息。3DS二進(jìn)制文件中的數(shù)據(jù)也是按低位在前高位在后的組織的。</p><p> 塊的具體定義:塊的前兩項(xiàng)信息分別是:塊的ID和塊的長(zhǎng)度,塊的ID是一個(gè)整形數(shù),而塊的長(zhǎng)度是一個(gè)長(zhǎng)整形數(shù)。每個(gè)塊實(shí)際上是一個(gè)層次結(jié)構(gòu),不同
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 三維仿真制作畢業(yè)論文
- 三維發(fā)型仿真-畢業(yè)論文
- 臺(tái)式虎鉗的三維實(shí)體設(shè)計(jì)及運(yùn)動(dòng)仿真畢業(yè)論文
- 人體運(yùn)動(dòng)三維仿真與分析系統(tǒng).pdf
- 三維人體骨骼運(yùn)動(dòng)數(shù)據(jù)編輯與生成方法研究.pdf
- 三維角色動(dòng)畫(huà)中人體骨骼的運(yùn)動(dòng)控制研究.pdf
- 三維動(dòng)畫(huà)制作中的骨骼綁定研究---畢業(yè)論文
- 鼠標(biāo)三維造型與加工仿真-畢業(yè)論文
- 畢業(yè)論文——鼠標(biāo)三維造型與加工仿真
- 基于骨骼運(yùn)動(dòng)數(shù)據(jù)的三維人體動(dòng)畫(huà)技術(shù)研究.pdf
- 畢業(yè)論文——三維人體重要尺寸探測(cè)系統(tǒng)
- 三維設(shè)計(jì)畢業(yè)論文
- 三維角色動(dòng)畫(huà)中人體骨骼的運(yùn)動(dòng)控制研究_20588.pdf
- 2017鼠標(biāo)三維造型與加工仿真畢業(yè)論文
- 三維動(dòng)畫(huà)畢業(yè)論文
- 三維設(shè)計(jì)在人臉?lè)抡嫔系膽?yīng)用-畢業(yè)論文
- 立式鉆床設(shè)計(jì)【三維solidworls】【全套cad圖紙+畢業(yè)論文】【原創(chuàng)資料】【運(yùn)動(dòng)仿真視頻】
- 畢業(yè)論文---校園三維建模
- 三維動(dòng)畫(huà)畢業(yè)論文
- 基于人體模型模型的三維角色控制---畢業(yè)論文
評(píng)論
0/150
提交評(píng)論