OSG 場景的組織結構

OSG 場景的組織結構

本Markdown編輯器使用StackEdit修改而來,用它寫博客,將會帶來全新的體驗哦:

  • 節點的定義與種類
  • 節點的訪問
  • 重要節點的功能實現

節點的定義與種類

osg採用包圍體層次來實現場景圖的管理,這裏的“包圍體”指的是將一組物體完全封閉在一個簡單空間形體中,從而提高各種檢測的運算速度。常見的有包圍球和包圍盒,還記得上一章中的包圍球的定義嗎?
採用包圍體層次的場景圖通常採用梳妝結構來保存信息。一棵場景樹,有一個根節點,多個枝節結點和多個葉子結點,每個節點都有自己的子樹,該結點的包圍體就包圍了其本身及其子樹,每個節點都有包圍體,就構成了層層包圍體。這樣來說,包圍體的層次就清晰分明,對場景對象進行一系列裁剪,相交測試和碰撞測試時就不會互相影響。
-場景節點的基類:Node類
-如果我們希望強制重新計算並獲取包圍球數據,編寫如下代碼
node->dirtyBound();//更新節點的包圍體
osg::BoundingSphere& bs=node->getBound()//獲取包圍球數據,其中自動調用了一些計算類的函數,獲得其中心位置和半徑
-節點類的父子關係這裏需要注意的是,多個父節點共享一個子節點的情形,我們把這種現象稱之爲“實例化”
-爲了管理和設置父節點的列表,我們需要爲Node類增加一系列的接口函數,以例子爲說明,獲取和操作結點的每一個父節點的方法如下:
for(遍歷每個父節點)
{const osg::Group*parent=node.getParent(i);}
-葉節點Geode
假如現有多個可繪製體drawable1,drawable2,需要加入到一個葉結點中,那麼所需編寫的代碼如下:
osg::ref_ptr<osg::Geode>geode=new osg::Geode;
geode->addDrawable(drawable1);
geode->addDrawable(drawable2);//從葉子結點geode中追加一個可繪製對象名爲drawable2

osg::Drawable* drawable=geode->getDrawable(i);//從葉子結點geode中獲取並操作索引位置爲i的可繪製體
-組結點Group類
group->addChild(node);//向組結點中追加一個子節點
osg::Node*anoter_node2=group->gerChild(1);//獲取索引位置爲1的子節點
組結點的子節點可以是另一個組結點,也可以是一個或多個葉子結點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章