摘 要:虛擬現實(Virtual Reality)技術是近年來一項十分活躍的研究與應用技術。它的應用領域十分廣泛,主要在工程設計CAD、遙控機器人學、數據可視化、飛行模擬、多媒體遠程教育、臨床外科、遠程醫療、藝術創作、游戲、娛樂等方面。虛擬現實技術給現代生活帶來了很大的幫助,運用虛擬現實技術構造的虛擬世界可以模擬現實環境,以便幫助用戶方便地研究現實中各種問題,從而大大降低研究成本。
關鍵詞:虛擬現實;三維建模;OpenSceneGraph;路徑漫游
DOI:10.16640/j.cnki.37-1222/t.2017.18.242
1 引言
本文以某校區實際的校園環境作為原型,設計完成了某校區的漫游系統,并完成了最后的功能測試。首先構造可漫游的虛擬場景是虛擬現實中最基本的一個環節,本文從構造虛擬場景的一般步驟出發,闡述了三維建模的技術與方法并在平臺上加以實現;后用基于三維渲染引擎OpenSceneGraph場景圖進一步的開發,運用Visual Studio C++和OSG混合編程,實現了系統的漫游功能。
2 三維建模技術
3DS MAX是專業的三維建模軟件,是建模,渲染及動畫制作的集成軟件包。windows操作系統和Pentium處理器的強大功能與靈活性,使它在pc機上實現了工作站的性能和特征[1]。它具有高擴展性、豐富的功能和面向對象的結構,并且它支持多處理器系統和硬件加速等。
3DS MAX最基本的功能是三維模型幾何體的建立, 3DSMAX的強大功能還包括它提供的材質編輯器。同時3DSMAX還提供了攝像機,各種燈光,陰影,植被等輔助對象。在本場景中,利用3DSMAX的基礎建模工具,建立基本模型框架,然后對模型進行紋理映射,得到一些基本的建筑模型。
虛擬校區的構建先是要獲取建筑物的所有數據,獲取數據后要初步處理所采集的數據。除去多余的數據,把紋理圖片進行PS處理,同時保持原有數據的精度,統一紋理圖片格式,把數據進行整理分類等,最后整合按照統一的格式存入數據庫,利用這些數據就可以構建某校區虛擬樓群建筑模型以及地形模型。在本文里虛擬校園的三維模型構建流程如圖1所示:
本文依據獲取的某校區平面規劃圖,確定好模型的重要程度和位置次序,依次在相應的位置建模。在這個三維場景中所有物體尺寸與模型尺寸比例是1:1,主要步驟有[2]:
(1)通過采集到的建筑圖紙,包括剖面圖、立面圖、建筑效果圖及平面圖獲取建筑物的建模數據。(2)最終確定建筑物模型的結構。對于大多數房屋來說可以建立基本的幾何體模型,然后給這些幾何體添加材質屬性,對于一些較復雜的建筑物采用高級建模方法多邊形建模技術。(3)開始建模。按照前兩個步驟所確定的方案,根據模型自有的尺寸大小開始建立模型。建模的原則是要快和省。盡量對模型外部能看到的部分建模,那些在里面不需要用到的面可以刪掉或者不建模,原則上盡量用少的面表示建筑物模型,對于能合并的面盡量合并。
建筑物的實體部分采用幾何體建模,設置多個長方體、柱體等建立樓房的實體部分,然后通過不斷調整整合設置,使之符合設計的要求。另外校園里多數的屋頂都是斜坡狀,是不規則的形狀,對屋頂的建模采用多邊形建模,先建立一個長方體,然后轉換為可編輯多邊形進行擠出調整得到房屋的屋頂。
盡管在建模時盡量不建立多余的多邊形,但是建模過程中難免會產生多余的面,最后一步就是要去除多余的多邊形,樓房的底座和樓層之間的連接面都要去除,這樣可以降低場景復雜度,在以后的渲染中也會節省不少時間。
某校區的整體模型如圖2:
在紋理映射部分,需要對已經采集到的數據進行整理分類,并通過軟件處理,獲取符合要求的紋理圖片,對模型對象進行紋理映射,設置好UV,指定貼圖通道,為每個建筑物加上紋理圖片。
3 基于OpenSceneGraph三維引擎的場景漫游實現
OSG場景圖結構封裝并提供了數量眾多的提升程序運行時性能的算法、及幾乎所有主流數據格式的直接數據接口,使用眾多編程語言進行圖形系統的開發。在此基礎上,結合微軟提供的MFC類庫,利用VC++ 2005編程實現了系統的漫游功能,碰撞檢測,自然天氣模擬和當前對象的查詢功能。
將做好的模型導入OSG中,取.ive格式,給路徑場景模型命名lujing.ive。在OSG中,可以通過對攝像機運動的控制,實現漫游,攝像機通過變換它的矩陣來實現運動[3]。MatrixManipulator類是OSG中操作視點的接口方法,它包含向量_homeEye、_homeCenter和_homeUp三個向量成員,分別定義了視點即觀察者的位置、攝像機瞄準的參考點及攝像機的朝向和攝像機的向上向量。用戶只需要改變這三個變量就可以實現對視點的控制來實現漫游功能。對于用戶來說,在實現漫游時,先定義一臺攝像機,每次渲染場景前重新設置相機的狀態,只需要不斷變換外部設備的狀態如位置改變即可[4]。
在OSG中進行場景漫游時可以通過五個虛函數來實現自己的攝像機,它們主要存在于osgGA::MatrixManipulator類中[5]。
osgGA::MatrixManipulator中的一些操作漫游器漫游會經常用到,比如下面辨別方向的設置:
virtual void setCoordinateFrameCallback(CoordinateFrameCallback*cb);這個語句常用來判斷坐標系的更新。
Osg:: CoodinateFrame getCoordinateFrame(const osg::Ve3d&position)const;這個語句取得坐標系。
還有設置向量矩陣或者逆矩陣:endprint
Virtual void setByMatrix(const osg:: Matrixd&matrix)=0;
Virtual osg::Matrixd getMatrix()const=0;
測試結果如下圖3:
Virtual void setByInverseMatrix(const osg:: Matrixd&matrix)=0;
Virtual osg::Matrixd getInverseMatrix()const=0;
根據某校區虛擬場景操作器需求,編寫了My TravelManipulator場景漫游操作器。通過設置矩陣控制Viewer場景管理器,用addCameraManipulator()方法把場景相機加入漫游場景中,使用外部設備控制行走的方向,按下W攝像機往上走,按下S攝像機往下走,按下A攝像機往左走,按下D攝像機往右走。
4 碰撞檢測
本文的漫游系統中,大多數是靜態的物體:建筑樓群和樹木花草類,因此在這個系統中采用“射線/體”相交的碰撞檢測算法[6][7]。OSG中由osgUtil提供進行碰撞檢測的核心函數接口。其中,osgUtil::Hits主要用來進行相交測試,返回交點坐標。osg::LineSegments定義一條用于相交測試的線段或射線,起點和終點都包括任何與線段的交叉都在這里。osgUtil::InterseetVisitor類給相交測試提供初始化設置,訪問場景的每個節點,創建一個列表HitList類的實例。osgUtil::IntersectVisitor::HitList用于返回物體碰撞之后的列表信息,在進行相交測試時,先是創建一條代表視線的線段,再創建一個交叉訪問的實例IntersectVisitor,最后讓創建好的線段在場景中遍歷場景層次,與場景對象進行相交測試。
經過碰撞檢測發現碰撞結果符合本系統的需求。
5 結束語
由此完成了整個校區漫游系統的設計,經過以上測試充分說明這個校區漫游系統實現了所需要的功能如漫游瀏覽場景的實現,在系統中添加了碰撞檢測功能,使系統運行更加逼真,操作更加完善。
參考文獻:
[1]張凱,徐桂生,龍懷冰等.3DSMAx6三維與動畫設計[M].北京:清華大學出版社,2004:2-6.
[2]方麗.虛擬校園的研究與實現[D].碩士學位論文.西安科技大學,2007(19).
[3]肖鵬,劉更代,徐明亮.OpenSceneGraph三維渲染引擎編程指南[M].北京:清華大學出版社,2010:265.
[4]溫轉萍,申閆春.基于OSG的虛擬校園漫游系統的設計與實現[J] .計算機技術與發展,2009,19(01):218-219.
[5]劉少華,張茂軍,張恒.大規模三維地形場景實施漫游系統的構建[J].計算機仿真,2005,22(06):178-182.
[6]范昭煒.實時碰撞檢測技術研究[D].博士學位論文.浙江大學,2003(20).
[7]高麗娜,馬堯海.虛擬漫游中的碰撞檢測問題的解決方法[J].計算機仿真,2006,23(02):189-191.
作者簡介:張慧(1980-),女,河南登封人,工程碩士。endprint