OSG結點的父子索引變化

2021-07-12 00:18:17 字數 1348 閱讀 8536

最近在做osg的相關專案研發,在大場景下結點自然會多,結點的操作也就會帶來很多問題。寫這篇文章的目的就是希望可以幫助osg研發工作者節省一些時間,好的,進入正題。謝謝**,如有問題,請給予指正。

首先,要知道對定義的osg結點new了或對它們賦值了,它們就在記憶體中真實存在了,osg結點在記憶體中都有一系列的資料,包括結點名字、結點的所有父親的位址、結點所有孩子的位址、及它們的索引等等。

情形1、osg::ref_ptr型別結點root,root下加三個孩子osg::ref_ptr型別結點node1、node2、node3,程式會按加的順序記錄索引,此時root會記錄node1、node2、node3分別為孩子0、1、2,node1、node2、node3也都會記錄root為它們的父親0,這是最基本的情況,想必大家都是知道的。

情形2、在情形1的情況下,假設node1下面還有一些孩子結點,也就是node1為一樹,使用root->removechild(node1); ///移除root下的node1結點,node1的樹關係不會變 

removechild函式會解除父子關係,對於root,root會把node1在自身記憶體資料判斷查詢,找到後識別為孩子0索引,刪除所有其相關資訊,然後對孩子索引重排,重排按照後續孩子前後關係不變的原則,node2變為root孩子0,node3變為root孩子1。對於node1,它會刪除記錄的父親root的資訊,變為無父親,但記住,只要沒有對node1指標清零,這個節點的資料還是存在的,還可以再次利用。

情形3、在情形1的情況下,定義型別osg::ref_ptf的transform變化結點。

操作 root->replacechild(node1, transform) ///想當先呼叫root->removechild(node1);再呼叫root->addchild(transform)

///也就是root下node2為0孩子,node3為1孩子,transform為2孩子。

tansform->addchild(node1); ///node1的父親0為transform,假設node1還有其他父節點,那麼結果就是tansform是其最後乙個父親了。

經常使用這兩段**對場景根下的某個結點進行位置變換,所以,使用孩子取代函式replacechild並不是對被取代結點和取代結點進行簡單的替換,而是每進行一次這樣的操作會把取代結點transform作為root根節點的最後乙個孩子索引,被取代節點node1也是把取代結點作為最後乙個父親。

情形4、當執行了view->setscenedata(root); 之後root結點叢沒有父親變為有乙個父親,型別就是osg的照相機結點osg::camera。

當程式中要顯示多個視窗時,會定義多個osg::ref_ptr型別變數,可能多個場景照相機指向同個結點,所以不要忘了osg::camera結點在其中的參與的索引變化。

Oracle 樹狀 父子結點 查詢方法 倒敘查詢

旨在記錄一些oracle使用中遇到的各種各樣的問題.同時希望能幫到和我遇到同樣問題的人.問題描述 在資料庫中,有一種比較常見得 設計模式,層級結構 設計模式,具體到 oracle table中,字段特點如下 id,dsc,pid 三個字段,分別表示 當前標識的 id 主鍵 dsc 當前標識的描述,p...

《OSG3 4 0》Part2 OSG中的多執行緒

osg中的多執行緒 osg中的多執行緒是通過openthreads實現的。主要有七大類 thread 預設建構函式 static int yieldcurrentthread 要求當前執行緒出讓cpu控制權,交給其他正在等待的執行緒 int start 啟動執行緒。此時將自動開始執行執行緒的run ...

OSG學習筆記15 OSG中對事件的處理

看了王銳大大的書,我感覺osg中對事件的處理主要是由以下幾塊組成的 1 事件介面卡 guieventadapter 這個類是作為系統互動事件和osg互動事件的適配介面。這一句話還不是很理解。原始碼文件裡對於這個類的定義是 事件類,儲存鍵盤 滑鼠和視窗事件。公有型別包括 這些型別都是列舉型別,每個型別...