畢業(yè)論文----人體三維骨骼運(yùn)動(dòng)仿真研究_第1頁(yè)
已閱讀1頁(yè),還剩35頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論