探索未知種族之osg類生物---器官初始化一

探索未知種族之osg類生物---器官初始化一
我們把ViewerBase::frame()比作osg這類生物的肺,首先我們先來大概的看一下‘肺’長什麼樣子,有哪幾部分組成。在這之前得對一些固定的零件進行說明,例如_done代表osg的viewer是否被刪除釋放內存;_firstFrame代表是否是第一次進入frame函數。那麼接下來我們會發現frame函數表面上組成結構非常簡單,邏輯上也非常的清晰---先判斷當前的viewer是否被刪除,也就是判斷是否died,如果已經died,那麼肺的功能就不會進行。然後判斷這個osg小孩是否剛剛出生,是的話就要執行一些初始化工作---嚎啕大哭。最後剩下的四個函數就是一個正常的osg生物的肺周而復始進行的工作。

我們一步步來,首先看看剛剛生下來的osg寶寶爲什麼會哭,對osg整體產生了什麼樣的影響。進入第一個函數viewerInit(),ViewerBase::ViewerInit是純虛函數,代表他的實現由他的子類完成,上一節我們研究了osg生物兩種存在形式時,就已經定義了目前正在進行工作的viewer是哪一個,所以我們直接到osgViewer::Viewer(是ViewerBase的子類)下看看他的ViewerInit函數。經過複雜的拆解工作,終於發現ViewerInit是在osgViewer::Viewer的頭文件中定義並且實現的。並且它的功能非常簡單就是簡單的調用init()方法。而這個init方法又是在那個類裏面定義的呢。Viewer類分別繼承了osgViewer::ViewerBase以及osgViewer::View。Init既然在osgViewer::ViewerBase和osgViewer::Viewer中都沒有記錄,那麼肯定是在osgViewer::View中定義和實現的。我們這裏就有一個疑問Viewer和View到底有什麼區別。從名字上我們有一個大概的區分Viewer視景器,View視圖風景。簡單的理解Viewer就是View的操作器,osgViewer::View就是持有場景中的一張景色。仔細的你們一定會發現osgViewer::View繼承自osg::View以及osgGA::GUIActionAdapter. osgGA::GUIActionAdapter我們先不進行詳解要不就跑偏太遠了,先介紹osg::View. osg::View我們看作是場景中一系列相機的掌管者。好了。我們這些就先說到這裏,趕緊趁着剛剛打開的osg的肺還有失去動力之前回去繼續看看。

探索未知種族之osg類生物---器官初始化一

進入osgViewer::View::init()函數,這是一個新的身體零件,和研究frame()函數的思路一樣,我們先認識它內部的固定零件:_eventQueue代表空的osg內的事件隊列—這個我們以後再介紹,_cameraManipulator代表相機的操作方式—這個我們都會在進入frame()函數之前進行單獨的指定。所以我們大體上也就大體瞭解了osgViewer::View初始化工作,就是創建一個名叫osgGA::GUIEventAdapter::FRAME的事件並放到_eventQueue中,以及對_cameraManipulator相機操作方式的初始化。不同的攝像機操作模式就會有不同的init函數,我們就對CameraManipulator::init()函數不進行介紹了--- 很簡單。

這樣我們就完成了對ViewerBase::frame()函數中第一個功能介紹完畢,總結一下。Viewer::viewerInit()函數就是完成了osg中事件隊列的初始化以及相機操作器的初始化工作。當然這些工作之前,也就是進入frame函數之前必須先完成viewer以及相機的定義。但是osg庫非常強大,即是你沒有定義viewer以及camera他就會默認的按照約定的模式創建一組他們出來。

歡迎大家來我的新家看一看 http://www.3wwang.cn

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