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

摘  要: 碰撞檢測三維漫游中的一項重要功能。通過面向對象圖形渲染引擎(OGRE)構建了一個模擬三維漫游系統,利用OgreNewt結合Newton庫在系統中實現碰撞檢測功能。碰撞檢測包圍盒均采用3DSMax創建,利用OgreNewt中的碰撞檢測樹解析,既保證了碰撞的精確性,又節省了編碼工作量。適用于層次結構較復雜的三維場景的加載和碰撞檢測。
關鍵詞: 碰撞檢測; 三維漫游; 面向對象圖形渲染引擎

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

    建立一個三維漫游系統,首先要構建虛擬場景,主要步驟如下:
    首先建立并取得Root,再讀取所有資源路徑并添加到資源組管理器中,接著創建場景管理器、相機并為相機創建視口;然后創建場景,解析資源配置文件并加載所有資源。漫游需要鍵盤、鼠標等外設控制,需要在程序中創建幀監聽器,以監聽每一幀的變化;最后是對場景進行渲染顯示。
2.2 碰撞檢測
    進行三維漫游時,如果發生碰撞,需要添加碰撞檢測。基于Newton庫,通過OgreNewt建立碰撞檢測步驟及代碼如下:
    (1)創建World
    首先要創建一個碰撞檢測空間:
    OgreNewt::World* m_World = new OgreNewt::World();
    (2)為漫游者添加碰撞檢測包圍盒
    由于漫游采用第一人稱視角,可以有一個基本形狀來表示漫游者。這里通過一個球體來代替:
    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);
    由于這個球體代替漫游者,它與別的物體碰撞時會有力的作用,因此,它既有質量也有慣性。這些值必須要設置:
    Ogre::Vector3 inertia = OgreNewt::MomentOfInertia::CalcSphereSolid(PLAYER_WEIGHT, PLAYER_WIDTH / 2.0);
    m_pPlayerBody->setMassMatrix(PLAYER_WEIGHT,inertia);
  (3)為其他物體添加碰撞檢測包圍盒
     碰撞的作用是相互的,不僅漫游者需要碰撞檢測包圍盒,場景中其他所有物體都需要。在大規模三維場景中,三維模型比較多,形狀也各不相同,因此完全在程序中為每個物體按照其形狀創建包圍盒會極大增加代碼量;如果都用簡單的基本形狀來表示,進行碰撞時又不夠精確。為了解決這一問題,利用碰撞檢測樹和3DSMax配合來實現。首先在空間中創建一個碰撞檢測樹場景解析器TreeCollisionSceneParser,只需要將OGRE場景中的碰撞檢測根節點給它,它就會解析這個根節點所對應的節點樹,并將這棵樹上的所有子節點納入碰撞檢測范圍。關鍵代碼如下:
    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即為碰撞檢測樹根節點,場景中所有其他三維模型的碰撞檢測包圍盒應作為子節點掛在這棵樹上。這些包圍盒都在3DSMax中創建。只要是納入碰撞檢測范圍的模型,就為它添加一個副本,不是特別復雜的模型,副本的形狀、大小、位置可以與模型完全相同;對于較復雜的模型,可以通過基本形狀組合成模型輪廓作為副本。這些副本就是模型的包圍盒。然后將這些包圍盒作為子節點掛在sCollisionRootNode下,最后整個場景就會形成一棵碰撞檢測樹,樹上的所有包圍盒在碰撞時都會被程序檢測到并參加計算。
    (4)注冊回調函數
  漫游者與其他物體發生碰撞時可能會發生位置、方向等的變化,這些變化需要被及時獲知并實時顯示,這一功能可以通過回調函數實現。這里定義兩個回調函數,一個回調函數用于在漫游者受到其他物體的作用力時產生一個速度。主要代碼為:
     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));
      }
     另一個回調函數用于漫游者發生變化時。比如相機切換或漫游者移動,都會發生位置方向的改變,因此需要及時進行變化,主要代碼如下:
    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 運行效果
    在Windows平臺下,基于OGRE1.4.9、OgreNewt 0.11和Newton1.5.3實現了一個具有碰撞檢測的模擬三維漫游系統,其中的三維場景模型采用3DSMax 8創建。圖1為漫游時與墻壁發生碰撞的截圖,圖2為與樹碰撞時的截圖。當發生碰撞時,漫游者將無法前進,必須向其他方向移動才能繞過阻擋物體。墻壁的三維模型不是很復雜,因此碰撞檢測包圍盒的形狀和墻壁相同。而樹的形狀比較復雜,如果用完全相同的形狀會極大增加計算量,因此在3DSMax中為其添加了一個球體加圓柱體的輪廓作為包圍盒,如圖3所示為樹的包圍盒網格。

 

 

    本文介紹了如何在OGRE引擎中,通過OGRENewt結合Newton庫,創建一個具有碰撞檢測的三維漫游系統的方法,并實現了一個模擬系統。所使用的引擎庫皆為開源免費,并具有較高的效率和良好的體驗效果,可以在實際中應用。
參考文獻
[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的駕駛模擬系統的設計與實現[J].交通與計算機,2006,24(1):101-104.

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲欧洲日产国产网站| 日韩视频免费| 欧美日韩精品一二三区| 久久偷窥视频| 久久精品视频在线免费观看| 亚洲夜间福利| 99视频在线精品国自产拍免费观看| 欧美在线在线| 亚洲欧美日韩一区二区三区在线| 亚洲美洲欧洲综合国产一区| 亚洲国产成人不卡| 1024精品一区二区三区| 国产一本一道久久香蕉| 国产日本欧美一区二区| 国产精品久久久久免费a∨| 欧美日韩在线观看视频| 欧美日韩国产大片| 欧美精品成人| 欧美激情视频在线播放| 欧美二区在线播放| 欧美激情第4页| 欧美国产综合一区二区| 欧美国产日韩在线| 欧美韩国一区| 欧美日韩国产综合视频在线观看 | 欧美一区成人| 香蕉久久夜色精品国产| 欧美一区二区三区免费观看视频| 亚洲欧美日韩爽爽影院| 欧美一区二区视频在线观看| 性欧美暴力猛交另类hd| 久久本道综合色狠狠五月| 久久福利毛片| 亚洲欧洲日本国产| 99精品欧美一区| 亚洲一级高清| 午夜精品影院| 欧美在线视频观看| 久久久久久久久久码影片| 久久久www| 欧美1级日本1级| 欧美日韩国产一区精品一区| 欧美日韩中字| 国产精品中文字幕欧美| 国产欧美一区二区三区国产幕精品 | 欧美在线观看视频一区二区| 欧美一二三区精品| 久久精品国产综合精品| 久久久www免费人成黑人精品 | 欧美搞黄网站| 欧美日韩一区综合| 国产精品成av人在线视午夜片| 欧美伦理视频网站| 男人插女人欧美| 欧美激情一区| 欧美日韩免费在线观看| 国产精品国产三级国产普通话三级| 国产精品美女一区二区| 国产欧美日韩综合一区在线观看 | 亚洲国产视频a| 99国产精品久久久| 亚洲天堂av图片| 午夜精品久久久久久久久久久| 欧美伊人久久久久久久久影院| 亚洲电影观看| 夜夜夜久久久| 欧美在线播放一区二区| 久久午夜精品| 欧美精品一区在线播放| 国产精品国产三级国产专区53 | 亚洲精品视频在线播放| 亚洲在线观看视频网站| 久久精品免费播放| 欧美14一18处毛片| 欧美日韩小视频| 国产情人综合久久777777| 在线成人中文字幕| 一本色道久久综合亚洲精品不卡 | 亚洲一区免费观看| 欧美在线free| 亚洲乱码国产乱码精品精天堂| 亚洲资源av| 久久免费精品日本久久中文字幕| 欧美精品乱人伦久久久久久| 欧美性淫爽ww久久久久无| 欧美日韩福利在线观看| 国产一区二区三区直播精品电影| 亚洲三级视频| 欧美一区二区在线播放| 一区二区三区久久| 久久久www成人免费无遮挡大片 | 欧美国产高潮xxxx1819| 国产精品欧美久久久久无广告| 樱桃国产成人精品视频| 9人人澡人人爽人人精品| 久久精品国产91精品亚洲| 这里只有精品在线播放| 久久久久久久久久久成人| 欧美四级电影网站| 伊人精品久久久久7777| 国产精品99久久久久久www| 欧美在线国产| 在线视频亚洲欧美| 免费视频一区| 国产区亚洲区欧美区| 亚洲精品午夜| 最近看过的日韩成人| 在线综合+亚洲+欧美中文字幕| 久久久精品久久久久| 欧美四级伦理在线| 亚洲福利国产精品| 亚洲欧美国产视频| 一区二区三区.www| 免费欧美视频| 国产亚洲精品一区二区| 一区二区三区四区蜜桃| 亚洲第一成人在线| 午夜视频在线观看一区| 欧美精品一区在线| 在线精品视频一区二区| 亚洲欧美国产高清va在线播| 99热精品在线| 欧美顶级大胆免费视频| 国外成人在线| 亚洲欧美国产不卡| 亚洲综合色自拍一区| 欧美日韩一区二区三区| 亚洲国产人成综合网站| 亚洲国产一区二区三区青草影视 | 另类尿喷潮videofree | 狠狠久久亚洲欧美| 亚洲欧美第一页| 午夜国产一区| 欧美视频免费| 99精品热视频| 一级成人国产| 欧美精品观看| 亚洲欧洲日韩在线| 亚洲激情综合| 美女脱光内衣内裤视频久久影院| 国产视频一区欧美| 亚洲一区二区三区在线视频| 亚洲香蕉在线观看| 欧美日韩一区二区三区四区五区 | 亚洲大片在线观看| 久久亚洲国产成人| 国内精品免费在线观看| 欧美影院一区| 午夜欧美大片免费观看| 国产精品午夜久久| 亚洲欧美日韩国产精品| 欧美一区二区免费视频| 国产色爱av资源综合区| 欧美一区二区三区免费视| 久久福利视频导航| 国产伦精品一区二区三区免费迷| 性欧美办公室18xxxxhd| 久久久久久精| 激情偷拍久久| 亚洲国产精品女人久久久| 猫咪成人在线观看| 亚洲成人资源| av成人天堂| 国产精品初高中精品久久| 一区二区三区产品免费精品久久75| 亚洲一区二区三区在线看| 国产精品看片你懂得| 亚洲综合另类| 午夜在线成人av| 国产精品狠色婷| 亚洲字幕在线观看| 巨乳诱惑日韩免费av| 亚洲欧洲在线免费| 亚洲一区二区三区免费视频| 欧美午夜一区二区福利视频| 亚洲天堂av高清| 久久精品视频在线观看| 1024亚洲| 亚洲精品资源美女情侣酒店| 欧美日韩国产成人在线| 亚洲美女一区| 羞羞漫画18久久大片| 国产一区二区高清视频| 亚洲国产精品一区制服丝袜 | 亚洲美女电影在线| 欧美性猛交xxxx乱大交蜜桃| 亚洲综合精品四区| 久久这里只有| 亚洲人成免费| 亚洲综合日韩| 黄色在线一区| 一区二区三区四区五区在线 | 国产精品视频男人的天堂| 欧美一区二视频在线免费观看| 欧美成人日本| 亚洲一级在线| 欧美jjzz| 亚洲欧美大片| 欧美国产亚洲精品久久久8v| 亚洲一区一卡|