日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OSG总结

發布時間:2024/1/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OSG总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在用戶程序中使用osg

?

一.渲染

Osg開放了所有的功能模塊。因此用戶程序完全可以使用最底層的osg功能來執行渲染操作。假設用戶希望能夠完全自主的控制場景圖形的渲染,那么也可以按照下面的步驟編寫應用程序的代碼:

1.?????? 設計自己的視角管理代碼:以改變OpenGL的模型視圖矩陣。

2.?????? 創建用戶窗口和OpenGL上下文,并將他們激活。如果有需要的話,用戶也可以自行編寫管理多窗口和多個設備上下文的代碼。

3.?????? 如果應用程序需要使用分頁數據庫,那么可以使用osgDB::DatabasePager類

4.?????? 可以將osgUtil::UpdateVisitor,osgUtil::CullVisitor,osgUtil::RenderStage對象實例化,以實現場景的更新,挑選和繪制遍歷。如果用戶希望獲得更多的控制權,則可以自己編寫類來實現以上遍歷的特性。

5.?????? 編寫主循環代碼來處理操作系統返回的事件。并且調用自己的視角觀察代碼來更新模型視圖矩陣。

6.?????? 在渲染一幀之前先要調用glClear()。渲染時要依次執行場景更新,挑選和繪制遍歷,最后交換緩存數據。

7.?????? 如果用戶程序或者運行改程序的軟﹑硬件平臺需要立體化渲染(stereo rendering)或者多通道渲染(multipipe rendering)功能的支持,則可以自行編寫額外的代碼。

8.?????? 最后請依照平臺無關性的要求來編寫所有的代碼,這樣你的代碼才可以在所有的目標平臺上運行通過。

?

用戶使用osg時,往往可以利用以下這些工具和庫來簡化開發的過程:

1.?????? osgUtil::SceneView:這個類封裝了更新,挑選,和繪制遍歷,但是并不啟用DatabasePager。有一部分應用程序會使用SceneView作為osg渲染的主接口。

2.?????? Producer和osgProducer—Producer是一個外部的攝像機庫,可以支持多通道渲染。osgProducer是一個集成了Producer和osg的應用庫。Producer有相當多的用戶,目前有一部分的osg程序是基于osgProducer和Producer開發的。

?

Osg2.0版本核心添加了一個新的庫成員—osgViewer。osgViewer包含了一系列的用于控制視口顯示的相關的類,并封裝了大量用戶常用的功能函數,例如顯示管理,事件響應,場景渲染等。這個庫使用osg::Camera類來管理OpenGL的模型視圖矩陣。與SceneView類不同,osgViewer的視口類提供了對DatabasePager的全部支持。osgViewer還可以針對同一個場景圖形,提供并通過多個獨立的視口顯示該場景。

?

?? 3.1.1 Viewer類

?

?? 改變視口:

?? Viewer在其內部創建了一個osg::Camera攝像機對象來管理osg的模型—視圖矩陣。用戶可以通過以下的兩個方法來控制Camera對象。

?? ①將一個攝像機控制器對象關聯到Viewer中。如果你的程序不需要這么做,那么Viewer.run()將自動創建一個osgGA::TrackballManipulator對象來控制攝像機的工作。osgGA庫定義了一些常用的控制器類。用戶可以調用Viewer::setCameraManipulator來指定一個期望的控制器。

②設置Camera對象的投影矩陣和觀察矩陣為自定義的矩陣值。這樣也可以保證用戶程序能夠完全控制視口的瀏覽動作。

osgViewer::setViewMatrix()方法來設置視口矩陣。參數是一個osg::Matrix矩陣,

osgViewer::setViewMatrixAsLookat():參數和gluLookAt類似,三個向量:eye,center,up。

?

設置清屏顏色:

Camera::setClearColor()用來設置清屏顏色,缺省情況下會清除深度和顏色緩存,可以使用Camera::setClearMask(GL_CLOLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)來設置清除屬性。

?

3.1.2????????? SimpleViewer 和 CompositeViewer

?? osgViewer::SimpleViewer類不會主動的創建窗口或者設備上下文,它需要依賴用戶程序來創建窗口、上下文,并將其激活為當前設備,如果操作正確的話,SimpleViewer::frame()將會在用戶給定的窗口中渲染。

?? osgViewer::CompositeViewer:Viewer類只能在一個場景中添加一個視口,而CompositeViewer類可以支持一個或多個場景的多個視口顯示,并允許用戶程序指定其渲染順序。CompositeViewer還支持渲染到紋理(RTT)的操作,即,允許用戶程序將一個視口中渲染的圖像作為另一個視口的紋理貼圖。

?

二.動態更改

Osg允許用戶動態的修改場景圖形并因而改變每一幀的顯示。用戶可以更改幾何數據,渲染狀態參數,Switch節點設置,以及任何場景圖形的結構。OsgViewer庫支持多線程模式,每一個線程均獨立的運行挑選及繪制遍歷,但osg并沒有為了線程的安全性增設內存鎖,而是要求用戶程序只可在挑選及繪制遍歷的時域之外修改場景圖形。

?

確保用戶的修改不會與挑選及繪制線程發生沖突,一個簡單的方案是,在Viewer::frame()的調用之外進行場景圖形的修改,這需要在主渲染循環中添加額外的代碼。但如果用戶希望自己的程序更加整潔及規范的話,可以選擇在更新遍歷中進行場景的修改操作。

?

一些與場景圖形動態更改相關的基本技術:

1.?????? 處于性能優化和線程安全性的考慮,用戶需要通知osg,場景圖形的哪些部分是可能要進行修改的。用戶可以通過設置Object對象(Node,Drawable,StateSet等)的數據變度(data variance)屬性來完成這一工作。

2.?????? osh允許用戶為Node和Drawable設置回調(callback)。Osg將在特定遍歷中執行這些回調,

3.?????? 用戶程序有時不能預知場景圖形的哪一部分需要修改。這是需要搜索整個場景圖形來查找特定的節點,或者由用戶使用鼠標等輸入設備來選擇一個節點。

?

3.2.1??????? 數據邊度

? OsgViewer支持的多線程模型允許主循環不必等到繪制遍歷結束就可以繼續運行,也就是Viewer::frame()方法在繪制遍歷仍未結束的時候就可以返回。換句話說,上一幀的繪制遍歷可以與下一幀的更新遍歷產生重疊。Osg提供了osg::object::DataVariance()方法解決繪制遍歷與多線程的更新操作的沖突。(Frame():Render a complete new frame)。用于處理繪制遍歷與其他遍歷的同步性。

?

3.2.2????????? 回調

Osg允許用戶設置Node和Drawable對象的回調類。Node可以在執行更新和挑選時進行回調,Drawable可以在挑選和繪制遍歷時進行回調。

?

使用NodeCallback,用戶程序所需要執行的步驟:

1.?????? 從NodeCallback繼承一個新的類。

2.?????? 重載NodeCallback::operator()方法,實現場景圖形的動態更改。

3.?????? 實例化繼承而來的類,然后使用Node::setUpdateCallback()方法關聯到將要修改的Node。

NodeCallback::operator()兩參數:第一個是回調類所關聯的Node節點地址,第二個參數是osg::NodeVisitor對象的地址。

?

NodeVisitor::traverse():這個方法允許osg訪問其他的節點并執行其回調。

?

3.2.3????????? NodeVisitor類

這是osg對于訪問器(visitor)設計思想的實現。從本質上說,NodeVisitor類遍歷了一個場景圖形并為每一個被訪問節點調用特定的函數。這一簡單的技術卻是許多osg操作的基類,如osgUtil::Optimizer,osgUtil的幾何體處理類。Osg使用osgUtil::UpdateVisitor類(繼承自NodeVisitor)來實現更新遍歷。

NodeVisitor是一個基類,用戶程序無法直接將其實例化。但用戶程序可以使用osg提供的任何NodeVisitor派生類,也可以自己編寫繼承自NodeVisitor類的代碼。NodeVisitor包含了一些經過重載的apply()方法,其輸入參數涵蓋了大部分osg的節點類型。當一個NodeVisitor對象遍歷整個場景圖形時,它將會為每個被訪問的節點調用其相應的apply()方法。

?

使用特定的名稱來搜索節點也是一種簡單而實用的操作。

?

允許NodeVisitor遍歷:

缺省情況下,NodeVisitor類禁止執行遍歷。因此在你的派生類中,需要使用枚舉量NodeVisitor::TRAVERSE_ALL_CHILDREN來初始化基類,以允許執行遍歷,否則osg將不會調用apply()方法。

?

如果要使用NodeVisitor來遍歷整個場景圖形,可以將NodeVisitor作為Node::accept()的輸入參數傳遞。你可以在任何一個節點上調用accept(),NodeVisitor將從那個節點開始遍歷整個場景圖形,如果要搜索整個場景圖形的話,可以從根節點開始調用accept()。

?

3.2.4????????? 用戶選擇

從本質上講,osg程序通過兩個步驟來實現用戶選擇:

1.?????? 接受鼠標事件osgGA提供了允許程序接受鼠標事件的事件類,它具備設備平臺無關特性。

2.?????? 判斷場景圖形的哪個部分被鼠標光標覆蓋。osgUtil提供了一種相交集類(Intersection),可以在鼠標xy坐標的周圍創建包圍盒,并判段包圍盒與場景圖形的相交情況,osgUtil將按照由前至后的順序返回與包圍盒相交的節點列表。

?

?

捕捉鼠標事件

osgGA::TrackballManipulator將鼠標事件作為輸入,并修改用于控制用戶視口的osg::Camera視口矩陣。

TrackballManipulator派生自osgGA::GUIEventHandler類,是虛基類,無法實例化,但用戶可以從GUIEventHandler派生自己的類,以實現各種基于GUI事件的操作。要實現鼠標控制的選擇操作,可以從GUIEventHandler派生新的類,并重載

GUIEventHandler::Handle()方法,以接收鼠標事件。然后用戶可以創建新類的實例并將其關聯到應用程序的觀察視口。

Virtual bool GUIEventHandler::Handle(const osgGA::GUIEventAdapter & ea,osgGA::GUIActionAdapter & aa);用戶實現的Handle()方法可以接收來自GUIEventAdapter的各種GUI事件,包括鼠標事件。GUIEventAdapter類的頭文件中定義了枚舉類型EventType,用戶程序可以從中選擇自己需要的GUI事件。使用GUIEventAdapter.getEventType()方法可以得到當前的事件類型。GUIActionAdapter是用戶返回給GUI系統的程序接口。當遇到鼠標選擇的操作時,用戶將用于選擇事件的GUIEventHandler關聯到視口類,則視口類就是一個GUIActionAdapter。用戶需要使用他來實現當前視口與場景之間的交互。

?

在渲染視口之前,用戶往往會創建一個GUIEventHandler派生類的實例,并使用Viewer::addEventHandler()將其關聯到視口。一個視口可以有多個事件處理器,Viewer將事件處理對象添加到一個事件處理列表中。運行時Viewer將調用每個GUI事件的handle()函數,直到其中一個的handle()函數返回true為止。

?

要實現接收鼠標事件并實現用戶選擇的功能,需要經過以下幾個步驟:

1.?????? 從GUIEventHandler繼承新的類,重載handler()方法。

2.?????? 在handler()方法中檢查GUIEventAdapter參數傳遞的事件類型,并針對需要的事件類型執行相應的操縱。方法返回true時將阻止其他事件處理器繼續接受事件消息。

3.?????? 在渲染之前,創建事件處理器的實例,并使用addEventHandler()方法添加到視口中。Osg將會把視口作為GUIActionAdapter參數傳遞給handler()方法。

?

?

交集

Osg使用一種多胞體(polytope)的金字塔形包圍盒代替射線。這種金字塔的頂峰位于視點,其中心軸直接穿過鼠標(光標)的位置。它距離視點的寬度是由視場和程序控制的寬度參數決定的。

?

osgUtil::IntersectionVisitor類繼承自NodeVisitor,它可以監測每個定點的包圍盒與交集包圍盒的關系,并允許在某個子圖形不可能存在有交集的子節點時,跳過該子圖形的遍歷。

?

用戶可以設置IntersectionVisitor類并使用幾種不同的幾何結構進行交集檢測。其構造函數使用osgUtil::Intersector作為輸入參數,Intersector定義了選擇操作的幾何體并執行實際的交集操作。Intersector是一個純虛基類,osgUtil庫從中派生了許多代表不同幾何結構的新類。

?

?

有些程序需要拾取單獨的頂點和多邊形,而有些程序只需要簡單的獲取那些包含了被選節點的Group或Transform父節點。IntersectionVisitor返回osg::NodePath對象來滿足這些要求。NodePath是一個std::vector<osg::Node>向量,它表示沿著根節點到葉節點﹑呈現出一定排列層次的節點路線。如果用戶程序需要獲取中的父節點,只需要從后到錢搜索滿足要求的節點即可。

?

要實現osg中的鼠標選擇操作,需要按照如下的步驟編寫代碼:

1.?????? 創建并設置PolytopeIntersector,其中的鼠標位置應當使用GUIEventAdapter中經過歸一化的數據。

2.?????? 創建IntersectionVisitor對象,并將PolytopeIntersector作為其構造函數的輸入參數。

3.?????? 由場景圖形的根節點加載IntersectionVisitor,一般來說是通過Viewer中的Camera對象,

如下面的代碼:

iv是一個IntersectionVisitor對象

viewer.getCamera()->accept(iv);

4.????? 如果PolytopeIntersector的返回值包含了交集,那么可以獲取返回的NodePath并搜索符合要求的節點。

總結

以上是生活随笔為你收集整理的OSG总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲av无码精品一区二区 | 毛片免| 欧美成人视 | 日韩欧美一区二区三区免费观看 | 一区二区片 | 日韩av在线免费看 | 91嫩草视频在线观看 | 国产调教在线观看 | а天堂中文在线官网 | 李华月全部毛片 | 日日射射 | 色悠悠av | 色视屏| 欧美激情在线一区二区 | 日本网站在线 | 国产精品久久久久9999爆乳 | www,jizz,com | 打屁股视频网站 | 天堂一区二区三区四区 | 久久精品三级 | 日本三级视频在线观看 | 伊人久久香 | 精品国产91久久久久久 | 黑人狂躁日本妞hd | 俄罗斯色片 | 亚洲女人天堂成人av在线 | 日韩精品电影 | 亚洲天堂2024| 91精品国产色综合久久不卡粉嫩 | 9色视频在线观看 | 国产成人无码精品久久久久久 | 人妻va精品va欧美va | wwww欧美 | 成人动漫一区 | 东南亚毛片 | 欧美福利视频在线 | 国产情侣一区二区三区 | 国产精品国产一区二区三区四区 | 精品久久久久一区二区国产 | av丝袜天堂| 国产传媒一级片 | 欧美午夜影院 | 国产精品51麻豆cm传媒 | 国产午夜免费福利 | 99黄色片 | 一本色道久久综合无码人妻 | 电车痴汉在线观看 | 91久久久久久久久久久久 | 精精国产xxxx视频在线 | 免费网站观看www在线观 | 日本熟妇毛耸耸xxxxxx | 国产精品人人妻人人爽人人牛 | 欧洲精品码一区二区三区免费看 | ass大乳尤物肉体pics | 色婷婷在线视频 | 免费男女视频 | 在线一区 | 免费人成视频在线播放 | 三叶草欧洲码在线 | 男女羞羞无遮挡 | jlzzjizz在线播放观看 | 日本免费小视频 | 国产成人99 | 99re在线| 国产毛片视频网站 | 中文字幕在线天堂 | 日韩avav | 欧美在线一级 | 成人香蕉视频 | 肉大榛一进一出免费视频 | 美乳人妻一区二区三区 | 不用播放器的av网站 | 免费人成视频在线播放 | 中文字幕在线观看免费高清 | 欧美性猛交xxxx免费看 | 欧美日韩中 | 91精品国产91久久久久久黑人 | av在线免| 美女极度色诱图片www视频 | 精品视频网 | 欧亚av| 搞逼综合网 | 国产精品5| 精品精品视频 | 性欧美lx╳lx╳ | 操一操 | jizz91| 夜夜操操操 | 日韩大尺度在线观看 | 91文字幕巨乱亚洲香蕉 | 手机av免费在线 | 国产精品久久久久久久久免费软件 | 国产99久久久久久免费看 | 欧美黑人性xxx猛交 少妇无套内谢久久久久 | 男人私人影院 | 久久精品国产清自在天天线 | 色爽视频 | 人妻在线一区 | 欧美综合激情网 |