4 1 scene graph構建的基本問題

2021-05-23 10:26:48 字數 4168 閱讀 1808

一,概述

scene graph

的目的是組織物體。

兩個原則:

1。空間從屬關係(樹) 2

.render state

的相似性。

原則一是為了快速剔除大批不可見物體。

原則二是為了減少

renderstate

的頻繁改變。

二者均可使遊戲速度大大提高。

原則一通過空間劃分實現(

bounding volumes

),原則通過排序實現。

然而兩個原則是互不相容的。若按

rs排序,物體必然會分散於各個空間。理論上講,兩個原則那個更快就以那個為排序標準。

事實上通常以原則一為準,即先將所有物體按空間從屬關係分塊,確定出可見物體後,再按

rs排序。

以下為scene graph

管理系統的巨集觀結構: 更新

geometric state

(如頂點資料,變換,空間從屬關係等)

render state (

global state

,lights

,effects等)

剔除不可見物體

繪製(呼叫渲染系統)

使用者作出反應

應用程式,回到初始迴圈。 在

wm4中,

culling pass

與drawing pass

完全分開,便於多執行緒渲染。

二,

scene graph的幾個核心類。

關係:geometry

派生於spatial

,node

也派生於

spatial

。spatial

基於object。

spatial

類中封轉了

local transformation

,world transformation

和world bound

等等。

對以上三個名詞的解釋: 1.

世界空間中有乙個房間,房間裡有乙個桌子。將桌子擺到房間裡的變換為

local~ 2

.將房間擺到世界空間中的變換為

world transformation

。同時,桌子也會進行

world transformation 3

每個物體都有自己的

local bound

(基於物體座標系),進行

world transformation

後,local bound

的位置,大小,形狀都有可能變化,變化後成了

world bound。

geometry

類中封裝了所有的物體屬性(

position,index,color,texture coordinates,scale factor,local bounding volume,normals

等等)

除local bound

,其餘屬性都被封裝在

vertexbuffer

和indexbuffer中。

另外,光照通過將

light

類關聯到

geometry

實現(在

geometry

類中儲存乙個

light*

),local effect

通過將shadereffect

類關聯到

geometry

實現。global effect

通過將effect

類關聯到

geometry

實現。

node

類封裝了對物體的組織函式,具體完成如下功能: 1.

在向下遍歷中,先計算父節點的

world transformation

,再利用此

world~

與子節點的

local transformation

相乘得到每個

child

的worldtransformation。

2. 向下遍歷結束後,每個

geometry

會利用計算好的

world transformation

與local bound

相乘得到

world bound。

3. 向上遍歷中,利用每乙個

child

的world bound

計算父節點的

world bound。

注: node

的world bound

乘以world transformation

的逆變換可得

node

的local bound

,但用處不大,所以未能支援,需要時實時計算即可。

node

有world bound

,但沒有

model bound

,因為它只管理物體,本身並不是乙個物體。 每個

geometry

都有自己的

world transformation

和world bound。

三個核心類之間的關係:

geometry

在spatial

的基礎上增添了物體的所有屬性和

local bound,

node

在spatial

的基礎上增添了向子節點的鏈結以及對物體的管理方法。

如此一來,

geometry

只負責物體本身,

node

只負責對物體的管理,使兩個截然不同的概念相互分開,方便了**的維護與擴充套件。

注:一種更簡潔的設計方法是只建立乙個類

node

,它既負責物體屬性,又負責物體組織,這樣做使場景圖更加簡潔,**也更易於使用,但增加了**維護和擴充套件的難度。

三,關於

sharing object

共享類的目的有二:

(1)節省記憶體,避免了大量資料的複製。

(2)節省美工工作量,避免特意製作世界中的每乙個物體。(當然,不能有太強的重複感。) 但本

scene graph

並不支援

node

類和geometry

類的共享,即每乙個節點只允許有乙個父節點,但可以有多個子節點。因為如果支援多個父節點,**開發難度會很大,詳見

p230-232

。實際上,本

scenegraph

仍支援共享,不過是底層的共享,也就是說對vb和

ib 的共享。

四,

controller類和

modifiers

controller

是乙個抽象類,它的作用是實現動畫;而

modifiers

是對一系列類的統稱,它的作用是提供物體屬性的附加資訊,因此,

modifier

通常由geometry

派生而來。

controller

的分類:(詳見

5,7章)

(1)keyframe controller

:用於關鍵幀動畫。美工提供一系列關鍵幀(物體的位置和朝向)

,controller

對其進行平滑插值形成流暢的動畫。

(2)inverse kinematic controller

:用於自動動畫,例如人物去拿杯子,

controller

便會計算出相應的位置和朝向,控制人物的動畫。

(3)vertex and normal controller

:用於網格分解。

(4)render state controller

:用於某些特效,如動態紋理。

(5)index controller

:用於lod

基本思路是物件導向程式設計中的

open-close

原則。

controller

是乙個核心類,基於此派生新類以新增新的特性,但核心架構不發生變化這樣易於維護和擴充套件。

4 1鎖的優化

只在必要時進行同步。指的是縮小鎖定物件的範圍,減少鎖衝突的可能性。比如hashmap concurrenthashmap 減小鎖粒度引來的新問題 當系統需要取得全域性鎖時,其消耗的資源會比較多。屬於減小鎖粒度的一種特殊情況,如果說concurrenthashmap是通過分隔資料結構來減小鎖粒度,那麼...

例題4 1 古老的密碼

給定兩個長度相同且不超過100 的字串 判斷是否能把其中乙個字串的各個字母重排 然後對26個字母做乙個一一對映,使得兩個字串相同。例如 jwpudjstvp 重排 後可以得到wjdupsjpvt 然後把每個字母對映到到前乙個字母 得到victorious。輸入兩個字串 輸出yes 或者是 no 分析...

41 整數序列的查詢

題目描述 輸出所有和為 s 的連續正數序列。序列內按照從小至大的順序,序列 間按照開始數字從小到大的順序 思路 定義兩個指標,分別遞增,尋找和為 s 的序列。實現 public arraylist findcontinuoussequence int sum int small 1 int big ...