OSG相機與視圖


轉自: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),則需要完成以下幾個功能:
      1、將場景節點樹傳遞給CullVisitor,以裁剪場景信息並生成后台的狀態樹和渲染樹。
      2、接下來,按照順序遍歷渲染樹,執行各個渲染葉的繪制,將結果輸出到圖形設備。
      3、監控前端數據更新和后台裁剪渲染的過程,避免產生數據變度的沖突。
      4、如有可能,采取多線程、多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的場景結構和交互系統來實現渲染,當然這較為麻煩一些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM