《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 設(shè)計(jì)應(yīng)用 > 碰撞檢測在三維場景漫游中的研究與實(shí)現(xiàn)
碰撞檢測在三維場景漫游中的研究與實(shí)現(xiàn)
來源:微型機(jī)與應(yīng)用2012年第24期
王良燕, 高 敏
安徽三聯(lián)學(xué)院, 安徽 合肥230601
摘要: 碰撞檢測是三維漫游中的一項(xiàng)重要功能。通過面向?qū)ο髨D形渲染引擎(OGRE)構(gòu)建了一個(gè)模擬三維漫游系統(tǒng),利用OgreNewt結(jié)合Newton庫在系統(tǒng)中實(shí)現(xiàn)碰撞檢測功能。碰撞檢測包圍盒均采用3DSMax創(chuàng)建,利用OgreNewt中的碰撞檢測樹解析,既保證了碰撞的精確性,又節(jié)省了編碼工作量。適用于層次結(jié)構(gòu)較復(fù)雜的三維場景的加載和碰撞檢測。
Abstract:
Key words :

摘  要: 碰撞檢測三維漫游中的一項(xiàng)重要功能。通過面向?qū)ο髨D形渲染引擎(OGRE)構(gòu)建了一個(gè)模擬三維漫游系統(tǒng),利用OgreNewt結(jié)合Newton庫在系統(tǒng)中實(shí)現(xiàn)碰撞檢測功能。碰撞檢測包圍盒均采用3DSMax創(chuàng)建,利用OgreNewt中的碰撞檢測樹解析,既保證了碰撞的精確性,又節(jié)省了編碼工作量。適用于層次結(jié)構(gòu)較復(fù)雜的三維場景的加載和碰撞檢測。
關(guān)鍵詞: 碰撞檢測; 三維漫游; 面向?qū)ο髨D形渲染引擎

    虛擬現(xiàn)實(shí)是當(dāng)今計(jì)算機(jī)領(lǐng)域的一項(xiàng)熱門技術(shù),其中一個(gè)重要功能是虛擬三維漫游,實(shí)現(xiàn)這一功能需要借助計(jì)算機(jī)圖形引擎。OGRE[1]是一款專門處理三維場景的圖形引擎,具有開源免費(fèi)、跨平臺等多種優(yōu)點(diǎn),目前在虛擬現(xiàn)實(shí)領(lǐng)域已有非常廣泛的應(yīng)用[2-3]。
    實(shí)現(xiàn)三維漫游需要考慮的一個(gè)重要問題是碰撞檢測,OGRE引擎本身不具備這項(xiàng)功能,需要借助第三方引擎實(shí)現(xiàn),常用的第三方引擎庫有Newton[4]、ODE[5]等。Newton在碰撞檢測方面性能更出色,它是一款開源免費(fèi)的碰撞檢測引擎庫,OgreNewt是對Newton庫的一層面向?qū)ο蠓庋b。可以結(jié)合OgreNewt和OGRE,在三維場景中實(shí)現(xiàn)碰撞檢測功能。本文主要探討如何在OGRE基礎(chǔ)上,結(jié)合OgreNewt及Newton庫,實(shí)現(xiàn)具有碰撞檢測功能的三維漫游系統(tǒng)。
1 OGRE、Newton和OgreNewt
    OGRE是用C++開發(fā)的跨平臺的3D引擎,底層基于OpenGL和DirectX實(shí)現(xiàn),具有高效的三維場景管理性能,能很好地兼容第三方庫以實(shí)現(xiàn)一些特定功能。一個(gè)基本的OGRE系統(tǒng)主要包括Root、SceneManager、Entity、SceneNode、Material和Camera等幾部分。Root是整個(gè)系統(tǒng)的入口點(diǎn),通過它可以獲取系統(tǒng)中的其他對象。Entity是三維物體模型,Material是模型的材質(zhì),每個(gè)Entity 都掛載到一個(gè)SceneNode上,所有SceneNode共同組成一個(gè)樹狀結(jié)構(gòu),由SceneManager統(tǒng)一管理。通過Camera來實(shí)現(xiàn)觀看場景。
    OGRE引擎通過OgreNewt與Newton庫銜接。OgreNewt通過Newton庫中的一些基本的元素來描述物理世界,主要包括World、Collision和Body等。World是最基本的類,通過它可以建立一個(gè)空間,所有其他物體都在這個(gè)空間里創(chuàng)建。空間中的物體參加碰撞檢測時(shí)需要有一個(gè)包圍盒,通過包圍盒計(jì)算來判斷是否發(fā)生了碰撞,Collision用于定義包圍盒的形狀,基本形狀有Boxes、Ellipsoids、Cylinders、Capsules等。Body用于定義碰撞檢測包圍盒的實(shí)體,它可以與空間中的其他實(shí)體相互作用,比如發(fā)生碰撞、摩擦等。它需要根據(jù)Collision定義好的形狀來創(chuàng)建。此外還有Joint、MaterialID、MaterialPair等,都有其他用途。
2 三維漫游系統(tǒng)
2.1虛擬場景構(gòu)建

    建立一個(gè)三維漫游系統(tǒng),首先要構(gòu)建虛擬場景,主要步驟如下:
    首先建立并取得Root,再讀取所有資源路徑并添加到資源組管理器中,接著創(chuàng)建場景管理器、相機(jī)并為相機(jī)創(chuàng)建視口;然后創(chuàng)建場景,解析資源配置文件并加載所有資源。漫游需要鍵盤、鼠標(biāo)等外設(shè)控制,需要在程序中創(chuàng)建幀監(jiān)聽器,以監(jiān)聽每一幀的變化;最后是對場景進(jìn)行渲染顯示。
2.2 碰撞檢測
    進(jìn)行三維漫游時(shí),如果發(fā)生碰撞,需要添加碰撞檢測。基于Newton庫,通過OgreNewt建立碰撞檢測步驟及代碼如下:
    (1)創(chuàng)建World
    首先要?jiǎng)?chuàng)建一個(gè)碰撞檢測空間:
    OgreNewt::World* m_World = new OgreNewt::World();
    (2)為漫游者添加碰撞檢測包圍盒
    由于漫游采用第一人稱視角,可以有一個(gè)基本形狀來表示漫游者。這里通過一個(gè)球體來代替:
    OgreNewt::CollisionPrimitives::Ellipsoid sphere(m_pWorld, Ogre:: Vector3(PLAYER_WIDTH/2.0, PLAYER_WIDTH/2.0,
PLAYER_WIDTH/2.0));
    m_pPlayerBody=new OgreNewt::Body(m_pWorld, &sphere);
    由于這個(gè)球體代替漫游者,它與別的物體碰撞時(shí)會有力的作用,因此,它既有質(zhì)量也有慣性。這些值必須要設(shè)置:
    Ogre::Vector3 inertia = OgreNewt::MomentOfInertia::CalcSphereSolid(PLAYER_WEIGHT, PLAYER_WIDTH / 2.0);
    m_pPlayerBody->setMassMatrix(PLAYER_WEIGHT,inertia);
  (3)為其他物體添加碰撞檢測包圍盒
     碰撞的作用是相互的,不僅漫游者需要碰撞檢測包圍盒,場景中其他所有物體都需要。在大規(guī)模三維場景中,三維模型比較多,形狀也各不相同,因此完全在程序中為每個(gè)物體按照其形狀創(chuàng)建包圍盒會極大增加代碼量;如果都用簡單的基本形狀來表示,進(jìn)行碰撞時(shí)又不夠精確。為了解決這一問題,利用碰撞檢測樹和3DSMax配合來實(shí)現(xiàn)。首先在空間中創(chuàng)建一個(gè)碰撞檢測樹場景解析器TreeCollisionSceneParser,只需要將OGRE場景中的碰撞檢測根節(jié)點(diǎn)給它,它就會解析這個(gè)根節(jié)點(diǎn)所對應(yīng)的節(jié)點(diǎn)樹,并將這棵樹上的所有子節(jié)點(diǎn)納入碰撞檢測范圍。關(guān)鍵代碼如下:
    Ogre::SceneNode* pRootNode =
             Ogre::Root::getSingleton().getSceneManager(DEFAULT_
            SCENE_MANAGER)
             ->getSceneNode(sCollisionRootNode.c_str());
    OgreNewt::CollisionPrimitives::TreeCollisionSceneParser
        parser(m_pWorld);
     parser.parseScene(pRootNode, true);
     OgreNewt::Body* pRootBody=new OgreNewt::Body(m_p
        World, &parser);
    pRootBody->attachToNode(pRootNode);
    sCollisionRootNode即為碰撞檢測樹根節(jié)點(diǎn),場景中所有其他三維模型的碰撞檢測包圍盒應(yīng)作為子節(jié)點(diǎn)掛在這棵樹上。這些包圍盒都在3DSMax中創(chuàng)建。只要是納入碰撞檢測范圍的模型,就為它添加一個(gè)副本,不是特別復(fù)雜的模型,副本的形狀、大小、位置可以與模型完全相同;對于較復(fù)雜的模型,可以通過基本形狀組合成模型輪廓作為副本。這些副本就是模型的包圍盒。然后將這些包圍盒作為子節(jié)點(diǎn)掛在sCollisionRootNode下,最后整個(gè)場景就會形成一棵碰撞檢測樹,樹上的所有包圍盒在碰撞時(shí)都會被程序檢測到并參加計(jì)算。
    (4)注冊回調(diào)函數(shù)
  漫游者與其他物體發(fā)生碰撞時(shí)可能會發(fā)生位置、方向等的變化,這些變化需要被及時(shí)獲知并實(shí)時(shí)顯示,這一功能可以通過回調(diào)函數(shù)實(shí)現(xiàn)。這里定義兩個(gè)回調(diào)函數(shù),一個(gè)回調(diào)函數(shù)用于在漫游者受到其他物體的作用力時(shí)產(chǎn)生一個(gè)速度。主要代碼為:
     void CBasicInputListener::CustomForceAndTorqueCallback
        (OgreNewt::Body* me)
    {    SceneNode* pPlayerNode =
            Root::getSingleton().getSceneManager(DEFAULT_
                SCENE_MANAGER)->
           getSceneNode(DEFAULT_CAMERA_NODE);
          me->setVelocity(pPlayerNode->getWorldOrientation()*
         m_TranslateVector + Vector3(0, -DEFAULT_GRAVI-
        TY, 0));
      }
     另一個(gè)回調(diào)函數(shù)用于漫游者發(fā)生變化時(shí)。比如相機(jī)切換或漫游者移動(dòng),都會發(fā)生位置方向的改變,因此需要及時(shí)進(jìn)行變化,主要代碼如下:
    void CBasicInputListener::CustomTransformCallback(Ogre
        Newt::Body* me, const Quaternion& orient, const
        Vector3& pos)
     {    ……
          pPlayerNode->setPosition(pos.x,     
             pos.y + PLAYER_HEIGHT - PLAYER_WIDTH
            /2.0, pos.z);    
         ……
     }
3 運(yùn)行效果
    在Windows平臺下,基于OGRE1.4.9、OgreNewt 0.11和Newton1.5.3實(shí)現(xiàn)了一個(gè)具有碰撞檢測的模擬三維漫游系統(tǒng),其中的三維場景模型采用3DSMax 8創(chuàng)建。圖1為漫游時(shí)與墻壁發(fā)生碰撞的截圖,圖2為與樹碰撞時(shí)的截圖。當(dāng)發(fā)生碰撞時(shí),漫游者將無法前進(jìn),必須向其他方向移動(dòng)才能繞過阻擋物體。墻壁的三維模型不是很復(fù)雜,因此碰撞檢測包圍盒的形狀和墻壁相同。而樹的形狀比較復(fù)雜,如果用完全相同的形狀會極大增加計(jì)算量,因此在3DSMax中為其添加了一個(gè)球體加圓柱體的輪廓作為包圍盒,如圖3所示為樹的包圍盒網(wǎng)格。

 

 

    本文介紹了如何在OGRE引擎中,通過OGRENewt結(jié)合Newton庫,創(chuàng)建一個(gè)具有碰撞檢測的三維漫游系統(tǒng)的方法,并實(shí)現(xiàn)了一個(gè)模擬系統(tǒng)。所使用的引擎庫皆為開源免費(fèi),并具有較高的效率和良好的體驗(yàn)效果,可以在實(shí)際中應(yīng)用。
參考文獻(xiàn)
[1] http://www.ogre3d.org/
[2] Xie Mei, Zhen Zheng, Zhang Fan, et al. A cross-platform  extendable 3D Virtual Reality system based on OGRE and Python[C]. Communications, Circuits and Systems, 2009. ICCCAS 2009:502-506.
[3] Liu Xiuling, Du Huanping, Wang Hongrui,et al. Design  and development of a distributed Virtual Reality system[C]. Machine Learning and Cybernetics, 2009:889-894.
[4] http://newtondynamics.com/.
[5] 高嵩,陳先橋,楊菊.基于OGRE和ODE的駕駛模擬系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].交通與計(jì)算機(jī),2006,24(1):101-104.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲午夜精品国产| 一本在线高清不卡dvd| 亚洲美女性视频| 亚洲国产成人tv| 精品999网站| 今天的高清视频免费播放成人 | 亚洲精品偷拍| 亚洲国产精品激情在线观看| 亚洲高清免费| 亚洲全黄一级网站| 亚洲欧洲在线免费| 亚洲伦理中文字幕| 一二美女精品欧洲| 亚洲视频在线观看免费| 亚洲一二三区在线| 午夜精品一区二区三区四区| 亚洲欧美一区二区视频| 午夜精品在线| 欧美在线视频一区二区三区| 久久精品国产欧美激情| 亚洲欧美另类国产| 亚洲影院污污.| 亚洲欧美日韩国产另类专区| 亚洲欧美日韩综合aⅴ视频| 亚洲专区在线| 羞羞答答国产精品www一本| 欧美在线观看视频| 亚洲国产精品一区| 亚洲精品资源| 亚洲一二三区精品| 欧美在线精品免播放器视频| 久久精品理论片| 麻豆精品在线观看| 欧美人妖在线观看| 国产精品视频成人| 韩日午夜在线资源一区二区| 亚洲福利视频在线| 日韩一级大片| 香蕉视频成人在线观看| 亚洲国产另类 国产精品国产免费| 亚洲日本在线观看| 亚洲一区二区精品在线| 久久大逼视频| 欧美激情二区三区| 国产精品户外野外| 黄色成人av网| 日韩午夜在线电影| 性久久久久久久久| 日韩视频在线免费| 欧美亚洲一区在线| 免费成人毛片| 国产精品国内视频| 揄拍成人国产精品视频| aa亚洲婷婷| 亚久久调教视频| 亚洲毛片网站| 欧美一级黄色录像| 欧美激情亚洲一区| 国产视频欧美视频| 日韩视频免费| 久久精品道一区二区三区| 一区二区欧美视频| 久久久久久一区二区| 欧美日韩国产系列| 国产揄拍国内精品对白| 亚洲精品在线二区| 欧美亚洲综合另类| 亚洲午夜一级| 蜜臀av国产精品久久久久| 国产精品久久久久三级| 亚洲国产欧洲综合997久久| 亚洲一区久久久| 日韩午夜精品视频| 久久先锋资源| 国产精品久久久一区二区三区| 亚洲高清在线精品| 午夜国产一区| 亚洲一区二区三区涩| 女同性一区二区三区人了人一| 国产精品呻吟| 一本色道久久综合亚洲精品不 | 久久精品二区亚洲w码| 欧美福利在线| 国产热re99久久6国产精品| 99精品国产在热久久| 亚洲国产精品成人精品| 性欧美超级视频| 欧美日韩在线视频一区| 亚洲国产一区二区三区青草影视 | 欧美日韩在线不卡| 亚洲高清视频一区二区| 欧美综合激情网| 欧美一二区视频| 国产精品久久久久久久第一福利| 亚洲高清自拍| 亚洲激情一区二区| 久久久久久夜精品精品免费| 国产精品日韩在线| 一区二区不卡在线视频 午夜欧美不卡'| 最新亚洲视频| 久久久久久久999| 国产精品亚发布| 亚洲网站视频福利| 在线视频欧美一区| 欧美精品在线观看播放| 亚洲第一页在线| 亚洲激情综合| 久久av资源网站| 国产欧美日韩伦理| 亚洲欧美日韩第一区| 亚洲欧美日韩中文在线制服| 欧美视频在线观看| 一本一本久久a久久精品牛牛影视| 一区二区精品| 欧美日韩在线一区二区| 亚洲精品乱码久久久久久按摩观| 亚洲国产日韩欧美在线动漫| 久久亚洲国产成人| 国产一区二区在线观看免费| 香蕉久久国产| 久久久久久91香蕉国产| 好看的av在线不卡观看| 久久国产直播| 欧美11—12娇小xxxx| 亚洲成色最大综合在线| 亚洲国内精品在线| 欧美成人午夜剧场免费观看| 亚洲国产精品一区二区三区| 亚洲乱码国产乱码精品精可以看 | 欧美在线观看一区| 久久久久久9999| 亚洲第一黄色| aa级大片欧美| 欧美小视频在线| 亚洲欧美日韩精品综合在线观看| 久久av最新网址| 伊人久久亚洲影院| 亚洲精品小视频在线观看| 欧美精品电影在线| 一本色道久久综合亚洲二区三区| 亚洲免费影视| 国产日韩欧美三级| 亚洲国产成人在线| 欧美黑人在线播放| 一本色道88久久加勒比精品| 亚洲免费中文| 国产亚洲va综合人人澡精品| 久久国产精品99精品国产| 欧美成人r级一区二区三区| 亚洲精品中文字幕女同| 亚洲综合首页| 韩国精品久久久999| 亚洲免费精品| 欧美午夜理伦三级在线观看| 性一交一乱一区二区洋洋av| 欧美r片在线| 99伊人成综合| 久久成人精品一区二区三区| 黑人巨大精品欧美一区二区| 亚洲乱码国产乱码精品精98午夜| 国产精品扒开腿爽爽爽视频 | 伊人天天综合| 亚洲无亚洲人成网站77777| 国产欧美日韩不卡| 亚洲伦理在线免费看| 国产精品免费一区豆花| 久久国产精品99久久久久久老狼| 欧美精选午夜久久久乱码6080| 亚洲综合丁香| 欧美精品18+| 亚洲一区二区在线视频| 美国十次了思思久久精品导航| 日韩亚洲精品电影| 久久久激情视频| aa成人免费视频| 麻豆精品精品国产自在97香蕉| 99re成人精品视频| 久久久久国产一区二区| 日韩亚洲欧美中文三级| 久久久久久色| 亚洲午夜精品久久久久久app| 美女任你摸久久| 亚洲一区二区三区久久| 欧美a级理论片| 性感少妇一区| 欧美三区免费完整视频在线观看| 欧美一区二区三区视频免费播放| 欧美久久久久免费| 久久激情五月婷婷| 国产精品女主播在线观看| 亚洲精品一二| 国产亚洲精品久久飘花| 中文一区二区在线观看| 一区免费观看视频| 性色av香蕉一区二区| 亚洲美女区一区| 欧美ed2k| 亚洲第一成人在线| 国产美女精品人人做人人爽| 一区二区久久久久|