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

探索未知種族之osg類生物---器官初始化二
那我們回到ViewerBase::frame函數中來,繼續看看爲什麼osg生命剛剛出生的時候會大哭,除了初始化了eventQuene和cameraManipulator之外還對那些器官進行了初始化。在這之前我們先介紹一下上一節說到的osg的肢體或者器官但是沒有展開介紹的。

前言
osgGA::GUIEventAdapter,GUI事件適配器。它就是對所有平臺windows linux mac平臺上的鼠標、鍵盤、以及其他的窗口事件進行了封裝,目的是使接口統一,用戶在使用osg庫的時候不用再自己區分平臺,直接調用GUIEventAdapter就可以得到平臺發過來的事件信息。特別是我們處理自定義的EventHandler事件處理器的時候重寫handler (const osgGA::GUIActionAdapter &ea ,osgGA::GUIActionAdapter &aa)的時候一定會用到。

osgGA::GUIActionAdapter,這個內臟器官的用處比較多。我們慢慢的說。作用:定義GUIEventHandlers可以請求使用GUI操作系統的動作的抽象接口類。這些動作請求應該遵守用戶所使用平臺的GUI工具包的規範。例如當一個GUIEventHandler處理一個鼠標事件的時候,它希望去請求GUI,例如當一個模型被’拋出’---(使用TrackballManipulator,按住鼠標右鍵快速移動,然後鬆開右鍵類似拋出物體的動作)時,這個TrackballManipulator可能希望啓動計時器,並重復調用,以持續刷新攝像機的位置和方向。但是,它無法做到這一點,因爲它對它運行的窗口系統一無所知。得不到任何支持。相反,GUIEventHandler可以通過GUIActionAdapter發出自己的請求,然後使用這個GUI系統的viewer應該遵循這些請求。當然GUIActionAdapter的功能不只是這些,再例如我們上一節也看到了osg::Viewer::View的其中一個基類就是GUIActionAdapter,而osgViewer::View又是osgViewer::Viewer的基類,所以我們可以GUIActionAdapter強轉成osgViewer::Viewer.這種使用方式一般也是在處理自定義的EventHandler事件處理器的時候重寫handler (const osgGA::GUIActionAdapter &ea ,osgGA::GUIActionAdapter &aa)的時候會用到。

說了兩個概念性的東西,有可能比較枯燥,但是技術類工作就是這樣,每每在學習一種新的技術或者瞭解他背後的原理的時候,我們要耐下性子,一步一步來。只有把每一步都搞清楚弄明白我們在能繼續前進不至於迷失了方向。

osgViewer::Viewer::isRealized()
探索未知種族之osg類生物---器官初始化二

我們再此回到我們的解剖課中繼續探究osg類物種,osgViewer::ViewerBase::frame()中的下一步就是判讀viewer是否已經被實現了,如果沒有那麼就要實現這個viewer。所以我們要到osgViewer::Viewer::isRealized()函數。主要功能就是這個從這個viewer中得到渲染的上下文,並且判斷他們是否被實現。渲染上下文我們應該都很瞭解,如果您用過qt+osg一定會有這麼一個過程,創建一個camera的過程需要指定操作系統的窗口屬性,這個渲染的上下文就在這裏指定。那我們就去osgViewer::Viewer::getContexts()下看看怎麼來得到所有的GraphicsContext()。

getcontexts

osgViewer::Viewer::getContexts()。我們還是老規矩,看看這個新的動作中涉及到那些新的內臟,osg::GraphicsContext。就是圖形設備對應的載體,或者說GraphicsContext是任意圖形子系統的抽象接口,它提供了統一的圖形設備處理函數,用來實現渲染結果和底層設備的交互。圖形設備對象的主要工作是提供場景渲染結果的載體,這個載體可以顯示緩存,進而繪製到一個圖像窗口中,也可以是其他特殊的緩存對象,從而實現複雜的渲染和圖像多次曝光等功能,創建一個圖像設備不能簡單地使用new運算符,因爲GraphicContext類是一個不能被實例化的抽象類(這個體現在valid()等一大批純虛函數上);通常應當使用createContext()靜態函數,自動根據當前的用戶環境和特性參數traits,構建一個平臺相關的圖形設備對象。然後綁定到攝相應的像機上。

osg::ref_ptr gc = osg::GraphicsContext::creteGraphicsContext(traits)

camera-> setGraphicContext(gc);
所以在osgViewer::Viewer::getContexts()中通過_camera->getGraphicsContext()來得到圖形設備對象。

osgViewer::Viewer::getContexts()。我們又遇到了新的不認識的小零件,osg::Slave代表了主相機下的一個跟隨相機,以及視圖矩陣。我們在前面已經介紹過了osg::View中定義了所有的相機,當場景中只有一個主相機時,那麼它即是主導也是場景的渲染器,但是有了從相機,那麼主相機將視圖控制到場景,而從屬相機負責實現場景的渲染。所以osg::Slave中也會包含osg::GraphicsContext,也要中所有的從相機getSlaves()中得到所有的GraphicsContext。並判斷他們是否可用GraphicsContexts->vaild()。這樣就介紹完了viewer->getContexts().

回到Viewer::isRealized()函數中,再往下就是確定這些得到的所有的圖形設備是否已經初始化完成準備被使用。

Osg::GraphicsContext::isRealized() const { return isRealizedImplementation();};
也就繼承自Osg::GraphicsContext的類或者說Osg::GraphicsContext封裝的底層的設備接口類中,這些類一般都在osg::Viewer::api下定義。這些類的仔細介紹我們會稍後進行講解。這樣我們就完成了ViewerBase::frame()一呼一吸動作中的第二個拆解動作isReallized()介紹。

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

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