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