轉自:http://blog.csdn.net/wang15061955806/article/details/51603083
相機與視圖
osg::Camera類用來管理OSG中的模型——視圖矩陣,相機的管理主要經過各類變換來實現的。
osgViewer::Viewer爲一個單獨的場景scene保存一個單獨的view,單視圖的管理是經過osgViewer::Viewer來實現的。在osgViewer::Viewer中,只容許單視圖,單視圖能夠同時包含多個相機渲染,也能夠在多窗口中渲染。爲了可以進行正常的渲染,還須要建立一個圖形環境(默認的狀況下已經建立了一個)。有時爲了方便控制場景渲染,須要設置一個合適的圖形環境窗口。
osg::View主要用來管理全部的相機視圖。它包含一個主相機和N個從屬相機(Slave)。若是View僅有一個主相機,則該主相機用來負責控制和渲染場景視圖。若是包含從屬相機,則主相機用來負責控制管理視圖,從屬相機用於渲染場景。
osgViewer::View:能夠掛節事件、處理事件、並負責建立相機和建立圖形環境窗口。
osgViewer::ViewBase:具備管理渲染的線程、負責設置線程模式、啓動相關線程等功能。
osgGA::GUIActionAdapter類:GUI動做適配器,用來向系統發送一些請求,以實現一些特定的操做。這也是GUI時間適配器的主要組成部分之一。
一個視景體能夠包含一個主相機和多個從相機,setUpViewInWindow()的做用是根據給定的窗口參數來建立一個圖形設備。
osg::DisplaySetting保存了與圖形顯示,尤爲是立體顯示有關的全部信息。
瞭解整個屏幕的分辨率能夠用這個類:osg::GraphicsContext::WindowingSystemInterface意思是說系統接口,能夠得到當前環境的各類信息。有一方法加getScreenResolution,能夠獲得分辨率。
Camera::SetViewport決定了相片也就是圖像的大小;osg::GraphicContext::Traits的Width,Height定義了在屏幕上顯示的相框的大小。通常viewport和相框同樣大,若是viewport大於相框,則在相框中只顯示一部分場景;若是viewport小於相框,相框中會有一部分的空白。
場景節點樹是經過場景中的一個或多個相機節點Camera來進行管理的,不屬於任何相機的場景節點沒法用於渲染過程;圖形設備(GraphicContext)則表示相機的底層圖形窗口或者緩存,而且傳遞了各類各樣的交互事件;視圖(View)和視景器(Viewer和CompositeViewer)負責將相機節點及其子樹應用與系統的仿真過程,並加載漫遊器、交互事件處理器和各類場景瀏覽的輔助部件。它們共同完成了場景數據的管理和用戶交互的系統前端工做。
而系統前端與渲染後臺的接口,也就是即將介紹的渲染器(Renderer)和場景視圖(SceneView),則須要完成如下幾個功能:
一、將場景節點樹傳遞給CullVisitor,以裁剪場景信息並生成後臺的狀態樹和渲染樹。
二、接下來,按照順序遍歷渲染樹,執行各個渲染葉的繪製,將結果輸出到圖形設備。
三、監控前端數據更新和後臺裁剪渲染的過程,避免產生數據變度的衝突。
四、若有可能,採起多線程、多CPU的方式來實現整個工做流程。
渲染器爲相機節點樹與渲染後臺之間提供了一個公共的接口。當向場景中添加一個新的相機(Camera)時,一個與之關聯的渲染器(Renderer)也會被自動建立;而當咱們準備執行場景的裁剪和繪製時,渲染器會負責傳遞場景與用戶數據,進而交由系統後臺執行裁剪與繪製工做。
同時,渲染器派生子Operation類,也就是說它屬於一種用戶操做,能夠追加到操做線程OperationThread和GraphicThread中,進而能夠在圖形設備或相機節點的線程中運行,完成多線程環境下的渲染接口操做。
渲染器並無直接將場景節點傳遞到裁剪訪問器,也不負責記錄渲染樹或狀態樹的節點數據,它自動建立並保存的osgUtil::SceneView對象,也就是場景視圖對象,纔是裁剪和繪製工做的真正執行者。
這裏有一個值得注意的設計理念:OSG中,與用戶直接交互的系統前端工具——GraphicsWindow、View、Viewer、CompositeViewer 以及Render,均經過osgViewer庫進行定義;而渲染後臺的功能類,包括CullVisitor、StateGraph、RenderLeaf、RenderStage、RenderBin,以及即將介紹的SceneView,均爲osgUtil庫的組成部分。換句話說,任何用戶均可能使用本身系統前端替代osgVIewer內容,並經過操做SceneView實現對渲染後臺的調用;而高級使用者甚至能夠考慮使用另外的渲染後臺,配合OSG的場景結構和交互系統來實現渲染,固然這較爲麻煩一些。