1. 程式人生 > >場景樹和空間圖

場景樹和空間圖

場景樹

這是整個場景的一個層次結構的表示,通過一棵簡單的樹來實現:一個“節點”有一個父親和任意數量的孩子。這個資料結構用來管理層次結構的物體變換(位置和方向),以及他們的動畫。
在FlExtEngine中,CSceneNode類擁有一個update方法,用於對node的變換進行更新;它還有一個accept方法,這樣就可以使用訪問者模式以實現更好的擴充套件性。

空間圖

這是整個場景的一個空間關係的表示,是通過有向無環圖的形式來表示的:將世界分成不同的區域,以實現高效的可視性揀選,這些區域中存放著繪製的物體。
類CSpatialNode中有一個cull函式來進行可視性判斷,它也有一個accept函式,同樣可以使用訪問者模式來達到可擴充套件。
為了讓訪問者(Visitor)能夠在空間分割節點和其中存放物體的節點之間區別開來,從CSpatialNode類構造了一個類CSpatialBranch,CSpatialBranch是所有節點的基類;同時構造了一個CSpatialLeaf類,該類是儲存在空間圖中的物體的基類。
有很多空間劃分的演算法可供使用,我會快速介紹幾個通用的:

八叉樹(The Octree)

八叉樹從一個包圍整個世界的節點開始,然後將這個節點沿著X,Y,Z軸進行分割,等分成八個子節點,這樣遞迴下去直到一個給定的層級(level)。通常,一個物體儲存在完整的包含它的一個節點中,這樣做導致了將很多節點移動到了它本來應該在的節點的上一層節點中了,從而降低了揀選的效率。該問題的一個解決辦法是鬆散八叉樹(Loose Octree),和上面一個節點正好嚴格的等分成八個子節點不同,該方法中子節點的大小可以輕微的膨脹(比如10-25%);這樣的話,以前因為很小一部分不適合該節點的物體,現在就可以放在該節點當中了。


八叉樹在魔域幻境之浴血戰場中用於存放遊戲角色。

四叉樹(The quadtree)

四叉樹的3D版本便是八叉樹,一棵四叉樹從一個包圍整個世界的節點開始,然後沿著X,Y軸分割。四叉樹一般用於將地形分割成塊,它也可以像八叉樹那樣使用(適合在2D場景中)。
四叉樹在虛幻2引擎中用於儲存地形。

BSP樹



BSP樹,全稱叫做二分空間樹,從任意一個平面開始,該平面將世界一分為二,然後遞迴的用平面進行分割,直到一個節點擁有了給定數量的三角形。和八叉樹以及四叉樹不同的是,在BSP樹中,只有葉子節點中才儲存三角形。
BSP樹在ID software的許多作品中使用了,例如雷神之錘(Quake),雷神之錘II,雷神之錘III 競技場中,用於存放世界的集合資訊。

KD樹

KD-樹中,K是樹的子節點的最大個數,表示樹種有多少個軸可以用來產生切割平面。在BSP樹中可以有任意的平面來分割世界,而在KD樹中,只能沿著某個K軸來產生切割平面。

Sectors and portals

Sector/Portal: that scheme divides the world into convex Sectors, which are connected (one or two way) with Portals. The Sectors are to be convex for the system to work best, as then, there's the guarantee that from any point inside the Sector, any other point might be visible.
The Sector and Portal scheme has been used along with a BSP in Doom III and Quake IV.

The adaptive binary tree

ABT樹和BSP樹有點類似,不同的地方是它的實時更新的,當一個分支含有的節點或者物體的比例太小時,這個分支會重新計算來使得存放在裡面的物體最適合。
ABT樹使用在vTales Grahpics公司。