国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

OSG的視景漫游技術(shù)研究

2018-05-25 08:50:56祝新霞馬明棟
關(guān)鍵詞:漫游圖形矩陣

祝新霞,馬明棟

(1.南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210003; 2.南京郵電大學(xué) 地理與生物信息學(xué)院,江蘇 南京 210023)

0 引 言

現(xiàn)如今,虛擬現(xiàn)實(shí)已滲透到人們生活的方方面面[1]。它被認(rèn)為是一種先進(jìn)的科學(xué)技術(shù),相較于傳統(tǒng)的人機(jī)界面以及流行的視窗操作。人們采用一種全新的方式,即通過計(jì)算機(jī)對復(fù)雜數(shù)據(jù)進(jìn)行可視化操作與交互,極大地促進(jìn)了虛擬現(xiàn)實(shí)技術(shù)的發(fā)展[2],廣泛應(yīng)用于科學(xué)計(jì)算可視化、城市規(guī)劃、建筑設(shè)計(jì)、廣告宣傳、醫(yī)療、場景仿真等領(lǐng)域[3]。場景漫游是虛擬現(xiàn)實(shí)的一個(gè)重要應(yīng)用部分,具有人機(jī)實(shí)時(shí)交互特性,可以在虛擬場景中自由行走,不受時(shí)間和空間的限制,實(shí)現(xiàn)真正意義上的交互,給人以身臨其境的感覺。

文中采用OpenSceneGraph三維圖形引擎實(shí)現(xiàn)了一個(gè)虛擬校園場景漫游系統(tǒng),同時(shí)研究了漫游過程中的碰撞檢測技術(shù)。該系統(tǒng)的實(shí)現(xiàn)和設(shè)計(jì)充分體現(xiàn)了OSG在主流三維仿真平臺的優(yōu)勢和潛力,其開源、面向?qū)ο蟮膬?yōu)點(diǎn),可以加快開發(fā)過程,提高渲染效率。

1 OSG(OpenSceneGraph)簡介

OSG具有支持大規(guī)模場景的分頁、粒子系統(tǒng)與陰影、多線程、多顯示的渲染,以及支持各種文件格式等特性[4]。OSG是一個(gè)高性能的開源的跨平臺的圖形開發(fā)三維引擎,諸如飛行器仿真、虛擬現(xiàn)實(shí)、科學(xué)計(jì)算可視化等高性能圖形應(yīng)用程序的開發(fā),就是利用OSG設(shè)計(jì)實(shí)現(xiàn)的[5]。OSG結(jié)合Visual C++開發(fā),其基于場景圖的概念,為圖形程序的開發(fā)提供場景管理和渲染優(yōu)化功能,同時(shí)OSG是一個(gè)基于OpenGL函數(shù)庫的面向?qū)ο罂蚣?,促使開發(fā)者從實(shí)現(xiàn)和優(yōu)化底層圖形的調(diào)用功能的實(shí)現(xiàn)中解放出來,為快速開發(fā)圖形應(yīng)用程序提供了許多附加的實(shí)用工具。

1.1 OSG特點(diǎn)

(1)開源。

OSG跟目前市面上一些商業(yè)化的三維圖形引擎不同,它的所有源碼都是遵循OSGPL開源協(xié)議開發(fā),基于OSG的程序和軟件的使用與發(fā)布無需額外費(fèi)用。

(2)源碼質(zhì)量高。

基于OSG的開源特點(diǎn),它的源碼歷經(jīng)了無數(shù)優(yōu)秀開發(fā)人員的測試和修改,其程序架構(gòu)和執(zhí)行效率都有較好的提升。

(3)跨平臺操作。

OSG支持的操作平臺包括Windows、UNIX、Linux、MacOSX、IRIX、Solaris等多種操作系統(tǒng),可以跨平臺操作,具有較強(qiáng)的可移植性。

(4)可擴(kuò)展性強(qiáng)。

OSG提升了強(qiáng)大的可擴(kuò)展能力,其支持節(jié)點(diǎn)擴(kuò)展、屬性渲染、回調(diào)和交互事件,并支持第三方插件。

1.2 OSG核心庫

OSG核心庫(core library)是OSG存在的基礎(chǔ),核心場景數(shù)據(jù)庫和操作場景圖形的組織和管理都是由OSG核心庫完成的,并且為導(dǎo)入外部數(shù)據(jù)庫提供接口[6]。OSG核心庫主要由以下五個(gè)庫構(gòu)成:

osg庫:作為最基本數(shù)據(jù)庫,提供基本場景圖形構(gòu)建場景圖節(jié)點(diǎn)類、幾何體類,用作向量和矩陣運(yùn)算類。

osgUtil庫:又叫工具庫,提供了通用的公用類,用于場景圖及內(nèi)容操作,統(tǒng)計(jì)和優(yōu)化場景圖形數(shù)據(jù),以及渲染器的創(chuàng)建。

osgDB庫:讀寫數(shù)據(jù)庫,也是一個(gè)文件工具類,提供場景中讀寫數(shù)據(jù)的工作。通過遍歷場景圖層次結(jié)構(gòu)以完成數(shù)據(jù)處理工作,實(shí)現(xiàn)場景圖管理。

osgViewer庫:管理視窗庫,提供場景中視口及可視化內(nèi)容的管理,有利于OSG與各種GUI結(jié)合。

osgGA庫:用于改寫界面事件。

2 OSG的基本理論

2.1 場景圖

場景圖是用于游戲和計(jì)算機(jī)圖形學(xué)等軟件的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)方法,即在抽象的場景中繪制元素組織結(jié)構(gòu)、相互關(guān)系[7]。實(shí)際上大規(guī)模管理場景圖形通常使用樹結(jié)構(gòu)或圖結(jié)構(gòu)組成一組節(jié)點(diǎn)集。當(dāng)前大多數(shù)渲染引擎組織其空間數(shù)據(jù)集皆采用自頂向下且分層的樹狀結(jié)構(gòu),以提高渲染效率。例如渲染場景中包含一輛卡車和一條路況順暢的馬路,由于場景圖的節(jié)點(diǎn)不代表幾何關(guān)系,可申請一個(gè)節(jié)點(diǎn)用來表示移動,如圖1所示。

圖1 場景圖

根節(jié)點(diǎn)一般處于場景圖結(jié)構(gòu)的頂部,由根節(jié)點(diǎn)延伸至各組節(jié)點(diǎn),各自的幾何信息以及用來控制其外觀的渲染狀態(tài)信息均包含在組節(jié)點(diǎn)中。這些節(jié)點(diǎn)皆可沒有或含有多個(gè)子成員。場景圖的底端展示了組成場景中各個(gè)葉節(jié)點(diǎn)的物體實(shí)際信息。圖2表示典型的場景圖樹型結(jié)構(gòu)的組織方式。

圖2 典型場景圖樹型結(jié)構(gòu)

整個(gè)三維場景結(jié)構(gòu)可以由根節(jié)點(diǎn)表示,物體狀態(tài)切換、矩陣變換、細(xì)節(jié)層次等屬性信息可由根節(jié)點(diǎn)延伸的組節(jié)點(diǎn)表示;管理屬性信息的開關(guān)節(jié)點(diǎn)(osg::Switch)、變換節(jié)點(diǎn)(osg::Transform)、細(xì)節(jié)層次節(jié)點(diǎn)(osg::LOD)等是由組節(jié)點(diǎn)派生出來的;葉子節(jié)點(diǎn)(osg::Geode)反映場景空間結(jié)構(gòu)和對象狀態(tài),數(shù)據(jù)節(jié)點(diǎn)之間共有行為和屬性一般通過葉子節(jié)點(diǎn)提取[8]。

場景圖形結(jié)構(gòu)是建在底層API函數(shù)之上的,它為3D程序提供了所需的空間數(shù)據(jù)組織能力及其他特性。OSG程序?qū)哟谓Y(jié)構(gòu)如圖3所示。

圖3 典型OSG程序結(jié)構(gòu)層次模型

2.2 場景圖的渲染機(jī)制

三維場景處于漫游系統(tǒng)中時(shí)被認(rèn)為是靜止的。在實(shí)際設(shè)計(jì)時(shí),使用相機(jī)從場景的不同位置和不同角度去觀察,然后把相機(jī)從不同位置和不同角度拍攝到的“場景”輸出到屏幕,就完成了虛擬場景漫游效果[9]。三維圖像顯示過程如圖4所示。

圖4 三維圖像顯示流程

3 視景漫游實(shí)現(xiàn)

3.1 漫游器概述

人們通常是通過眼睛來觀察事物的,當(dāng)視點(diǎn)發(fā)生移動時(shí),周圍的景物相對于視點(diǎn)在做反向移動,該過程反應(yīng)到大腦,在大腦中形成場景漫游效果。漫游功能實(shí)現(xiàn)在于漫游器的選擇。在OpenSceneGraph中,既可用默認(rèn)漫游器,也可使用自定義的漫游器。

Viewer是場景的核心管理器,即漫游器。在漫游過程中必須根據(jù)響應(yīng)事件的類osgGA::GUIEventHandler來響應(yīng)操作。Viewer通過實(shí)時(shí)修正場景相機(jī)(Camera類)的觀察矩陣(代表觀察者位置和姿態(tài)的矩陣)方法來實(shí)現(xiàn)平滑的場景瀏覽效果[10],因此自定義漫游器就是設(shè)置相機(jī)觀察矩陣的過程。osgGA::CameraManipulator類由osgGA::GUIEventHandler類派生而來,Viewer可以通過設(shè)置矩陣的公共接口和響應(yīng)得到有效控制。一般的場景操作如圖5所示。

圖5 一般的場景操作

3.2 照相機(jī)控制

矩陣為OSG提供了一個(gè)通用模型。在OSG中,不僅所有視圖矩陣操作是通過矩陣完成,而且不同相機(jī)間的交互也是通過矩陣完成[11]。OSG osgGA::CameraManipulator的派生類用來實(shí)現(xiàn)OSG的相機(jī)操作功能,而控制相機(jī)的關(guān)鍵是實(shí)現(xiàn)osgGA::CameraManipulator類的4個(gè)純虛函數(shù):

將水熱預(yù)處理后的微藻生物質(zhì)離心15 min,離心機(jī)轉(zhuǎn)速為 5 000 r·min-1(RCF=5 000×g),取離心后的固體物質(zhì)用于DSC的實(shí)驗(yàn)分析。

virtual voidsetByMatrix(const osg::Matrixd & matrix){} /*設(shè)置相機(jī)的觀察矩陣*/

virtual voidsetByInverseMatrix(const osg::Matrixd& matrix){} /*設(shè)置相機(jī)的視圖矩陣*/

virtualosg::Matrixd getMatrix() const {} /*獲取相機(jī)的觀察矩陣*/

virtualosg::Matrixd getInverseMatrix() const{}/*獲取相機(jī)的視圖矩陣*/

調(diào)用getMatrix來獲得SetByMatrix函數(shù)所需的矩陣,實(shí)現(xiàn)向下一個(gè)照相機(jī)傳遞矩陣。當(dāng)從一個(gè)相機(jī)切換到另一個(gè)相機(jī)時(shí)調(diào)用setByMatrix函數(shù),將上一個(gè)相機(jī)的視圖矩陣傳過來,據(jù)此設(shè)置相機(jī)的初始位置。

getInverseMatrix是變換矩陣的逆矩陣,它會在更新遍歷中被場景相機(jī)調(diào)用,返回當(dāng)前的視圖矩陣。利用這個(gè)方法對時(shí)間進(jìn)行處理,可以改變場景狀態(tài),進(jìn)而在調(diào)用getInverseMatrix矩陣時(shí),改變場景內(nèi)相機(jī)的位置情況[12]。這個(gè)函數(shù)在void Viewer::updateTraversal()中被調(diào)用。

_camera->setViewMatrix(_cameraManipulator->getInverseMatrix());

另外,handle作為主要控制器函數(shù)也是必須的。

virtualbool handle(const osgGA::GUIEvent Adapter & ea,osgGA::GUIActionAdapter& us);

handle方法含有兩個(gè)參數(shù),分別是GUI事件的提供者和對GUI進(jìn)行反饋,可以讓GUIEventHandler根據(jù)輸入事件操作GUI。若要對事件進(jìn)行處理,可由GUIEventHandler繼承得到自己的類,然后將handle方法覆蓋,在繼承的類中對事件進(jìn)行處理。osgProducer::Viewer類維護(hù)一個(gè)GUIEventHandler隊(duì)列,在該隊(duì)列里事件依次傳遞,handle函數(shù)返回值決定此事件是否繼續(xù)讓GUIEventHandler處理,若返回true,停止事件處理;否則GUIEventHandler繼續(xù)對該事件進(jìn)行處理[13]。圖6為實(shí)現(xiàn)方向鍵控制相機(jī)視口的效果圖。

4 碰撞檢測研究

4.1 基本理論

碰撞問題是由用戶的交互和物體的運(yùn)動產(chǎn)生的。實(shí)時(shí)檢測物體的碰撞并計(jì)算出相應(yīng)的碰撞反應(yīng),更新顯示結(jié)果來避免發(fā)生與現(xiàn)實(shí)情景不符的穿透現(xiàn)象[14]。

圖6 方向鍵控制相機(jī)視口的效果圖

處理碰撞檢測的方法有兩種:一是求交器檢測法,二是包圍盒檢測法。求交器檢測法是將遍歷器綁上求交器,以實(shí)現(xiàn)整個(gè)場景的求交過程。常用的有直線求交器和多邊形求交器。因?yàn)橹本€求交器只檢測直線與多邊形的碰撞事件,故多用于判斷鼠標(biāo)點(diǎn)擊事件。該系統(tǒng)要實(shí)現(xiàn)既定功能,應(yīng)使用多邊形求交器。設(shè)置初始值時(shí)需同時(shí)設(shè)置被檢測的多邊形,若此多邊形每幀發(fā)生變化,則每幀都需重新設(shè)定多邊形求交器的參數(shù),就是polytope類型變量,以指定多邊形網(wǎng)格。這一過程消耗時(shí)間較長,又因其默認(rèn)位置為坐標(biāo)原點(diǎn),所以需要獲取真實(shí)的世界坐標(biāo)。

OSG中包圍盒檢測方法也有兩種,分別是用getBound()函數(shù)返回的球形包圍盒和用getBoundingBox()函數(shù)返回的立方體包圍盒。getBoundingBox()的函數(shù)唯獨(dú)Drawable節(jié)點(diǎn)含有,但所有Node節(jié)點(diǎn)卻皆含getBound()函數(shù),故MatrixTransform節(jié)點(diǎn)的getBound()函數(shù)包含位置旋轉(zhuǎn)信息。因?yàn)镸atrixTransform節(jié)點(diǎn)掛載實(shí)體節(jié)點(diǎn),所以只能使用球體包圍盒方法。但球體包圍盒的缺點(diǎn)是范圍不準(zhǔn)確,因此得到的數(shù)據(jù)可能比實(shí)際物體稍微大一點(diǎn)兒。

4.2 系統(tǒng)中實(shí)現(xiàn)方法

該系統(tǒng)采用直線求交器檢測方法。osg::LineSegment為線段類,表示一個(gè)起點(diǎn)和終點(diǎn)構(gòu)成一條線段,如:osg::ref_ptr line=new osg::LineSegment(newPos,m_vPosition)。與節(jié)點(diǎn)的交集接受線段的類是通過osgUtil::IntersectVisitor進(jìn)行判別的,添加一條線段到列表可以通過語句iv.addLineSegment (line.get())實(shí)現(xiàn)。若要將線段隊(duì)列加入到場景中需要借助語句node->accept(iv)。iv.hits()函數(shù)可對物體是否發(fā)生碰撞進(jìn)行辨別,返回TRUE代表物體發(fā)生碰撞,返回FALSE代表物體未發(fā)生碰撞。計(jì)算距離需要確定相交節(jié)點(diǎn)的具體位置,獲得相交節(jié)點(diǎn)的具體位置通過語句osgUtil::IntersectVisitor::HitList hlist實(shí)現(xiàn)。驗(yàn)證碰撞檢測算法的前后效果如圖7所示。

5 結(jié)束語

在虛擬場景中,加快顯示畫面的速度可通過有效管理和組織虛擬場景,提高場景漫游效率來實(shí)現(xiàn)。OSG可以非常簡單方便地對虛擬場景進(jìn)行管理和漫游,是目前技術(shù)較先進(jìn)和性能較好的虛擬現(xiàn)實(shí)開發(fā)包。文中通過實(shí)踐場景漫游的過程,驗(yàn)證了OSG對虛擬場景的漫游原理和發(fā)生碰撞時(shí)的檢測方法,為以后在工程實(shí)踐的應(yīng)用提供了重要的參考依據(jù)。

圖7 碰撞檢測前后效果圖

參考文獻(xiàn):

[1] 王 銳,錢學(xué)雷.OpenSceneGraph三維渲染引擎設(shè)計(jì)與實(shí)踐[M].北京:清華大學(xué)出版社,2009.

[2] 肖 鵬.OpenSceneGraph三維渲染引擎編程指南[M].北京:清華大學(xué)出版社,2010.

[3] MARTZ P.OpenSceneGraph快速入門指導(dǎo)[M].王 銳,錢學(xué)雷,譯.北京:清華大學(xué)出版社,2006.

[4] 楊石興,曹明亮.Step Into OpenSceneGraph[M].鄭州:鄭州大學(xué)虛擬實(shí)現(xiàn)實(shí)驗(yàn)室,2014.

[5] 徐 凌.基于OpenSceneGraph引擎的漫游系統(tǒng)的研究與實(shí)現(xiàn)[D].武漢:武漢理工大學(xué),2008.

[6] 溫轉(zhuǎn)萍,申閆春.基于OSG的虛擬校園漫游系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2009,19(1):217-220.

[7] SHREINER D,WOO M,NEIDER J,et al.OpenGL編程指南[M].鄧鄭詳,譯.第4版.北京:人民郵電出版社,2005.

[8] 申閆春,朱幼虹,曹 莉,等.基于OSG的三維仿真平臺的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)仿真,2007,24(6):207-211.

[9] 張艷麗,譚同德,趙新燦,等.基于OSG的虛擬化學(xué)實(shí)驗(yàn)平臺的構(gòu)建設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(12):2909-2913.

[10] 楊 曉,廉靜靜,張新宇.基于OSG的虛擬場景中包圍盒碰撞檢測的研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2011,21(9):32-34.

[11] YUAN P,WANG S,ZHANG J,et al.Virtual reality platform based on open sourced graphics toolkit OpenSceneGraph[C]//International conference on computer-aided design and computer graphics.[s.l.]:IEEE,2007:361-364.

[12] HIGHT J,NOVAK J.Game development essentials:game project management[M].[s.l.]:Gengage Learning,2010.

[13] ZLATANOVA S,RAHMAN A,SHI W.Topological models and frameworks for 3D spatial objects[J].Computers & Geosciences,2004,30(4):419-428.

[14] 孫 倩,劉晶晶.OSG視景仿真技術(shù)應(yīng)用[J].中國科技信息,2017(3):18-20.

猜你喜歡
漫游圖形矩陣
霹靂漫游堂
NASA漫游記
分圖形
初等行變換與初等列變換并用求逆矩陣
找圖形
矩陣
南都周刊(2015年4期)2015-09-10 07:22:44
矩陣
南都周刊(2015年3期)2015-09-10 07:22:44
矩陣
南都周刊(2015年1期)2015-09-10 07:22:44
圖形變變變
圖形配對
浮山县| 邵阳市| 临沭县| 共和县| 湾仔区| 岱山县| 界首市| 崇明县| 卓尼县| 溆浦县| 哈巴河县| 巴东县| 鲁甸县| 施甸县| 平遥县| 南平市| 商南县| 涞水县| 大港区| 石楼县| 沽源县| 平利县| 洮南市| 休宁县| 昭苏县| 海原县| 毕节市| 溆浦县| 大同县| 东山县| 元阳县| 大埔县| 蒙阴县| 思南县| 长白| 奉新县| 青龙| 图木舒克市| 义马市| 涡阳县| 临江市|