OSG updateTraversal(更新遍歷)

OSG 的更新遍歷函數updateTraversal 在系統每幀的執行過程中有着重要的地位,除了
處理用戶的更新回調對象之外,還要負責更新攝像機的位置,並且更新分頁數據庫
DatabasePager 和圖像庫ImagePager 的內容。這裏我們首先對它的流程做一個概述:
1、獲取函數的起始時刻。
2、使用預設的更新訪問器_updateVisitor,訪問場景圖形的根節點並遍歷其子節點,實
現各個節點和Drawable 對象的更新回調。
3、使用DatabasePager::updateSceneGraph 函數以及ImagePager::updateSceneGraph 函數,
分別更新場景的分頁數據庫和分頁圖像庫。
4、處理用戶定義的更新工作隊列_updateOperations。
5、執行主攝像機_camera 以及從攝像機組_slaves 的更新回調(但是不會遍歷到它們的
子節點),注意攝像機回調的執行時機與場景節點還是有所區別的。
6、根據漫遊器_cameraManipulator 的位置姿態矩陣,更新主攝像機_camera 的觀察矩陣。
注意這裏使用的函數是MatrixManipulator::getInverseMatrix,根據第七日介紹的內容,攝像
機在世界座標系中的位置姿態矩陣,即是其觀察矩陣的逆矩陣,由是可得。
7、使用View::updateSlaves 函數更新從攝像機組_slaves 中所有攝像機的投影矩陣,觀
察矩陣和場景篩選設置(CullSettings)。
8、獲取函數的結束時刻,將相關的時刻信息保存到記錄器中。
不要以爲我們對這個函數的介紹就這麼草草地完結了。事實上,在瀏覽更新遍歷的執行
流程時,我們已經遇到了一大堆之前沒有提及的概念,如果不從中好好地發掘一番,“最長
的一幀”這個標題恐怕就徒有虛名了(其實本來就徒有虛名)。
首先是更新工作隊列_updateOperations 的問題。第四日中我們曾介紹過可以使用
ViewerBase::setRealizeOperation 來自定義的場景預處理工作,更新工作的作用及實現方法與
之相似,均需要繼承osg::Operation 並重寫operator()操作符,以實現一些特定的用戶操作。
不過在這裏,用戶可以使用ViewerBase::addUpdateOperation 寫入多組更新處理器Operation
對象(或者使用對應的成員函數removeUpdateOperation 來移除),因此可以實現的操作也更加豐富。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章