版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 虛擬家具輔助銷售系統(tǒng)——虛擬建模</p><p><b> 摘 要</b></p><p> 虛擬現(xiàn)實(Virtual Reality,簡稱VR,又譯作靈境、幻真)是近年來出現(xiàn)的高新技術(shù),也稱靈境技術(shù)或人工環(huán)境。虛擬現(xiàn)實是利用電腦模擬產(chǎn)生一個三維空間的虛擬世界,提供使用者關(guān)于視覺、聽覺、觸覺等感官的模擬,讓使用者如同身歷其境一般,可以及時、沒
2、有限制地觀察三度空間內(nèi)的事物。虛擬現(xiàn)實具有多感知性、交互性、構(gòu)想性等基本特性,可應(yīng)用于城市規(guī)劃圖、娛樂、三維可視化數(shù)字地球、現(xiàn)實應(yīng)急推演、室內(nèi)設(shè)計、游戲等諸多領(lǐng)域。</p><p> 本文主要研究基于OGRE的虛擬家具輔助銷售系統(tǒng)的虛擬場景建模、模型添加刪除與拖動以及多視角漫游等技術(shù),根據(jù)虛擬設(shè)計及其主要特點,對基于OGRE和C++的虛擬現(xiàn)實技術(shù)在人們生活領(lǐng)域的應(yīng)用進行了研究,著重闡述了如何利用C++語言和開源
3、圖形引擎OGRE實現(xiàn)虛擬場景中模型的添加刪除與拖動,實現(xiàn)場景與用戶的交互,實現(xiàn)讓用戶多視角觀察場景,闡明了OGRE在虛擬現(xiàn)實領(lǐng)域的廣闊發(fā)展前景。利用C++語言與OGRE API聯(lián)合編程技術(shù)、外部全局變量的數(shù)據(jù)通信,實現(xiàn)了虛擬場景的系統(tǒng)仿真、家具設(shè)計的功能、截取家具設(shè)計渲染效果圖, 在此基礎(chǔ)上,通過添加一些家具模型來設(shè)計房屋證明了采用OGRE和C++作為平臺的可行性。</p><p> 關(guān)鍵詞:虛擬現(xiàn)實,OGRE
4、,交互,家具輔助銷售系統(tǒng),C++</p><p> SALES SUPPORT SYSTEM OF VIRTUAL FURNITURE -- VIRTUAL MODELING</p><p><b> ABSTRACT</b></p><p> Virtual reality ( Virtual Reality, VR, also tra
5、nslated as Lingjing, magic really ) is a new and high technology which emerges in recent years, also known as virtual technology or artificial environment. Virtual reality use the computer simulation to produce a 3D virt
6、ual world, to provide users of visual, auditory, tactile and other sensory simulation, let users like be personally on the scene in general, can be timely, no limit to observe objects of the three dimensional space. Virt
7、ual reality h</p><p> This paper mainly research the technology of virtual scene modeling, model add ,delete , drag and multi perspective roaming in Sales Support System of Virtual Furniture based on the OG
8、RE. based on virtual design and its main features, studies the usage of virtual reality technology based on the OGRE and C + + in people's lives, the paper focuses on how to use C + + language and open source graphic
9、s engine OGRE to realize the virtual scene model to be added, deleted and dragged in the scene, real</p><p> KEY WORDS:Virtual reality, OGRE, interactive, sales support system of virtual furniture, C + +<
10、;/p><p><b> 目 錄</b></p><p><b> 前 言1</b></p><p> 第1章 虛擬現(xiàn)實與OGRE3</p><p> §1.1 虛擬現(xiàn)實與OGRE概述3</p><p> §1.2 基于OGRE的虛擬家具輔助銷
11、售系統(tǒng)的開發(fā)工具4</p><p> §1.2.1 程序開發(fā)工具4</p><p> §1.2.2 三維建模工具5</p><p> 第2章 OGRE對虛擬場景進行模擬仿真6</p><p> §2.1虛擬產(chǎn)品建模6</p><p> §2.2模擬仿真的實現(xiàn)
12、6</p><p> §2.3 OGRE與C++結(jié)合7</p><p> §2.3.1 C++簡介7</p><p> 第3章 虛擬物體展示與操作的實現(xiàn)9</p><p> §3.1系統(tǒng)需求分析及設(shè)計9</p><p> §3.1.1 系統(tǒng)需求分析9</
13、p><p> §3.1.2 系統(tǒng)設(shè)計目標9</p><p> §3.1.3 總體設(shè)計10</p><p> §3.2 系統(tǒng)詳細設(shè)計及實現(xiàn)10</p><p> §3.2.1 系統(tǒng)中模型添加與刪除的實現(xiàn)10</p><p> §3.2.2 系統(tǒng)中模型拖動與旋
14、轉(zhuǎn)的實現(xiàn)13</p><p> §3.2.3 系統(tǒng)中漫游功能的實現(xiàn)18</p><p> §3.2.4 系統(tǒng)中截圖功能的實現(xiàn)22</p><p> 第4章 線查詢與碰撞檢測23</p><p> §4.1射線查詢23</p><p> §4.2碰撞檢測24&
15、lt;/p><p> 第5章 系統(tǒng)測試27</p><p> §5.1 測試的目標27</p><p> §5.2 系統(tǒng)測試過程27</p><p><b> 結(jié) 論28</b></p><p><b> 參考文獻29</b></p&
16、gt;<p><b> 致 謝31</b></p><p><b> 前 言</b></p><p> 本課題研究的內(nèi)容是當前計算機領(lǐng)域較熱門的一項技術(shù)—虛擬現(xiàn)實在家具銷售方面的的應(yīng)用。虛擬現(xiàn)實(Virtual Reality,簡稱VR,又譯作靈境、幻真)是近年來出現(xiàn)的高新技術(shù),也稱靈境技術(shù)或人工環(huán)境。虛擬現(xiàn)實是利用電腦模擬
17、產(chǎn)生一個三維空間的虛擬世界,提供使用者關(guān)于視覺、聽覺、觸覺等感官的模擬,讓使用者如同身歷其境一般,可以及時、沒有限制地觀察三度空間內(nèi)的事物。虛擬現(xiàn)實具有多感知性、交互性、構(gòu)想性等基本特性,可應(yīng)用于城市規(guī)劃圖、娛樂、三維可視化數(shù)字地球、現(xiàn)實應(yīng)急推演、室內(nèi)設(shè)計、游戲等諸多領(lǐng)域。</p><p> 隨著計算機技術(shù),特別是計算機圖形學、三維仿真技術(shù)以及虛擬現(xiàn)實技術(shù)的飛速發(fā)展,信息管理的數(shù)字化和實物模型的虛擬化已經(jīng)成為當
18、今世界非常重要的技術(shù)應(yīng)用領(lǐng)域。人們意識到虛擬現(xiàn)實技術(shù)的巨大應(yīng)用前景,因此虛擬現(xiàn)實技術(shù)幾乎是所有發(fā)達國家目前都在大力研究的前沿領(lǐng)域,其發(fā)展也達到了異常迅速的程度。在國外,美國、德國、英國、日本、韓國等國家在虛擬現(xiàn)實技術(shù)方面的研究做的比較好。</p><p> 我國虛擬現(xiàn)實技術(shù)研究起步較晚,與國外發(fā)達國家還有一定的差距。目前正在逐漸開始嘗試和研究建設(shè)數(shù)字城市、數(shù)字社區(qū)的實踐,而對于家具輔助銷售系統(tǒng)應(yīng)用虛擬現(xiàn)實技術(shù)的
19、研究并不是很多。同類的系統(tǒng)如3D虛擬家裝設(shè)計系統(tǒng)和基于Web3D虛擬現(xiàn)實技術(shù)的家具產(chǎn)品營銷系統(tǒng)都是基于Web3D虛擬技術(shù)來實現(xiàn)的,基于Virtools的虛擬家居漫游系統(tǒng)則使用Virtools虛擬技術(shù),也有采用AutoCAD、3DS MAX和DirectX等技術(shù)綜合起來完成同類系統(tǒng)的設(shè)計。</p><p> 本系統(tǒng)是基于OGRE圖形引擎來實現(xiàn)的系統(tǒng),仿真效果較好,具有更多的交互形式,而且該圖形引擎是開源的,創(chuàng)建3
20、d場景和添加3D模型都更容易,渲染速度快,支持多平臺;擁有高效率和高度可配置性的資源管理器,并且支持多種場景類型等特點。</p><p> 本系統(tǒng)的目標是,實現(xiàn)對家居設(shè)計進行可視化仿真,交互地進行家居設(shè)計,逼真地顯示家居設(shè)計效果,并任意漫游觀察等功能。本課題從3DS MAX的建模和渲染烘焙技術(shù)著手,采用OGRE進行二次開發(fā)來構(gòu)建家具輔助銷售系統(tǒng)。基于OGRE的三維仿真系統(tǒng)的開發(fā)方法,以現(xiàn)實房屋所建立的模型為虛擬
21、場景,實現(xiàn)了家具3D模擬展示、添加家具并任意拖動擺放、室內(nèi)漫游、渲染出設(shè)計后的效果圖等功能。</p><p> 如果能將虛擬現(xiàn)實技術(shù)應(yīng)用于家居裝修設(shè)計,在計算機上應(yīng)用基本的圖形圖像處理技術(shù),必將大大提高家居設(shè)計的質(zhì)量和效率。其對于房地產(chǎn)銷售、家具銷售、室內(nèi)裝修等行業(yè)都具有十分重要的意義。</p><p><b> 虛擬現(xiàn)實與OGRE</b></p>
22、<p> 虛擬現(xiàn)實與OGRE概述</p><p> 虛擬現(xiàn)實技術(shù)是由計算機產(chǎn)生,通過視、聽、觸覺等作用,使用戶產(chǎn)生身臨其境感覺的交互式視景仿真,具有多感知性、存在感、交互性和自主性等特征。文章介紹了動態(tài)環(huán)境建模技術(shù),實時三維圖形生成技術(shù),立體顯示和傳感器技術(shù),應(yīng)用系統(tǒng)開發(fā)工具,系統(tǒng)集成技術(shù)。</p><p> OGRE(Object-Oriented Graphics Re
23、ndering Engine,即:面向?qū)ο髨D形渲染引擎)是一個用C++開發(fā)的面向場景、非常靈活的3D引擎,它旨在讓開發(fā)人員更容易、更直接地利用硬件加速的3D圖形系統(tǒng)開發(fā)應(yīng)用。引擎中的類庫對更底層的系統(tǒng)庫(如:Direct3D和OpenGL)的全部使用細節(jié)進行了抽象,并提供了基于現(xiàn)實世界對象的接口和其它類。</p><p> OGRE能(實際上就是)被用于開發(fā)游戲,但是OGRE被設(shè)計成只提供一個世界級的圖形解決方
24、案;對于其他的特性,如:音效、網(wǎng)絡(luò)、人工智能、碰撞檢測、物理等子系統(tǒng),則需要將其整合到OGRE中,在這些子系統(tǒng)中,已有一些成熟的庫可供選擇,我們提供了一個用于整合其他庫的非常友好的API,OGRE自身總是保持足夠地獨立和靈活,以致能夠與任何其他庫融為一體?!芭c其他庫協(xié)作和整合,而不是實現(xiàn)他們”的原則是面向組件設(shè)計的標準原則。</p><p><b> OGRE特點:</b></p&g
25、t;<p> ?。?) 效率特性:簡單、易用的面向?qū)ο蠼涌谠O(shè)計使你能更容易地渲染3D場景,并使你的實現(xiàn)產(chǎn)品獨立于渲染API(如Direct3D/OpenGL/Glide等等);可擴展的程序框架(framework)使你能更快的編寫出更好的程序;為了節(jié)省你的寶貴時間,OGRE會自動處理常見的需求,如渲染狀態(tài)管理,hierarchical culling,半透物體排序等等;清晰、整潔的設(shè)計加上全面的文檔支持。</p>
26、;<p> 平臺和3D API支持:支持Direct3D和OpenGL;支持Windows平臺,用Visual C++ 6(或Visual C++.Net)和STLport來編譯;支持Linux平臺,用gcc 3+(或gcc 2.9x)和STLport來編譯;材質(zhì)/Shader支持;支持從PNG、JPEG或TGA這幾種文件中加載紋理;自動產(chǎn)生MipMap;自動調(diào)整紋理大小以滿足硬件需求;支持可程序控制的紋理坐標生成(如環(huán)
27、境帖圖)和轉(zhuǎn)換(平移、扭曲、旋轉(zhuǎn));材質(zhì)可以擁有足夠多的紋理層,每層紋理支持各種渲染特效,支持動畫紋理;自動應(yīng)用多通道渲染和多紋理,從而大幅度提高渲染質(zhì)量;支持透明物體和其它場景級別的渲染特效;通過腳本語言可以不用重新編譯就設(shè)置和更改高級的材質(zhì)屬性。</p><p> 網(wǎng)格Meshes:高效的網(wǎng)格數(shù)據(jù)格式;提供插件支持從Milkshape3D導(dǎo)出OGRE本身的.mesh和.skeleton文件格式;支持骨骼動畫
28、(可渲染多個動畫的組合);支持用貝賽爾樣條實現(xiàn)的曲面。</p><p> 場景特性:擁有高效率和高度可配置性的資源管理器,并且支持多種場景類型。使用系統(tǒng)默認的場景組織方法,或通過親自編寫插件使用自己的場景組織方法;通過綁定體(如綁定盒)實現(xiàn)的場景體系視錐揀選;提供的BspSceneManager插件是快速的室內(nèi)渲染器,它支持加載Quake3關(guān)卡和shader腳本分析;優(yōu)秀的場景組織體系;場景結(jié)點支持物體的附屬(
29、attach),并帶動附屬物體一起運動,實現(xiàn)了類似于關(guān)節(jié)的運動繼承體系。</p><p> 特效:粒子系統(tǒng)包括可以通過編寫插件來擴展的粒子發(fā)射器(emitter)和粒子特效影響器(affector)。通過腳本語言可以不用重新編譯就設(shè)置和更改粒子屬性。支持并自動管理粒子池,從而提升粒子系統(tǒng)的性能;支持天空盒、天空面和天空圓頂,使用非常簡單;支持公告板,以實現(xiàn)特效;自動管理透明物體(系統(tǒng)自動幫你設(shè)置渲染順序和深度緩
30、沖)。</p><p> 其它特性:資源管理和文檔加載(ZIP、PK3);支持高效的插件體系結(jié)構(gòu),它允許你不重新編譯就擴展引擎的功能;運用'Controllers'你可以方便地改變一個數(shù)值。例如動態(tài)改變一個帶防護罩的飛船的顏色值;調(diào)試用的內(nèi)存管理器負責檢查內(nèi)存溢出。</p><p> 基于OGRE的虛擬家具輔助銷售系統(tǒng)的開發(fā)工具</p><p>
31、<b> 程序開發(fā)工具</b></p><p> OGRE是使用C++開發(fā)的一款3D引擎,所以本課題開發(fā)所使用的編譯器為Visual Studio 2010,這是目前最流行的Windows平臺應(yīng)用程序開發(fā)環(huán)境,使用起來也是簡單方便。OGRE應(yīng)用程序向?qū)菫镺GRE開發(fā)而安裝在VS2010中的一種應(yīng)用程序模版,這樣可以使我們在OGRE開發(fā)環(huán)境的配置上節(jié)省大量的時間。</p>
32、<p><b> 三維建模工具</b></p><p> 3DSMAX是當今世界流行最廣的三維動畫造型軟件,OgreMax是一款能把3DSMAX所創(chuàng)建的三維模型轉(zhuǎn)換為OGRE圖形引擎能夠使用的模型格式的插件(利用其Export方法),這使得3DSMAX成為OGRE三維開發(fā)的最好助手。OgreMax可以導(dǎo)出OGRE中所定義的.MESH文件,這是一個整體的模型;也可以導(dǎo)出.SCEN
33、E格式的文件,這是多個.MESH文件組成的一個整體。</p><p> 當然,還有其它一些優(yōu)秀的三維建模工具(如MAYA、SoftImage等)可以用來進行復(fù)雜的三維物體的建模。但由于沒有像OgreMax一樣的格式轉(zhuǎn)換的插件或其他原因,這使得他們在虛擬現(xiàn)實中使用較少。當然,它們可以通過3DMAX這座橋梁而轉(zhuǎn)換成OGRE可以使用的文件格式(大多數(shù)三維建模軟件均可與3DMAX互相導(dǎo)入)。</p>&l
34、t;p> OGRE對虛擬場景進行模擬仿真</p><p> §2.1虛擬產(chǎn)品建模</p><p> 制作虛擬場景3D模型有如下3個途徑:</p><p> 使用編程的方法直接生成,這種方法需要手動設(shè)置模型的各個幾何頂點、索引頂點等信息,采用符合OGRE規(guī)范的字符編譯器中對各個頂點進行描述,就可生成各式各樣的三維OGRE模型。但是這種方法的確定
35、是一個模型的頂點特別多,這樣就是的工作量大大增加,所以一般不采用這種方法。</p><p> 使用商品化的軟件制作虛擬現(xiàn)實的模型作品,利用編程的方法生成模型是非常麻煩的。但是,由于OGRE與3DSMAX等三維軟件有模型轉(zhuǎn)換的標準插件,所以可以應(yīng)用這些軟件生成復(fù)雜產(chǎn)品模型,然后通過這些軟件與OGRE相對于的插件轉(zhuǎn)換為能夠使用的文件格式,即保存為(.MESH或.SCENE等)格式的文件。</p>&l
36、t;p><b> 通過攝像機拍攝。</b></p><p> §2.2模擬仿真的實現(xiàn)</p><p> 對虛擬場景進行的仿真主要包括三維模型的顯示和對三維模型的操作所做出的事件響應(yīng),事件響應(yīng)的流程包括接收外部鍵盤和鼠標事件、改變響應(yīng)事件變量的值或狀態(tài)、觸發(fā)事件處理段代碼、更新對象狀態(tài)等4個過程,最終完成場景對象的描述。模擬建模的過程包括設(shè)計事件的
37、觸發(fā)方式和時機、事件和對象任務(wù)的結(jié)構(gòu)以及每個事件處理函數(shù)和任務(wù)的代碼實現(xiàn)。</p><p> 利用場景管理器實現(xiàn)模擬仿真</p><p> OGRE場景管理器(SceneManager)從數(shù)據(jù)管理上理解,就是一個存放眾多三維模型的容器。從數(shù)據(jù)結(jié)構(gòu)上講,就是一個樹的結(jié)構(gòu)。之所以用樹狀結(jié)構(gòu),是因為在三維空間中,對父節(jié)點的矩陣變化會應(yīng)用到子結(jié)點。想像一個人在走動,人的身體這個根節(jié)點上掛接了手
38、腳,人的平移會帶動手腳的平移。</p><p> OGRE場景管理器的主要功能有:</p><p> 在場景中創(chuàng)建和放置活動物體、燈光以及攝像機,并維護他們的在場景圖中的變換。載入和布置世界地圖(World geometry,與活動實體不同,世界地圖是巨大且可以延伸的,通常情況下是不可移動的,比如一個完整的BSP地圖 – 這個概念后面講到)。對場景查詢(Scene Queries)的支
39、持,比如回答“在世界的某個原型空間內(nèi),都包含了那些物體”。剔除不可見物體并且將可見物體放入渲染隊列。根據(jù)當前和渲染物體的透視圖,對無方向的光源(Nondirectional Light)進行組織和排序(按由近到遠)。設(shè)置并且渲染場景中的陰影。渲染場景中的其他物體,如背景和天空盒。發(fā)送組織好的內(nèi)容到渲染系統(tǒng)執(zhí)行渲染。</p><p> 所以我們可以利用場景管理器來創(chuàng)建出三維模型所對于的實體(Entity)對象,而
40、要使該模型顯示出來還要利用場景管理器創(chuàng)建一個對應(yīng)的場景節(jié)點(SceneNode)并將實體綁定到節(jié)點上。這樣一個三維模型就被添加到了三維場景中,實現(xiàn)了對三維模型的模擬仿真的第一步——展示。而且還可以用他創(chuàng)建出一個展示三維模型的三維空間。</p><p> 通過對鼠標、鍵盤事件的響應(yīng)實現(xiàn)用戶與系統(tǒng)模型之間的交互</p><p> 當用戶使用鼠標點擊或拖動某個對象或按下松開鍵盤上的某一個按鍵
41、時,系統(tǒng)都會做出相應(yīng)的響應(yīng),從而實習用戶與系統(tǒng)之間的交互。實習交互的過程主要包括:接收鼠標、鍵盤事件消息,通過改變某一變量激活對應(yīng)的一段代碼或直接激活某一段對應(yīng)代碼來響應(yīng)事件。</p><p> §2.3 OGRE與C++結(jié)合</p><p> §2.3.1 C++簡介</p><p> C++是一種使用非常廣泛的計算機編程語言,他是一種靜
42、態(tài)數(shù)據(jù)類型檢查的、支持多重編程范式的通用程序設(shè)計語言。它支持過程化程序設(shè)計、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計、制作圖標等等泛型程序設(shè)計等多種程序設(shè)計風格。C++設(shè)計成靜態(tài)類型和C同樣高效且可移植的多用途程序設(shè)計語言。 </p><p> C++的特點有:C++設(shè)計成直接的和廣泛的支援多種程序設(shè)計風格(程序化程序設(shè)計、資料抽象化、面向?qū)ο蟪绦蛟O(shè)計、泛型程序設(shè)計)。C++設(shè)計成給程序設(shè)計者更多的選擇,即使可能導(dǎo)致程序
43、設(shè)計者選擇錯誤。C++設(shè)計成盡可能與C兼容,籍此提供一個從C到C++的平滑過渡。C++避免平臺限定或沒有普遍用途的特性。C++不使用會帶來額外開銷的特性。C++設(shè)計成無需復(fù)雜的程序設(shè)計環(huán)境。 出于保證語言的簡潔和運行高效等方面的考慮,C++的很多特性都是以庫(如STL)或其他的形式提供的,而沒有直接添加到語言本身里。</p><p> 虛擬物體展示與操作的實現(xiàn)</p><p>
44、§3.1系統(tǒng)需求分析及設(shè)計</p><p> §3.1.1 系統(tǒng)需求分析</p><p> 本系統(tǒng)是根據(jù)現(xiàn)實生活中的房屋模型,來構(gòu)造一個虛擬的房屋場景,包括房間中的沙發(fā)、床、桌椅、柜子等場景模型,能夠很好地可視化模擬真實的房屋場景。通過向房屋內(nèi)添加所想喜歡的各類家具模型,或者刪除不喜歡或不需要的家具模型來重新裝飾該房屋,從而實現(xiàn)家居設(shè)計的要求。而且用戶還可以給各類家
45、具設(shè)置自己喜歡的材質(zhì),擺放到自己喜歡的位置,設(shè)計好之后可以通過室內(nèi)漫游系統(tǒng)仔細觀察房間內(nèi)的布局,本系統(tǒng)的截圖功能還可以渲染出您所設(shè)計的家居效果圖,這樣您就可以通過對比從多個家居設(shè)計方案中選詞您最喜歡的設(shè)計,這使得我們的系統(tǒng)更加的人性化。</p><p> 系統(tǒng)設(shè)計的主要功能包括場景中的家具模型可以動態(tài)添加與刪除,添加之前可以通過家具的3D模擬展示來選擇添加與否,添加過家具后可以通過拖動來擺放家具,可以通過平視圖
46、和頂視圖以第一人稱視角對房間進行漫游觀察,可以通過截圖渲染出設(shè)計后的效果圖,通過各個效果圖的對比使客戶可以做出更好的選擇。總之,本系統(tǒng)基本上完成了家居設(shè)計所需要的各個功能,符合家居設(shè)計的客觀實際,當然在實現(xiàn)過程中也有不少欠缺,比如沒有解決系統(tǒng)顯示中文的問題,這要涉及到OGRE的底層API修改,對于我們現(xiàn)在的技術(shù)來說是有難度的,對此我們會在后來的工作中不斷改進。</p><p> §3.1.2 系統(tǒng)設(shè)計
47、目標</p><p> 使用OGRE SDK提供的API建立一個虛擬的房屋場景的三維模型,并添加沙發(fā)、床、桌椅、柜子等場景模型,給出可以向房間內(nèi)添加的家具模型的類型菜單供用戶選擇添加,給出各個家具模型的介紹信息,采用頂視圖和平視圖兩個角度對房間進行漫游觀察。</p><p> 通過本次設(shè)計可以完成以下功能:</p><p> 虛擬房屋構(gòu)建:包括房間內(nèi)虛擬家具三
48、維模型的建模。</p><p> 漫游功能:移動、顯示等輸入輸出控制。</p><p> 家居設(shè)計:添加、刪除和拖動、旋轉(zhuǎn)家具三維模型。</p><p> 截圖功能:截取設(shè)計好的家居設(shè)計效果圖。</p><p> 基于OGRE技術(shù)的系統(tǒng)模型設(shè)計和實現(xiàn)。</p><p> §3.1.3 總體設(shè)計<
49、;/p><p> 房間的虛擬場景用于瀏覽與仿真要求真實感強,因此場景模型的設(shè)計要求強調(diào)能夠模擬真實的房屋環(huán)境。根據(jù)各種住宅設(shè)計資料、數(shù)據(jù)等,構(gòu)建所需要的模型。</p><p> §3.2 系統(tǒng)詳細設(shè)計及實現(xiàn)</p><p> §3.2.1 系統(tǒng)中模型添加與刪除的實現(xiàn)</p><p> 模型添加與刪除是系統(tǒng)中的一個重要的
50、功能,該功能能夠使用戶自由的添加自己想要的家具模型來裝飾房間,如果有不喜歡的家具模型,也可以刪除掉。為了模型添加功能的實現(xiàn),我們首先給出一個模型類型(即家具模型種類,如床、沙發(fā)、桌椅等)的菜單供用戶選擇。當用戶選擇好所要添加的模型類型后,系統(tǒng)跳轉(zhuǎn)到模型添加界面。在該界面中,我們會給出一個與用戶所選擇的模型類型相對應(yīng)的模型菜單,這個菜單里包含了該類模型的多種不同模型讓用戶選擇。</p><p> 模型添加界面如圖
51、3-1所示:</p><p> 圖3-1模型添加界面</p><p> 點擊模型添加界面左下角的“OK”按鈕,即可把當前用戶選擇的家具模型添加到房間場景內(nèi),如圖3-2所示。點擊模型添加界面右下角的“CANCEL”按鈕,可以取消本次的添加模型操作。</p><p> 圖3-2模型添加與取消添加按鈕</p><p> 點擊“OK”按鈕后,
52、我們所定義的一個確認是否添加模型的變量ModeAdd會被設(shè)為真,然后激活添加模型的代碼段,該代碼段如下所示:</p><p> if(ModeAdd) </p><p><b> {</b></p><p> m_pOgreHeadEntity =m_pSceneMgr->createEntity(Name,mMesh);<
53、;/p><p> m_pOgreHeadNode= m_pSceneMgr->getRootSceneNode()->createChildSceneNode(Name+"Node");</p><p> m_pOgreHeadNode->attachObject(m_pOgreHeadEntity);</p><p> m_
54、pOgreHeadNode->setPosition(Vector3(0,0 , -25));</p><p> if(!material.isNull())</p><p><b> {</b></p><p> m_pOgreHeadEntity->setMaterial(material); </p>
55、<p> material.setNull();</p><p><b> }</b></p><p> ModeAdd = false;</p><p><b> }</b></p><p> 模型的刪除如圖3-3(a)和圖3-3(b)所示:</p><p&
56、gt; 圖3-3(a)模型刪除前</p><p> 圖3-3(b)模型刪除后</p><p> 首先選擇要刪除的模型,然后按下“Delete”鍵,將記錄是否刪除某一模型的變量m_pDel設(shè)為真,激活刪除模型的代碼段,如下所示:</p><p> if(m_pDel)</p><p><b> {</b>&
57、lt;/p><p> m_pSceneMgr->destroySceneNode(m_pCurrentObject);</p><p> m_pCurrentObject = NULL;</p><p> m_pSceneMgr->destroyEntity(m_pCurrentEntity);</p><p> m_pCur
58、rentEntity = NULL;</p><p> m_pDel = false;</p><p><b> }</b></p><p> §3.2.2 系統(tǒng)中模型拖動與旋轉(zhuǎn)的實現(xiàn)</p><p> 模型的拖動與旋轉(zhuǎn),是用戶在進行家居設(shè)計是要經(jīng)常使用的功能。如用戶在設(shè)計家居時,有了所要使用的模型之后
59、,就要考慮把模型擺放到什么地方的問題,那么用戶只要點擊鼠標左鍵選中該家具模型并且按住鼠標左鍵不放來拖拽移動,家具模型就會跟著一起移動。移動模型時還需要判斷該模型是否碰撞到了別的模型,如果沒有碰撞到就可以跟隨鼠標移動,如果碰撞到了某一模型,就不能穿過該模型而移動。點擊鼠標右鍵并來回移動,就可以旋轉(zhuǎn)調(diào)整所選中的家具模型的擺放的角度。</p><p> 拖動操作的示意圖如圖3-4(a)和圖3-4(b)所示:</
60、p><p> 圖3-4(a)模型拖動前</p><p> 圖3-4(b)模型拖動后</p><p> 拖動家具模型是鼠標箭頭會隱藏起來,當松開鼠標時鼠標箭頭會再次顯示出來。鼠標箭頭的隱藏和顯示代碼如下所示:</p><p> MyBase::getSingletonPtr()->m_pTrayMgr->hideCursor()
61、; //隱藏鼠標</p><p> MyBase::getSingletonPtr()->m_pTrayMgr->showCursor(); //顯示鼠標</p><p> 拖動模型的實現(xiàn)代碼如下所示:</p><p><b> //鼠標左鍵被按下</b></p><p> if(m_bLMouseD
62、own)</p><p><b> {</b></p><p> MyBase::getSingletonPtr()->m_pTrayMgr->hideCursor();</p><p><b> //拖拽模型</b></p><p> Ogre::Vector3 node;
63、//記錄模型位置</p><p> if(m_pCurrentObject) //有選中模型時,拖拽選中的模型</p><p><b> {</b></p><p> if(isDrag)</p><p><b> {</b></p><p> node =
64、m_pCurrentObject->getPosition();</p><p> node.x += evt.state.X.rel * 1.0f;</p><p> node.z += evt.state.Z.rel * 1.0f;</p><p> node.y += evt.state.Y.rel * -1.0f;</p><
65、p> m_pCurrentObject->setPosition(node);</p><p><b> }</b></p><p> else if(!isDrag)</p><p><b> {</b></p><p> node = m_pCurrentObject-&g
66、t;getPosition();</p><p> node.x += xdir;</p><p> node.z += zdir;</p><p> node.y += ydir;</p><p> m_pCurrentObject->setPosition(node);</p><p> i
67、sDrag = true;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 旋轉(zhuǎn)模型操作的示意圖如圖3-5(a)和圖3-5(b)所示:</p><p>
68、 圖3-5(a)模型旋轉(zhuǎn)前</p><p> 圖3-5(b)模型旋轉(zhuǎn)后</p><p> 旋轉(zhuǎn)模型的代碼段如下所示:</p><p><b> //鼠標右鍵被按下</b></p><p> if(m_bRMouseDown)</p><p><b> { </b>
69、</p><p> if(m_pCurrentObject) //有選中模型時,旋轉(zhuǎn)旋轉(zhuǎn)模型</p><p><b> {</b></p><p> m_pCurrentObject->yaw(Degree(evt.state.X.rel * 0.3f));</p><p> m_pCurrentObjec
70、t->pitch(Degree(evt.state.Y.rel * -0.3f));</p><p> m_pCurrentObject->roll(Degree(evt.state.Z.rel * -0.3f));</p><p><b> }</b></p><p><b> }</b></p&
71、gt;<p> §3.2.3 系統(tǒng)中漫游功能的實現(xiàn)</p><p> 本系統(tǒng)中的漫游功能可以使用戶,通過平時圖和頂視圖兩個視角來觀察家居設(shè)計后的整體效果。長按按鍵“W”、“A”、“S”、“D”,用戶就可以移動攝像機,按住鼠標中鍵來回拖動可以調(diào)整攝像機的攝像角度和方向,從而使用戶更加方便快捷的漫游觀察家居設(shè)計的效果。</p><p> 多視角漫游功能示意圖如圖3
72、-5(a)和圖3-5(b)所示:</p><p> 圖3-5(a)頂視圖關(guān)閉</p><p> 圖3-5(b)頂視圖打開</p><p> 圖3-5(b)中右上角為頂視圖的觀察效果。</p><p> 按鍵盤上的“V”鍵可以打開頂視圖,再按一下“V”鍵就可以關(guān)閉頂視圖。該功能代碼段如下所示:</p><p>&
73、lt;b> //顯示頂視圖</b></p><p> if(MyBase::getSingletonPtr()->m_pKeyboard->isKeyDown(OIS::KC_V))</p><p><b> {</b></p><p> if(!m_pNewView && m_pNum==
74、0){m_pNewView=true;}</p><p> if(m_pNum==1){m_pNum=2;}</p><p><b> }</b></p><p> m_pNewView和m_pNum是用來判斷是否打開頂視圖的變量,創(chuàng)建和銷毀頂視圖的代碼如下:</p><p> if(m_pNewView) //
75、打開頂視圖</p><p><b> {</b></p><p> if(m_pNum==0)</p><p><b> {</b></p><p> vp_2 = MyBase::getSingletonPtr()->m_pRenderWnd->addViewp
76、ort(mCamera_1, 1, 0.75, 0, 0.25, 0.25 );</p><p> vp_2->setBackgroundColour( ColourValue(0,0,0) );</p><p> vp_2->setOverlaysEnabled(false);</p><p> vp_2->setCamera(mCa
77、mera_1);</p><p> m_pNewView=false;</p><p><b> m_pNum=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> if(m_pNu
78、m==2) //關(guān)閉頂視圖</p><p><b> {</b></p><p> if(vp_2!=NULL)</p><p><b> {</b></p><p> MyBase::getSingletonPtr()->m_pRenderWnd->removeViewport
79、(1);m_pNum=0;</p><p><b> }</b></p><p><b> }</b></p><p> 長按按鍵“W”、“A”、“S”、“D”移動攝像機的功能代碼如下所示:</p><p> void GameState::getInput() //W
80、A S D 鍵移動攝像機</p><p><b> {</b></p><p> if(MyBase::getSingletonPtr()->m_pKeyboard->isKeyDown(OIS::KC_A))</p><p> m_TranslateVector.x = -(10*m_MoveScale);</p>
81、;<p> if(MyBase::getSingletonPtr()->m_pKeyboard->isKeyDown(OIS::KC_D))</p><p> m_TranslateVector.x = 10*m_MoveScale;</p><p> if(MyBase::getSingletonPtr()->m_pKeyboard->isKe
82、yDown(OIS::KC_W))</p><p> m_TranslateVector.z = -(10*m_MoveScale);</p><p> if(MyBase::getSingletonPtr()->m_pKeyboard->isKeyDown(OIS::KC_S))</p><p> m_TranslateVector.z = (1
83、0*m_MoveScale); </p><p><b> }</b></p><p> 按住鼠標中鍵來回拖動調(diào)整攝像機的攝像角度和方向的代碼如下所示,</p><p> if(m_bMMouseDown)</p><p><b> {</b></p><p>
84、 //平時圖攝像機旋轉(zhuǎn)</p><p> m_pCamera->yaw(Degree(evt.state.X.rel * -0.1f));</p><p> m_pCamera->pitch(Degree(evt.state.Y.rel * -0.1f));</p><p> //頂時圖攝像機旋轉(zhuǎn)</p><p> mC
85、amera_1->yaw(Degree(evt.state.X.rel * -0.1f));</p><p> mCamera_1->pitch(Degree(evt.state.Y.rel * -0.1f));</p><p><b> }</b></p><p> §3.2.4 系統(tǒng)中截圖功能的實現(xiàn)</p&
86、gt;<p> 截圖功能可以使用戶將家居設(shè)計的效果渲染出來,通過對比不同設(shè)計的效果渲染圖,是用戶更好的選擇自己喜歡的設(shè)計。</p><p> 用戶只需要按鍵盤上的“Sys Rq”鍵,就可以將當前狀態(tài)的效果圖渲染出來,并放到程序的文件夾里。</p><p> 實現(xiàn)截圖功能的代碼如下:</p><p> if(m_pKeyboard->isK
87、eyDown(OIS::KC_SYSRQ))</p><p><b> {</b></p><p> m_pRenderWnd->writeContentsToTimestampedFile("Screenshot_", ".jpg");</p><p> return true;</p
88、><p><b> }</b></p><p><b> 線查詢與碰撞檢測</b></p><p><b> §4.1射線查詢</b></p><p> 本系統(tǒng)需要對各個三維模型進行大量的拖拉移動和旋轉(zhuǎn)的操作,這就不可避免的涉及到要對那個模型進行這樣的操作。所以在
89、拖拉移動或旋轉(zhuǎn)某一個三維模型之前,我們首先要做的就是選中它。而OGRE為我們提供了一種叫做射線查詢的方法,來選中你所需要的模型。</p><p> 使用射線查詢法來選中物體,首先我們要創(chuàng)建一條射線,并設(shè)按距離篩選模型,即距離射線原點近的模型被選中,其部分代碼如下所示:</p><p><b> //創(chuàng)建射線</b></p><p> O
90、gre::Ray mouseRay = m_pCamera->getCameraToViewportRay(MyBase::getSingletonPtr()->m_pMouse->getMouseState().X.abs / float(evt.state.width),</p><p> MyBase::getSingletonPtr()->m_pMouse->getMous
91、eState().Y.abs / float(evt.state.height)); </p><p><b> //設(shè)置射線</b></p><p> m_pRSQ->setRay(mouseRay);</p><p> m_pRSQ->setSortByDistance(true); </p><p&g
92、t; 然后當我們使用鼠標來選擇物體時,該射線就會執(zhí)行查詢篩選,最后我們把所要選擇的物體記錄下來,這樣就選中了自己所需要的物體模型,其部分代碼如下所示:</p><p> Ogre::RaySceneQueryResult &result = m_pRSQ->execute();</p><p> Ogre::RaySceneQueryResult::iterator
93、itr;</p><p> for(itr = result.begin(); itr != result.end(); itr++)</p><p><b> {</b></p><p> if(itr->movable)</p><p><b> {</b></p&
94、gt;<p> MyBase::getSingletonPtr()->m_pLog->logMessage("MovableName: " + itr->movable->getName());</p><p> //獲取選中模型的場景節(jié)點</p><p> m_pCurrentObject = m_pSceneMgr->
95、;getEntity(itr->movable->getName())->getParentSceneNode();MyBase::getSingletonPtr()->m_pLog->logMessage("ObjName " + m_pCurrentObject->getName());</p><p> //獲取選中模型的實體對象</p>
96、;<p> m_pCurrentEntity = m_pSceneMgr->getEntity(itr->movable->getName()); </p><p><b> break;</b></p><p><b> }</b></p><p><b> }&
97、lt;/b></p><p><b> §4.2碰撞檢測</b></p><p> 如果用戶在使用本系統(tǒng)進行家居設(shè)計時,某一家具模型需要放在另外一個家具模型的上面,但是我們沒有進行碰撞檢測,則該家具模型就會很容易的穿過另一家具模型,這是用戶在擺放模型時會遇到很多問題,因此碰撞檢測也是本系統(tǒng)中必不可少的一項功能。</p><p&g
98、t; 要進行碰撞檢測,首先我們要獲取當前所選中的模型的位置。然后查詢出房屋場景內(nèi)的兩個物體,并獲取這兩個物體的包圍盒。然后調(diào)用系統(tǒng)方法檢測這兩個物體是否有相交,并判斷其中的那個物體是當前選中的物體。再判斷這兩個物體的相對位置,從而判斷兩個物體相交時,當前移動的物體位置改變的方向,從而決定當前物體能否繼續(xù)向前移動。</p><p> 進行碰撞檢測的函數(shù)代碼如下所示:</p><p>
99、void GameState::Collide()</p><p><b> {</b></p><p> Ogre::Vector3 mLastPosition = m_pCurrentObject->getPosition();</p><p> Ogre::IntersectionSceneQuery *mSceneQuer
100、y = m_pSceneMgr->createIntersectionQuery();</p><p> // 獲取查詢結(jié)果</p><p> Ogre::IntersectionSceneQueryResult results = mSceneQuery->execute(); for(Ogre::SceneQueryMovableIntersectionList
101、::iterator iter2 = results.movables2movables.begin();iter2 != results.movables2movables.end();++iter2)</p><p><b> {</b></p><p> Ogre::SceneQueryMovableObjectPair pObject = static_c
102、ast<Ogre::SceneQueryMovableObjectPair>(*iter2);</p><p> Ogre::SceneNode * FirstNode = pObject.first->getParentSceneNode();</p><p> Ogre::SceneNode * SecondNode = pObject.second->ge
103、tParentSceneNode();</p><p> Ogre::AxisAlignedBox First = FirstNode->_getWorldAABB();</p><p> Ogre::AxisAlignedBox Second = SecondNode->_getWorldAABB();</p><p> if(First.int
104、ersects(Second))</p><p><b> {</b></p><p> if(FirstNode == m_pCurrentObject)</p><p><b> {</b></p><p> Ogre::Vector3 fpos = FirstNode->
105、;getPosition();</p><p> Ogre::Vector3 spos = SecondNode->getPosition();</p><p> if((fpos.x-spos.x)>0){xdir = 1.0f;}</p><p> else{xdir = -1.0f;}</p><p> if((f
106、pos.y-spos.y)>0){ydir = 1.0f;}</p><p> else{ydir = -1.0f;}</p><p> if((fpos.z-spos.z)>0){zdir = -1.0f;}</p><p> else{zdir = 1.0f;}</p><p><b> }&l
107、t;/b></p><p> if(SecondNode == m_pCurrentObject)</p><p><b> {</b></p><p> Ogre::Vector3 fpos = FirstNode->getPosition();</p><p> Ogre::Vector3 spo
108、s = SecondNode->getPosition();</p><p> if((fpos.x-spos.x)>0){xdir = -1.0f;}</p><p> else{xdir = 1.0f;}</p><p> if((fpos.y-spos.y)>0){ydir = -1.0f;}</p><p>
109、 else{ydir = 1.0f;}</p><p> if((fpos.z-spos.z)>0){zdir = 1.0f;}</p><p> else{zdir = -1.0f;}</p><p><b> }</b></p><p> isDrag = false;</p>&l
110、t;p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 系統(tǒng)測試</b></p><p> 在系統(tǒng)開發(fā)的過程中,人們使用的許多保證系統(tǒng)質(zhì)量的方法分析、設(shè)計和實現(xiàn)場景
111、建模,盡管如此,但也難免會出現(xiàn)差錯,因為在系統(tǒng)的開發(fā)過程中會有許多隱藏的錯誤和缺陷未被發(fā)現(xiàn),尤其對于規(guī)模大、復(fù)雜性高的系統(tǒng)更是如此,通過測試可檢測出設(shè)計中的漏洞,甚至是致命的錯誤,因此,對系統(tǒng)進行測試是非常必需的。</p><p> §5.1 測試的目標</p><p> 測試的目標就是以最少的時間和人力找出軟件中潛在的各種錯誤和缺陷,保證程序按照預(yù)定的功能要求來嚴格地執(zhí)行,
112、從而方便用戶的使用。此外,在系統(tǒng)測試過程中,還可以收集到測試結(jié)果數(shù)據(jù),從而為可靠性分析提供了依據(jù)。</p><p> §5.2 系統(tǒng)測試過程</p><p> (1)單元測試:本系統(tǒng)包括三大模塊,三維模型的添加刪除模塊、三維模型的拖動旋轉(zhuǎn)模塊、多視角漫游與截圖模塊。分別對各個模塊進行測試,對于是否完成其應(yīng)有的功能進行修改,經(jīng)過測試,根據(jù)現(xiàn)實情況逐漸完善了其功能。</p&
113、gt;<p> (2)集成測試:是在模塊測試的基礎(chǔ)上,需要將所有模塊按照設(shè)計要求組裝成完整的系統(tǒng),驗證系統(tǒng)的功能和性能及其他特性是否與要求一致,在系統(tǒng)需求說明中描述了全部的系統(tǒng)需求;然后通過測試的系統(tǒng),作為整個基于計算機系統(tǒng)的一個元素,與計算機硬件、外設(shè)、某些支持軟件、數(shù)據(jù)、和人員等其他系統(tǒng)元素結(jié)合在一起,在實際環(huán)境運行中,對其進行優(yōu)化,其目的在于通過與系統(tǒng)的需求定義作比較,發(fā)現(xiàn)軟件與系統(tǒng)定義不符合或與之矛盾的地方,最終
114、達到合理的符合要求的可靠的系統(tǒng),提高了系統(tǒng)的健壯性。</p><p><b> 結(jié) 論</b></p><p> 本系統(tǒng)是用微軟的Visual Studio 2010集成開發(fā)工具完成的。經(jīng)過一段時間的設(shè)計和開發(fā),本系統(tǒng)實現(xiàn)了向房屋場景內(nèi)添加或者刪除三維家具模型,拖動旋轉(zhuǎn)家具模型,多視角漫游觀察房屋場景,截取家居設(shè)計效果圖等功能,家具輔助銷售系統(tǒng)的基本構(gòu)建完畢,其功
115、能基本實現(xiàn)需求,完成家居設(shè)計所需交互,使用戶有比較舒適流暢的操作環(huán)境。但是,本系統(tǒng)依然有很多地方需要進一步的完善。</p><p> 首先,該基于OGRE的家具輔助銷售系統(tǒng)不支持中文顯示,由于解決此問題要涉及到OGRE底層API的修改,技術(shù)上比較難,所以本系統(tǒng)沒有解決該問題,我們會在今后嘗試解決。</p><p> 另外,能夠讓用戶使用本系統(tǒng)自己來設(shè)計所想要的三維家具模型,從而更好的滿
116、足用戶的需求,將是我們接下來研究的又一重要的應(yīng)用功能。在本系統(tǒng)的基礎(chǔ)上,如何進一步提高系統(tǒng)的交互性、適用性,仍然有待于進一步研究。</p><p><b> 參考文獻</b></p><p> 巫影.虛擬現(xiàn)實技術(shù)綜述[J].計算機與數(shù)字工程.2002,30(3):41-44.</p><p> 吳迪. 黃文騫. 虛擬現(xiàn)實技術(shù)的發(fā)展過程及研
117、究現(xiàn)狀[J].海洋測繪.2002.22(6).15-17.</p><p> 蔣慶全.國外VR技術(shù)發(fā)展綜述[J].飛航導(dǎo)彈.2002,27-24.</p><p> 周前祥.旱田虛擬現(xiàn)實仿真技術(shù)的研究發(fā)展[J].科學導(dǎo)報.1998,(10):35-38.</p><p> 李珍香.虛擬現(xiàn)實技術(shù)在煤礦安全中的應(yīng)用研究[J].煤炭技術(shù).2000,19(6):27-
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文佳美家具的銷售方式
- 圖書銷售系統(tǒng)畢業(yè)論文
- 畢業(yè)論文----銷售管理系統(tǒng)
- 銷售管理系統(tǒng)畢業(yè)論文
- 書店銷售系統(tǒng)畢業(yè)論文
- 畢業(yè)論文——服裝銷售系統(tǒng)
- 風格家具畢業(yè)論文
- 家具設(shè)計畢業(yè)論文
- 家具設(shè)計畢業(yè)論文
- 家具設(shè)計畢業(yè)論文
- android手機輔助系統(tǒng)畢業(yè)論文
- 企業(yè)銷售管理系統(tǒng)(畢業(yè)論文)
- 畢業(yè)論文——在線手機銷售系統(tǒng)
- 瓷磚銷售管理系統(tǒng)畢業(yè)論文
- 畢業(yè)論文——服裝銷售系統(tǒng)設(shè)計
- 汽車在線銷售系統(tǒng)畢業(yè)論文
- 瓷磚銷售管理系統(tǒng)畢業(yè)論文
- 畢業(yè)論文---花店銷售管理系統(tǒng)
- 圖書銷售管理系統(tǒng)畢業(yè)論文
- 藥品銷售管理系統(tǒng)畢業(yè)論文
評論
0/150
提交評論