OSG學(xué)習(xí)過(guò)程中的筆記_第1頁(yè)
OSG學(xué)習(xí)過(guò)程中的筆記_第2頁(yè)
OSG學(xué)習(xí)過(guò)程中的筆記_第3頁(yè)
OSG學(xué)習(xí)過(guò)程中的筆記_第4頁(yè)
OSG學(xué)習(xí)過(guò)程中的筆記_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、一 旋轉(zhuǎn)其中 trans-setMatrix(osg:Matrix:translate(0,0,20);就是用來(lái)平移物體,這個(gè)表示象Z軸正方向平移也就是屏幕正上方。osg:Matrix:scale(0.5,0.5,0.5)表示縮放的比例,也就是原來(lái)物體的一般大小osg:Matrix:rotate(osg:DegreesToRadians(90.0),0,1,0)該方法參數(shù)分別表示角度,x,y,z當(dāng)xyz其中有值是那么物體會(huì)繞著物體旋轉(zhuǎn)。當(dāng)角度為正值的時(shí)候,物體繞著x,y,z箭頭指向向右旋轉(zhuǎn),否則物體繞著x,y,z箭頭指向向左旋轉(zhuǎn)osg筆記(一) 2011-07-05 19:37:29| 分類(lèi):

2、 OSG | 標(biāo)簽: |字號(hào)大中小 訂閱 場(chǎng)景圖形采用一種自頂向下的,分層的樹(shù)狀數(shù)據(jù)結(jié)構(gòu)來(lái)組織空間數(shù)據(jù)集,以提高渲染的效率場(chǎng)景圖形樹(shù)結(jié)構(gòu)的頂部是一個(gè)根節(jié)點(diǎn),從根節(jié)點(diǎn)向下延伸,各個(gè)組節(jié)點(diǎn)中均包含了幾何信息和用于控制其外觀的渲染狀態(tài)信息。根節(jié)點(diǎn)和各個(gè)組節(jié)點(diǎn)都可以有零個(gè)(實(shí)際上是沒(méi)有執(zhí)行任何操作)或多個(gè)子成員。在場(chǎng)景圖形的最底部,各個(gè)葉節(jié)點(diǎn)包含了構(gòu)成場(chǎng)景中物體的實(shí)際幾何信息。Osg程序使用組節(jié)點(diǎn)來(lái)組織和排列場(chǎng)景中的幾何體。場(chǎng)景圖形通常包含了多種類(lèi)型的節(jié)點(diǎn)以執(zhí)行各種各樣的用戶功能,例如開(kāi)關(guān)節(jié)點(diǎn)可以設(shè)置其子節(jié)點(diǎn)可用或不可用,細(xì)節(jié)層次節(jié)點(diǎn)(LOD)可以根據(jù)觀察者的距離調(diào)用不同的子節(jié)點(diǎn),變換節(jié)點(diǎn)可以改變子節(jié)

3、點(diǎn)幾何體的坐標(biāo)變換狀態(tài)。場(chǎng)景圖形特征:1. 提供底層渲染API中具備的幾何信息和狀態(tài)管理功能之外,還兼?zhèn)湟韵碌母郊犹卣骱凸δ埽?. 空間結(jié)構(gòu):3. 場(chǎng)景揀選,投影面剔除和隱藏面剔除。4. 細(xì)節(jié)層次:5. 透明6. 狀態(tài)改動(dòng)最少化7. 文件I/O8. 更多高性能函數(shù):全特征文字支持,渲染特效的支持,渲染優(yōu)化,3d模型文件讀寫(xiě)支持,跨平臺(tái)輸入渲染及顯示設(shè)備的訪問(wèn).場(chǎng)景圖形渲染方式:三種遍歷操作1. 更新2. 揀選3. 繪制Osg設(shè)計(jì)所采用的設(shè)計(jì)理念和工具:Ansi標(biāo)準(zhǔn)C+C+標(biāo)準(zhǔn)模板庫(kù)設(shè)計(jì)模式Osg命名習(xí)慣:命名空間:小寫(xiě)字母開(kāi)頭,然后大寫(xiě)字母避免混淆。類(lèi):大寫(xiě)字母開(kāi)頭,每個(gè)單詞首字母大寫(xiě)。類(lèi)方法

4、:小寫(xiě)字母開(kāi)頭,此后每個(gè)單詞首字母大寫(xiě)。類(lèi)成員:同上模板:小寫(xiě)字母,多個(gè)單詞之間使用下劃線分隔。靜態(tài)量:靜態(tài)量和函數(shù)的名稱(chēng)使用s_開(kāi)頭全局量:用g_開(kāi)頭組件:一.Osg核心庫(kù):提供了基本的場(chǎng)景圖形和渲染功能,以及3d圖形程序所需的某些特定功能實(shí)現(xiàn)。包括:1.osg庫(kù):包含了用于創(chuàng)建場(chǎng)景圖形的場(chǎng)景圖形節(jié)點(diǎn)類(lèi),用作向量和矩陣運(yùn)算的類(lèi),幾何體類(lèi),以及用于描述和管理渲染狀態(tài)的類(lèi),3d圖形程序所需的典型功能類(lèi),例如命令行參數(shù)解析,動(dòng)畫(huà)路徑管理,以及錯(cuò)誤和警告信息類(lèi)。2.osgUtil庫(kù):osg工具庫(kù)包含的類(lèi)和函數(shù),可以用于場(chǎng)景圖形及其內(nèi)容的操作,場(chǎng)景圖形數(shù)據(jù)統(tǒng)計(jì)和優(yōu)化,以及渲染器的創(chuàng)建。它還包括了幾何操

5、作的類(lèi),例如delaunay三角面片化,三角面片條帶化,紋理坐標(biāo)生成等。3.osgDB庫(kù):建立和渲染3d數(shù)據(jù)庫(kù)的類(lèi)和函數(shù):允許用戶程序加載,使用和寫(xiě)入3d數(shù)據(jù)庫(kù),它采用插件管理的架構(gòu)。osgDB維護(hù)插件的信息注冊(cè)表,并負(fù)責(zé)檢查將要被載入的osg插件接口的合法性。OsgDB:DatabasePager實(shí)現(xiàn)應(yīng)用程序從文件中讀取各部分?jǐn)?shù)據(jù)庫(kù)信息時(shí),在不干擾當(dāng)前渲染的前提下以后臺(tái)線程的方式進(jìn)行。4.osgViewer庫(kù):包含了場(chǎng)景中視口及可視化內(nèi)容的管理類(lèi)。定義了一些視口類(lèi),可以將osg集成到許多視窗設(shè)計(jì)工具中,如MFC,win32等。5.osgGA庫(kù):用于改寫(xiě)界面事件。二.NodeKits:擴(kuò)展了核

6、心osg場(chǎng)景圖形節(jié)點(diǎn)類(lèi)的功能,以提高高級(jí)節(jié)點(diǎn)類(lèi)型和渲染特效。包括如下庫(kù):擴(kuò)展了Nodes,Drawables和StateAttributes。由兩部分組成,NodeKit本身,以及針對(duì).osg的封裝插件庫(kù)。有以下的幾種NodeKits:1.osgFX庫(kù):提供了額外的場(chǎng)景圖形節(jié)點(diǎn),以便于特效的渲染,例如異向光照,凹凸貼圖,卡通著色等。2.osgParticle庫(kù):提供了基于例子的渲染特效。如爆炸,火焰,煙霧。3.osgSim庫(kù):提供了仿真系統(tǒng)中以及渲染OpenFlight數(shù)據(jù)庫(kù)所需的特殊渲染功能,例如地形高程圖,光點(diǎn)節(jié)點(diǎn),DOF變換節(jié)點(diǎn)等。4.osgText庫(kù):此類(lèi)庫(kù)提供了向場(chǎng)景中添加文字的得力

7、工具,可以完全支持TrueType字體。5.osgTerrain庫(kù):提供了渲染高度場(chǎng)數(shù)據(jù)的能力。6.osgShadow庫(kù):提供了支持陰影渲染的框架結(jié)構(gòu)。三.Osg插件:其中包含了2d圖像和3d模型文件的讀寫(xiě)功能庫(kù)。四.互操作庫(kù):使得osg易于與其他的開(kāi)發(fā)環(huán)境集成。為了確保osg可以在更多環(huán)境中運(yùn)行,osg提供了一個(gè)與語(yǔ)言無(wú)關(guān)的,可供運(yùn)行時(shí)訪問(wèn)的接口。OsgIntrospection庫(kù)允許用戶軟件使用反射式和自省式的編程范式與osg進(jìn)行交互。五.不斷擴(kuò)展的程序和實(shí)例集:提供了實(shí)用的功能函數(shù)和正確使用osg的例子。1.osgarchive:用于向.osga文件包中添加新的文件。也可以用這個(gè)程序?qū)崿F(xiàn)

8、包的分解和列表。2.osgconv:這個(gè)程序用于轉(zhuǎn)換文件格式。它可以將任何文件格式轉(zhuǎn)換為經(jīng)過(guò)優(yōu)化的.ive格式。3.osgdem:用于將高程圖等高程數(shù)據(jù)及圖像數(shù)據(jù)轉(zhuǎn)化成分頁(yè)的地形數(shù)據(jù)庫(kù)。場(chǎng)景圖形類(lèi):osg庫(kù)osg:Node :所有場(chǎng)景圖形類(lèi)均繼承自此類(lèi)。Node:場(chǎng)景圖形中所有節(jié)點(diǎn)的基類(lèi)。包含了用于場(chǎng)景圖形遍歷,揀選,程序回調(diào),以及狀態(tài)管理的方法。Group:所有可分支節(jié)點(diǎn)的基類(lèi)。Geode:相當(dāng)于osg中的葉節(jié)點(diǎn)(geometry node)。沒(méi)有子節(jié)點(diǎn),但是包含了osg:Drawable對(duì)象,此中存放了將要被渲染的幾何體。LOD:此類(lèi)根據(jù)觀察點(diǎn)與圖像子節(jié)點(diǎn)的距離選擇顯示子節(jié)點(diǎn)。通常使用它來(lái)

9、創(chuàng)建場(chǎng)景中物體的多個(gè)顯示層級(jí)。MatrixTransform:包含了用于實(shí)施子節(jié)點(diǎn)幾何體的空間轉(zhuǎn)換的矩陣,以實(shí)現(xiàn)場(chǎng)景對(duì)象的旋轉(zhuǎn),平移,縮放,傾斜和映射等操作。Switch:用布爾模板來(lái)允許或禁止子節(jié)點(diǎn)的運(yùn)作。其他的如:Sequence,PositionAttitudeTransform等幾何體類(lèi):osg庫(kù)Geode:osg的葉節(jié)點(diǎn),包含了渲染用的幾何數(shù)據(jù),使用以下類(lèi)實(shí)現(xiàn)幾何數(shù)據(jù)的存儲(chǔ):Drawable:用于存儲(chǔ)幾何數(shù)據(jù)信息的基類(lèi),Geode維護(hù)了一個(gè)Drawable的列表。純虛類(lèi)無(wú)法實(shí)例化,必須實(shí)現(xiàn)派生類(lèi),如:Geometry,或者ShapeDrawable(允許用戶繪制預(yù)定義的幾何形狀,如球

10、,圓錐,矩形體等)。Geometry:與PrimitiveSet類(lèi)相關(guān)聯(lián),實(shí)現(xiàn)了對(duì)opengl頂點(diǎn)數(shù)組功能的高級(jí)封裝。保存了頂點(diǎn)數(shù)組的數(shù)據(jù),紋理坐標(biāo),顏色以及法線數(shù)組。PrimitiveSet:提供了opengl頂點(diǎn)數(shù)組繪圖命令的高層次支持。用戶可以從Geometry中獲得保存的數(shù)據(jù),再使用這個(gè)類(lèi)制定要繪制的幾何體數(shù)據(jù)的類(lèi)型。Vector類(lèi):支持float和double類(lèi)型。Array類(lèi):數(shù)組類(lèi)型。狀態(tài)管理類(lèi):osg庫(kù)保存場(chǎng)景所需的opengl渲染狀態(tài),狀態(tài)集合StateSet:osg在此類(lèi)中保存一組定義狀態(tài)數(shù)據(jù)(模式和屬性)。場(chǎng)景圖形中的任何一個(gè)Node都可與StateSet相關(guān)聯(lián)。模式:與

11、glEnable和glDisable相類(lèi)似。用Osg:StateSet:setMode()可在StateSet中保存一個(gè)模式信息。屬性:用于制定狀態(tài)信息,osg:StateSet:setAttribute()在StateSet中保存屬性信息。紋理模式和屬性:StateSet類(lèi)方法的setTextureMode和setTextureAttribute進(jìn)行設(shè)置。繼承標(biāo)記:用于標(biāo)志量的操作。用于控制場(chǎng)景圖形遍歷中的狀態(tài)值。osgViewer庫(kù)包含了以下三個(gè)可能用到的視口類(lèi):SimpleViewer:負(fù)責(zé)管理單一場(chǎng)景中的單一視口。使用SimpleViewer時(shí),應(yīng)用程序應(yīng)當(dāng)創(chuàng)建一個(gè)窗口并設(shè)置當(dāng)前的圖形

12、上下文。Viewer:用于管理多個(gè)同步攝像機(jī),他們將從多個(gè)方向渲染單一的視口。CompositeViewer:此類(lèi)支持同一窗口的多個(gè)視口,也支持不同場(chǎng)景的多個(gè)攝像機(jī)。其他實(shí)用類(lèi):osg庫(kù)涉及到osg的內(nèi)存引用計(jì)數(shù)策略。Referenced:所有場(chǎng)景圖形節(jié)點(diǎn)和osg的許多其他對(duì)象的基類(lèi)。它實(shí)現(xiàn)了一個(gè)用于跟蹤內(nèi)存使用情況的引用計(jì)數(shù)。如果某個(gè)繼承自Referenced類(lèi)的對(duì)象引用計(jì)數(shù)數(shù)值到達(dá)0,那么系統(tǒng)將自動(dòng)調(diào)用其析構(gòu)函數(shù)并清理為此對(duì)象分配的內(nèi)存。ref_ptr:模板類(lèi)ref_ptr為其模板內(nèi)容定義了一個(gè)智能指針。模板內(nèi)容必須繼承自Referenced。Object:純虛類(lèi),一切需要I/O支持,拷貝

13、和引用計(jì)數(shù)的對(duì)象的基類(lèi)。Notify:osg庫(kù)提供了一系列的控制調(diào)試,警告和錯(cuò)誤輸出的函數(shù)。用戶可以通過(guò)指定一個(gè)來(lái)自NotifySeverity枚舉量的數(shù)值,設(shè)定輸出的信息量。交運(yùn)算:osgUtil庫(kù)通過(guò)提供大量用于場(chǎng)景圖形交運(yùn)算,使用如下類(lèi)可以獲得場(chǎng)景圖形中被拾取部分的信息:Intersector:純虛類(lèi),定義了相交測(cè)試的接口。執(zhí)行相交測(cè)試時(shí),應(yīng)用程序?qū)⒗^承自Intersector的某個(gè)類(lèi)實(shí)例化,傳遞給IntersectionVisitor的實(shí)例,并隨后請(qǐng)求該實(shí)例返回?cái)?shù)據(jù)以獲取交運(yùn)算的結(jié)果。IntersectionVisitor:IntersectionVisitor搜索場(chǎng)景圖形中與指定幾何

14、體相交的節(jié)點(diǎn),而最后的測(cè)試工作由Intersector繼承類(lèi)完成。LineSegmentIntersector:繼承自Intersector,用于檢測(cè)指定線段和場(chǎng)景圖形之間的相交情況,并向程序提供查詢相交測(cè)試結(jié)果的函數(shù)。Intersections:交叉點(diǎn)。Iterator:迭代程序。PolytopeIntersector:與LineSegmentIntersector類(lèi)似,該類(lèi)用于檢測(cè)由一系列平面構(gòu)成的多面體的相交情況。當(dāng)用戶點(diǎn)擊鼠標(biāo),希望拾取到鼠標(biāo)位置附近的封閉多面體區(qū)域時(shí),PolytopeIntersector類(lèi)尤其有效。PlaneIntersector:與LineSegmentInter

15、sector類(lèi)似,用于檢測(cè)由一系列平面構(gòu)成的平面的相交情況。優(yōu)化:osgUtil庫(kù)Optimizer:用于優(yōu)化場(chǎng)景圖形。Statistics和StatsVisitor:StatsVisitor返回一個(gè)場(chǎng)景圖形中節(jié)點(diǎn)的總數(shù)和類(lèi)型,Statistics返回渲染幾何體的總數(shù)和類(lèi)型。幾何體操作:osgUtil庫(kù)Simplifier:使用此類(lèi)用來(lái)減少Geometry對(duì)象中幾何體的數(shù)目,這有助于低細(xì)節(jié)層次的自動(dòng)生成。Tessellator:根據(jù)一組頂點(diǎn)的列表,生成由前述列表描述的多邊形,即一個(gè)osg:PrimitiveSetDelaunayTriangulator:實(shí)現(xiàn)了Delaunay三角網(wǎng)格化運(yùn)算,根

16、據(jù)一組頂點(diǎn)的集合生成一系列的三角形。TriStripVisitor:遍歷場(chǎng)景圖圖形并將多邊形圖元轉(zhuǎn)化成三角形和四邊形條帶。SmoothingVisitor:SmoothingVisitor可生成頂點(diǎn)法線,也就是所有共享此頂點(diǎn)的面的法線平均值。紋理貼圖生成:包含了建立反射貼圖,中途向量貼圖,高光貼圖。osg筆記二 2011-07-08 17:37:06| 分類(lèi): OSG | 標(biāo)簽: |字號(hào)大中小 訂閱 一內(nèi)存管理Osg的“廢棄物”收集系統(tǒng)有以下兩個(gè)組件:通用的基類(lèi):osg:Referenced,所有的osg節(jié)點(diǎn)和場(chǎng)景圖形均繼承自這一基類(lèi),它包含了一個(gè)整形的引用計(jì)數(shù)器。Osg定義的智能指針模板類(lèi)r

17、ef_ptr。當(dāng)代碼中一個(gè)Referenced對(duì)象指針賦予類(lèi)型變量ref_ptr時(shí),Referenced類(lèi)的引用計(jì)數(shù)器會(huì)自動(dòng)加一。當(dāng)你創(chuàng)建任何繼承自Referenced的場(chǎng)景圖形節(jié)點(diǎn)或數(shù)據(jù)時(shí),你的應(yīng)用程序不可以直接釋放其內(nèi)存空間。Referenced類(lèi):實(shí)現(xiàn)了對(duì)內(nèi)存區(qū)段的引用計(jì)數(shù)器功能。包括三個(gè)主要組成部分:保護(hù)成員整形變量:_refCount,用作引用計(jì)數(shù)。公有函數(shù)ref()和unref()用于實(shí)現(xiàn)_refCount的增加或減少。不需要直接調(diào)用。作為保護(hù)成員存在的虛析構(gòu)函數(shù)。ref_ptr模板類(lèi):用于實(shí)現(xiàn)一個(gè)指向Referenced對(duì)象的智能指針,并對(duì)其引用計(jì)數(shù)器進(jìn)行管理。包含以下三個(gè)主要的

18、組成部分:一個(gè)私有指針_ptr:用于保存管理內(nèi)存區(qū)域的地址。 可以用get()方法返回_ptr的值。為了使ref_ptr可以像正常指針一樣工作,重載或定義了一些方法,如operator-()和Operator-()等。Valid方法用于判斷ref_ptr是否為空,不為NULL則返回true。總結(jié):1將派生自Referenced的對(duì)象賦予ref_ptr變量,將自動(dòng)調(diào)用Referenced:ref()并使引用計(jì)數(shù)加一。2.如果將ref_ptr變量指向其他的對(duì)象,或者將其釋放,那么將調(diào)用Referenced:unref(),使引用計(jì)數(shù)減一,當(dāng)引用計(jì)數(shù)的值為零時(shí),unref()自動(dòng)釋放對(duì)象所占用的內(nèi)存

19、空間。3.為新的Referenced對(duì)象開(kāi)辟內(nèi)存空間時(shí),要盡量將其賦予ref_ptr,以保證osg的內(nèi)存管理工作正確。二葉節(jié)點(diǎn)和幾何信息Geometry概述向量與數(shù)組類(lèi):Osg:vec3可用來(lái)保存頂點(diǎn)和法線數(shù)據(jù);osg:vec4可用來(lái)保存顏色數(shù)據(jù);osg:vec2可用來(lái)保存2d紋理坐標(biāo),還提供了相關(guān)的向量計(jì)算函數(shù)。模板數(shù)組類(lèi):模板最常用法是保存向量數(shù)據(jù),如osg:Vec2Array,osg:Vec3Array,osg:Vec4Array,所有的模板數(shù)組類(lèi)都繼承自std:vectorDrawables類(lèi)用于保存將要渲染的數(shù)據(jù)。是一個(gè)無(wú)法直接實(shí)例化的虛基類(lèi)。Osg核心庫(kù)從Drawables派生了三

20、個(gè)子類(lèi):Osg:DrawPixels,封裝了glDrawPixels()的相關(guān)功能;osg:ShapeDrawable,提供了一些已經(jīng)定義好的幾何體的接口,如圓柱體和球;osg:Geometry,使用的多,靈活。Geometry一些方法:setVertexArray(),setColorArray(),setNormalArray()setColorBinding(),setNormalBinding():設(shè)置顏色和法線綁定方式,參數(shù)是geometry的枚舉變量 BIND_OFF=0,BIND_OVERALL,BIND_PER_PRIMITIVE_SET,BIND_PER_PRIMITIVE,

21、BIND_PER_VERTEXAddPrimitiveSet:用于設(shè)置Geometry類(lèi)數(shù)據(jù)渲染的方法。參數(shù)為PrimitiveSet* primitiveset:PrimitiveSet無(wú)法實(shí)例化的虛基類(lèi)。PrimitiveSet的子類(lèi):DrawArrays(GLenum mode, GLint first, GLsizei count, int numInstances=0)。葉節(jié)點(diǎn)Osg:Geode是osg的葉節(jié)點(diǎn),它用于保存幾何信息用于渲染。三 組節(jié)點(diǎn)Group允許用戶程序?yàn)槠涮砑尤我鈹?shù)量的子節(jié)點(diǎn),子節(jié)點(diǎn)本身也可以繼續(xù)分發(fā)子節(jié)點(diǎn)。并且派生出了許多的子類(lèi):osg:Transform,os

22、g:LOD,osg:Switch等。由Referenced派生,可以自動(dòng)管理內(nèi)存空間。Osg編程的核心部分,它使得用戶應(yīng)用程序可以有效組織場(chǎng)景圖形中的數(shù)據(jù),它的強(qiáng)大之處在于它管理子節(jié)點(diǎn)的接口,還從Node處繼承了管理父節(jié)點(diǎn)的接口。1.子接口:Group使用std:vectorref_ptr來(lái)保存所有節(jié)點(diǎn)的指針,數(shù)組指針,因此可以使用索引來(lái)訪問(wèn)某個(gè)子節(jié)點(diǎn)。2.父接口:Group從Node那里繼承了父節(jié)點(diǎn)管理的接口,允許節(jié)點(diǎn)有多個(gè)父節(jié)點(diǎn)。3.變換節(jié)點(diǎn):Tranform對(duì)OpenGL的模型視圖矩陣堆棧產(chǎn)生影響。虛基類(lèi),無(wú)法實(shí)例化。用戶應(yīng)當(dāng)使用osg:MatrixTransform或osg:Posit

23、ionAttitudeTransform來(lái)替代它,這兩者均繼承自Tranform。Matrix:osg中的矩陣類(lèi),采用左乘,列數(shù)組矩陣,與opengl相反。矩陣變換節(jié)點(diǎn):MatrixTransformMatrixTransform的內(nèi)部使用了osg:Matrix對(duì)象,要?jiǎng)?chuàng)建一個(gè)執(zhí)行變換的MatrixTransform節(jié)點(diǎn),首先要?jiǎng)?chuàng)建變換矩陣Matrix并將其關(guān)聯(lián)到MatrixTransform。位置屬性變換節(jié)點(diǎn)PositionAttitudeTransform使用PositionAttitudeTransform節(jié)點(diǎn)可以實(shí)現(xiàn)使用Vec3位置坐標(biāo)和一個(gè)四元數(shù)完成的變換操作。Osg使用Quat來(lái)保

24、存四元數(shù)方位數(shù)據(jù)。4.細(xì)節(jié)層次節(jié)點(diǎn) LODLOD允許用戶指定各個(gè)子節(jié)點(diǎn)的有效范圍。該范圍包括了最大及最小值,缺省情況下其意義表示為距離。缺省條件下,LOD計(jì)算視點(diǎn)到物體包絡(luò)體中心點(diǎn)的距離。如果這樣并不符合渲染要求,那么用戶可以指定一個(gè)自定義的中心點(diǎn)。還可以設(shè)置判斷視點(diǎn)到物體之間的距離單位是長(zhǎng)度距離還是像素個(gè)數(shù)。5.開(kāi)關(guān)節(jié)點(diǎn)使用osg:Switch節(jié)點(diǎn)可以渲染或者跳過(guò)指定的子節(jié)點(diǎn)。四 渲染狀態(tài)用戶的應(yīng)用程序需要在osg:StateSet中設(shè)置渲染狀態(tài)。StateSet能夠自動(dòng)對(duì)狀態(tài)進(jìn)行優(yōu)化,并可以關(guān)聯(lián)到場(chǎng)景圖形中的任意一個(gè)節(jié)點(diǎn)或Drawable類(lèi)。用戶需要盡量使關(guān)聯(lián)到場(chǎng)景圖形的StateSet最

25、少化。Osg渲染狀態(tài)的兩部分:渲染屬性和渲染模式。渲染模式是指渲染的某個(gè)功能,而渲染屬性是這個(gè)功能的控制變量和參數(shù)。如果要設(shè)置渲染狀態(tài)的值,用戶程序需要執(zhí)行以下幾步操作:1.為將要設(shè)置狀態(tài)的Node或Drawable對(duì)象提供一個(gè)StateSet實(shí)例。2.在StateSet實(shí)例中設(shè)置狀態(tài)的渲染模式和渲染屬性。渲染屬性(Attribute)和渲染模式(mode)Osg為每個(gè)狀態(tài)屬性定義了不同的類(lèi),以便應(yīng)用程序采用,所有的屬性類(lèi)均繼承自osg:StateAttribute,StateAttribute是一個(gè)無(wú)法直接實(shí)例化的虛基類(lèi)。Osg將所有的屬性和模式分成兩大部分:紋理和非紋理。設(shè)置渲染屬性如果要

26、設(shè)置一項(xiàng)屬性,首先將要修改的屬性類(lèi)實(shí)例化。設(shè)置該類(lèi)的數(shù)值,然后用osg:StateSet:setAttribute()將其關(guān)聯(lián)到StateSet。設(shè)置渲染模式可以使用Osg:StateSet:setMode()允許或禁止某種模式。設(shè)置渲染屬性和模式如果要將某個(gè)屬性關(guān)聯(lián)到StateSet,同時(shí)打開(kāi)其對(duì)應(yīng)模式的許可,那么可以使用osg:StateSet:setAttributeAndModes()方法。狀態(tài)繼承當(dāng)你設(shè)置節(jié)點(diǎn)的渲染狀態(tài)時(shí),這個(gè)狀態(tài)將被賦予當(dāng)前的節(jié)點(diǎn)及其子節(jié)點(diǎn)。如果子節(jié)點(diǎn)對(duì)同一個(gè)渲染狀態(tài)設(shè)置了不同的屬性參數(shù),那么新的子節(jié)點(diǎn)狀態(tài)參數(shù)將會(huì)覆蓋原有的。換句話說(shuō),缺省情況下子節(jié)點(diǎn)可以改變自身的

27、某個(gè)狀態(tài)參數(shù),或者繼承父節(jié)點(diǎn)的同一個(gè)狀態(tài)。Osg允許用戶根據(jù)場(chǎng)景圖形中任意位置的渲染屬性和模式需求,而單獨(dú)改變?cè)械臓顟B(tài)繼承特性。用戶可以選擇以下這幾種枚舉形式:Osg:setAttribute:OVERRIDE:所有的子節(jié)點(diǎn)都將繼承這一屬性或模式,子節(jié)點(diǎn)對(duì)他們更改將會(huì)無(wú)效。Osg:setAttribute:PROTECTED:視為OVERRIDE的一個(gè)例外, 凡是設(shè)為這種形式的屬性或模式都不會(huì)受到父節(jié)點(diǎn)的影響。 Osg:setAttribute:INHERIT:這種模式強(qiáng)制子節(jié)點(diǎn)繼承父節(jié)點(diǎn)的渲染狀態(tài)。其效果是子節(jié)點(diǎn)的渲染狀態(tài)被解除,而使用父節(jié)點(diǎn)的狀態(tài)代替。紋理與映射為了在程序中實(shí)現(xiàn)基本的紋理

28、映射功能,用戶的代碼需要支持以下的步驟:1. 指定用戶幾何體的紋理坐標(biāo)2. 創(chuàng)建紋理屬性對(duì)象并保存紋理圖形信息3. 為StateSet設(shè)置合適的紋理屬性和模式1. 紋理坐標(biāo):Geometry類(lèi)同時(shí)還允許用戶程序指定一個(gè)或多個(gè)紋理坐標(biāo)數(shù)據(jù)數(shù)組。指定了紋理坐標(biāo)之后,還要指定相應(yīng)的紋理單元,osg使用紋理單元來(lái)實(shí)現(xiàn)多重紋理。(多重紋理就是在渲染一個(gè)多邊形的時(shí)候可以用到多張紋理圖.把多張紋理圖進(jìn)行一些顏色的操作,可以達(dá)到一些效果.但是多重紋理必須是在顯卡支持的情況下.)Osg并不支持非多重紋理接口。因此,用戶程序必須制定一個(gè)紋理單元,以對(duì)應(yīng)紋理坐標(biāo)數(shù)據(jù)和紋理狀態(tài)。如果要使用單一紋理的話,只需要制定到紋

29、理單元0即可。2. 讀取圖像用戶程序可以使用兩個(gè)類(lèi)來(lái)實(shí)現(xiàn)基本的2d紋理映射:osg:Texture2D和osg:Image,Texture2D屬于setAttribute的派生類(lèi),用于管理OpenGL紋理對(duì)象,而Image用于管理圖像像素?cái)?shù)據(jù)。如果要使用2d圖像文件作為紋理映射的圖形,只要將文件名賦給Image對(duì)象并將Image關(guān)聯(lián)到Texture2D即可。3. 紋理狀態(tài)用戶可以使用osg:StateSet:setTextureAttribute()將一個(gè)紋理屬性關(guān)聯(lián)到StateSet對(duì)象。setTextureAttribute()的第一個(gè)參數(shù)是紋理單元,第二個(gè)參數(shù)是繼承自StateAttri

30、bute類(lèi)的一種紋理屬性。合法的屬性紋理類(lèi)有六種:五種紋理類(lèi)型osg:Texture1D,osg:Texture2D, osg:Texture3D,osg:TextureCubeMap,osg:TextureRectangle,另一個(gè)是用于紋理坐標(biāo)的生成osg:TexGen。五 光照要在應(yīng)用程序中使用光照,需要遵循下面的步驟:1. 指定幾何體法線2. 允許光照并設(shè)定光照狀態(tài)3. 指定光源屬性并關(guān)聯(lián)到場(chǎng)景圖形4. 指定表面材質(zhì)屬性法線光照狀態(tài)光源:定義一個(gè)osg:Light對(duì)象以定義光源參數(shù)。然后將Light添加到osg:LightSource節(jié)點(diǎn)中,并將LightSource添加到場(chǎng)景圖形。由

31、Light定義的光源將對(duì)整個(gè)場(chǎng)景產(chǎn)生影響。材質(zhì)屬性:osg:Material封裝了OpenGL中的glMatrial()和glColorMaterial()指令的函數(shù)功能。要允許顏色追蹤材質(zhì)的特性,需要調(diào)用Material:setColorMode()方法。六 文件I/OosgDB庫(kù)提供了用戶程序讀取和寫(xiě)入2D圖形和3D模型文件的函數(shù)接口。osgDB庫(kù)還負(fù)責(zé)管理osg的插件系統(tǒng),以實(shí)現(xiàn)對(duì)不同文件格式的支持。1. 接口osgDB提供了文件I/O的函數(shù)接口,從而將插件系統(tǒng)完全影藏在用戶程序之外。需要的兩個(gè)頭文件是:osgDB/ReadFileosgDB/WriteFile讀取文件:使用函數(shù)osgD

32、B:readNodeFile(string & filename)(3d模型文件的讀?。┖蚾sgDB:readImageFile(string & filename)(2d圖像的讀?。﹣?lái)讀取3d模型和2d圖像文件。readNodeFile()返回一個(gè)指向場(chǎng)景圖形節(jié)點(diǎn)的指針。readImageFile()返回Image對(duì)象的指針。寫(xiě)入文件:利用函數(shù)osgDB:writeNodeFile()和osgDB:writeImageFile()將數(shù)據(jù)寫(xiě)入到3d模型或2d圖像文件中。插件的檢索和注冊(cè):osg插件也就是一組動(dòng)態(tài)鏈接庫(kù),其中實(shí)現(xiàn)了osgDB頭文件ReadFile定義的接口。Registry類(lèi)維護(hù)

33、了一個(gè)擴(kuò)展名的化名映射表來(lái)對(duì)應(yīng)不同的文件格式和支持此類(lèi)格式的插件。七 NodeKit與osgTextOsg庫(kù)提供了豐富的設(shè)計(jì)功能,不過(guò)有時(shí)還是需要從osg的核心節(jié)點(diǎn)類(lèi)中派生出自己的特定節(jié)點(diǎn)。而這些派生的功能往往不屬于osg核心部分,而是適合作為輔助的庫(kù)存在。所謂NodeKit就是指一種開(kāi)發(fā)集成庫(kù),它擴(kuò)展自osg核心功能的特定節(jié)點(diǎn)類(lèi)(Node),渲染屬性類(lèi)(StateAttribute),繪圖類(lèi)(Drawable),并且使用osg包裝類(lèi)(wrapper)對(duì)這些新的功能類(lèi)提供.osg文件格式的支持。osgText組件:在這個(gè)命名空間中有一些十分使用的加載字體和文字渲染類(lèi)。核心類(lèi):Text:繼承自D

34、rawable類(lèi),可用于顯示任意長(zhǎng)度的字符串。Font:osgText的函數(shù)可以根據(jù)字體文件的名稱(chēng)來(lái)創(chuàng)建Font對(duì)象。要在程序中使用osgText,用戶通常要遵守下面的三個(gè)步驟:1. 如果要使用一種字體顯示多行文字,只需要?jiǎng)?chuàng)建一個(gè)Font對(duì)象,然后在Text對(duì)象之間共享即可。2. 為每一段要顯示的字符串建立一個(gè)Text對(duì)象。指定對(duì)齊方式,文字方向,位置和大小參數(shù),將步驟一中的Font對(duì)象關(guān)聯(lián)到新的Text對(duì)象中。3. 使用addDrawable函數(shù)將Text對(duì)象添加到Geode節(jié)點(diǎn)。用戶可以向一個(gè)Geode節(jié)點(diǎn)添加多個(gè)Text對(duì)象,或者根據(jù)自己的需要?jiǎng)?chuàng)建多個(gè)Geode節(jié)點(diǎn)。將Geode節(jié)點(diǎn)作為

35、場(chǎng)景圖形的子節(jié)點(diǎn)加入。坐標(biāo)位置:利用Text:setPosition()改變?cè)谠c(diǎn)的默認(rèn)值。文字方向:可以使用Text:setAxisAlignment方法來(lái)設(shè)置文字的位置。輸入?yún)?shù)為T(mén)ext:AxisAlignment的枚舉量。對(duì)齊方式:使用函數(shù)Text:setAlignment()參數(shù)是Text:AlignmentType枚舉量。文字尺寸:分辨率:顏色:Text:setColor()設(shè)置顏色.osg文件格式:osg筆記三 2011-07-10 11:41:02| 分類(lèi): OSG | 標(biāo)簽: |字號(hào)大中小 訂閱 在用戶程序中使用osg一渲染Osg開(kāi)放了所有的功能模塊。因此用戶程序完全可以使用

36、最底層的osg功能來(lái)執(zhí)行渲染操作。假設(shè)用戶希望能夠完全自主的控制場(chǎng)景圖形的渲染,那么也可以按照下面的步驟編寫(xiě)應(yīng)用程序的代碼:1. 設(shè)計(jì)自己的視角管理代碼:以改變OpenGL的模型視圖矩陣。2. 創(chuàng)建用戶窗口和OpenGL上下文,并將他們激活。如果有需要的話,用戶也可以自行編寫(xiě)管理多窗口和多個(gè)設(shè)備上下文的代碼。3. 如果應(yīng)用程序需要使用分頁(yè)數(shù)據(jù)庫(kù),那么可以使用osgDB:DatabasePager類(lèi)4. 可以將osgUtil:UpdateVisitor,osgUtil:CullVisitor,osgUtil:RenderStage對(duì)象實(shí)例化,以實(shí)現(xiàn)場(chǎng)景的更新,挑選和繪制遍歷。如果用戶希望獲得更多

37、的控制權(quán),則可以自己編寫(xiě)類(lèi)來(lái)實(shí)現(xiàn)以上遍歷的特性。5. 編寫(xiě)主循環(huán)代碼來(lái)處理操作系統(tǒng)返回的事件。并且調(diào)用自己的視角觀察代碼來(lái)更新模型視圖矩陣。6. 在渲染一幀之前先要調(diào)用glClear()。渲染時(shí)要依次執(zhí)行場(chǎng)景更新,挑選和繪制遍歷,最后交換緩存數(shù)據(jù)。7. 如果用戶程序或者運(yùn)行改程序的軟硬件平臺(tái)需要立體化渲染(stereo rendering)或者多通道渲染(multipipe rendering)功能的支持,則可以自行編寫(xiě)額外的代碼。8. 最后請(qǐng)依照平臺(tái)無(wú)關(guān)性的要求來(lái)編寫(xiě)所有的代碼,這樣你的代碼才可以在所有的目標(biāo)平臺(tái)上運(yùn)行通過(guò)。用戶使用osg時(shí),往往可以利用以下這些工具和庫(kù)來(lái)簡(jiǎn)化開(kāi)發(fā)的過(guò)程:1.

38、 osgUtil:SceneView:這個(gè)類(lèi)封裝了更新,挑選,和繪制遍歷,但是并不啟用DatabasePager。有一部分應(yīng)用程序會(huì)使用SceneView作為osg渲染的主接口。2. Producer和osgProducerProducer是一個(gè)外部的攝像機(jī)庫(kù),可以支持多通道渲染。osgProducer是一個(gè)集成了Producer和osg的應(yīng)用庫(kù)。Producer有相當(dāng)多的用戶,目前有一部分的osg程序是基于osgProducer和Producer開(kāi)發(fā)的。Osg2.0版本核心添加了一個(gè)新的庫(kù)成員osgViewer。osgViewer包含了一系列的用于控制視口顯示的相關(guān)的類(lèi),并封裝了大量用戶常用

39、的功能函數(shù),例如顯示管理,事件響應(yīng),場(chǎng)景渲染等。這個(gè)庫(kù)使用osg:Camera類(lèi)來(lái)管理OpenGL的模型視圖矩陣。與SceneView類(lèi)不同,osgViewer的視口類(lèi)提供了對(duì)DatabasePager的全部支持。osgViewer還可以針對(duì)同一個(gè)場(chǎng)景圖形,提供并通過(guò)多個(gè)獨(dú)立的視口顯示該場(chǎng)景。3.1.1 Viewer類(lèi)改變視口:Viewer在其內(nèi)部創(chuàng)建了一個(gè)osg:Camera攝像機(jī)對(duì)象來(lái)管理osg的模型視圖矩陣。用戶可以通過(guò)以下的兩個(gè)方法來(lái)控制Camera對(duì)象。將一個(gè)攝像機(jī)控制器對(duì)象關(guān)聯(lián)到Viewer中。如果你的程序不需要這么做,那么Viewer.run()將自動(dòng)創(chuàng)建一個(gè)osgGA:Trac

40、kballManipulator對(duì)象來(lái)控制攝像機(jī)的工作。osgGA庫(kù)定義了一些常用的控制器類(lèi)。用戶可以調(diào)用Viewer:setCameraManipulator來(lái)指定一個(gè)期望的控制器。設(shè)置Camera對(duì)象的投影矩陣和觀察矩陣為自定義的矩陣值。這樣也可以保證用戶程序能夠完全控制視口的瀏覽動(dòng)作。osgViewer:setViewMatrix()方法來(lái)設(shè)置視口矩陣。參數(shù)是一個(gè)osg:Matrix矩陣,osgViewer:setViewMatrixAsLookat():參數(shù)和gluLookAt類(lèi)似,三個(gè)向量:eye,center,up。設(shè)置清屏顏色:Camera:setClearColor()用來(lái)設(shè)置

41、清屏顏色,缺省情況下會(huì)清除深度和顏色緩存,可以使用Camera:setClearMask(GL_CLOLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)來(lái)設(shè)置清除屬性。3.1.2 SimpleViewer 和 CompositeViewerosgViewer:SimpleViewer類(lèi)不會(huì)主動(dòng)的創(chuàng)建窗口或者設(shè)備上下文,它需要依賴用戶程序來(lái)創(chuàng)建窗口、上下文,并將其激活為當(dāng)前設(shè)備,如果操作正確的話,SimpleViewer:frame()將會(huì)在用戶給定的窗口中渲染。osgViewer:CompositeViewer:Viewe

42、r類(lèi)只能在一個(gè)場(chǎng)景中添加一個(gè)視口,而CompositeViewer類(lèi)可以支持一個(gè)或多個(gè)場(chǎng)景的多個(gè)視口顯示,并允許用戶程序指定其渲染順序。CompositeViewer還支持渲染到紋理(RTT)的操作,即,允許用戶程序?qū)⒁粋€(gè)視口中渲染的圖像作為另一個(gè)視口的紋理貼圖。二動(dòng)態(tài)更改Osg允許用戶動(dòng)態(tài)的修改場(chǎng)景圖形并因而改變每一幀的顯示。用戶可以更改幾何數(shù)據(jù),渲染狀態(tài)參數(shù),Switch節(jié)點(diǎn)設(shè)置,以及任何場(chǎng)景圖形的結(jié)構(gòu)。OsgViewer庫(kù)支持多線程模式,每一個(gè)線程均獨(dú)立的運(yùn)行挑選及繪制遍歷,但osg并沒(méi)有為了線程的安全性增設(shè)內(nèi)存鎖,而是要求用戶程序只可在挑選及繪制遍歷的時(shí)域之外修改場(chǎng)景圖形。確保用戶的修

43、改不會(huì)與挑選及繪制線程發(fā)生沖突,一個(gè)簡(jiǎn)單的方案是,在Viewer:frame()的調(diào)用之外進(jìn)行場(chǎng)景圖形的修改,這需要在主渲染循環(huán)中添加額外的代碼。但如果用戶希望自己的程序更加整潔及規(guī)范的話,可以選擇在更新遍歷中進(jìn)行場(chǎng)景的修改操作。一些與場(chǎng)景圖形動(dòng)態(tài)更改相關(guān)的基本技術(shù):1. 處于性能優(yōu)化和線程安全性的考慮,用戶需要通知osg,場(chǎng)景圖形的哪些部分是可能要進(jìn)行修改的。用戶可以通過(guò)設(shè)置Object對(duì)象(Node,Drawable,StateSet等)的數(shù)據(jù)變度(data variance)屬性來(lái)完成這一工作。2. osh允許用戶為Node和Drawable設(shè)置回調(diào)(callback)。Osg將在特定遍

44、歷中執(zhí)行這些回調(diào),3. 用戶程序有時(shí)不能預(yù)知場(chǎng)景圖形的哪一部分需要修改。這是需要搜索整個(gè)場(chǎng)景圖形來(lái)查找特定的節(jié)點(diǎn),或者由用戶使用鼠標(biāo)等輸入設(shè)備來(lái)選擇一個(gè)節(jié)點(diǎn)。3.21 數(shù)據(jù)邊度OsgViewer支持的多線程模型允許主循環(huán)不必等到繪制遍歷結(jié)束就可以繼續(xù)運(yùn)行,也就是Viewer:frame()方法在繪制遍歷仍未結(jié)束的時(shí)候就可以返回。換句話說(shuō),上一幀的繪制遍歷可以與下一幀的更新遍歷產(chǎn)生重疊。Osg提供了osg:object:DataVariance()方法解決繪制遍歷與多線程的更新操作的沖突。(Frame():Render a complete new frame)。用于處理繪制遍歷與其他遍歷的同步

45、性。3.2.2 回調(diào)Osg允許用戶設(shè)置Node和Drawable對(duì)象的回調(diào)類(lèi)。Node可以在執(zhí)行更新和挑選時(shí)進(jìn)行回調(diào),Drawable可以在挑選和繪制遍歷時(shí)進(jìn)行回調(diào)。使用NodeCallback,用戶程序所需要執(zhí)行的步驟:1. 從NodeCallback繼承一個(gè)新的類(lèi)。2. 重載NodeCallback:operator()方法,實(shí)現(xiàn)場(chǎng)景圖形的動(dòng)態(tài)更改。3. 實(shí)例化繼承而來(lái)的類(lèi),然后使用Node:setUpdateCallback()方法關(guān)聯(lián)到將要修改的Node。NodeCallback:operator()兩參數(shù):第一個(gè)是回調(diào)類(lèi)所關(guān)聯(lián)的Node節(jié)點(diǎn)地址,第二個(gè)參數(shù)是osg:NodeVisit

46、or對(duì)象的地址。NodeVisitor:traverse():這個(gè)方法允許osg訪問(wèn)其他的節(jié)點(diǎn)并執(zhí)行其回調(diào)。3.2.3 NodeVisitor類(lèi)這是osg對(duì)于訪問(wèn)器(visitor)設(shè)計(jì)思想的實(shí)現(xiàn)。從本質(zhì)上說(shuō),NodeVisitor類(lèi)遍歷了一個(gè)場(chǎng)景圖形并為每一個(gè)被訪問(wèn)節(jié)點(diǎn)調(diào)用特定的函數(shù)。這一簡(jiǎn)單的技術(shù)卻是許多osg操作的基類(lèi),如osgUtil:Optimizer,osgUtil的幾何體處理類(lèi)。Osg使用osgUtil:UpdateVisitor類(lèi)(繼承自NodeVisitor)來(lái)實(shí)現(xiàn)更新遍歷。NodeVisitor是一個(gè)基類(lèi),用戶程序無(wú)法直接將其實(shí)例化。但用戶程序可以使用osg提供的任何Nod

47、eVisitor派生類(lèi),也可以自己編寫(xiě)繼承自NodeVisitor類(lèi)的代碼。NodeVisitor包含了一些經(jīng)過(guò)重載的apply()方法,其輸入?yún)?shù)涵蓋了大部分osg的節(jié)點(diǎn)類(lèi)型。當(dāng)一個(gè)NodeVisitor對(duì)象遍歷整個(gè)場(chǎng)景圖形時(shí),它將會(huì)為每個(gè)被訪問(wèn)的節(jié)點(diǎn)調(diào)用其相應(yīng)的apply()方法。使用特定的名稱(chēng)來(lái)搜索節(jié)點(diǎn)也是一種簡(jiǎn)單而實(shí)用的操作。允許NodeVisitor遍歷:缺省情況下,NodeVisitor類(lèi)禁止執(zhí)行遍歷。因此在你的派生類(lèi)中,需要使用枚舉量NodeVisitor:TRAVERSE_ALL_CHILDREN來(lái)初始化基類(lèi),以允許執(zhí)行遍歷,否則osg將不會(huì)調(diào)用apply()方法。如果要使用N

48、odeVisitor來(lái)遍歷整個(gè)場(chǎng)景圖形,可以將NodeVisitor作為Node:accept()的輸入?yún)?shù)傳遞。你可以在任何一個(gè)節(jié)點(diǎn)上調(diào)用accept(),NodeVisitor將從那個(gè)節(jié)點(diǎn)開(kāi)始遍歷整個(gè)場(chǎng)景圖形,如果要搜索整個(gè)場(chǎng)景圖形的話,可以從根節(jié)點(diǎn)開(kāi)始調(diào)用accept()。3.2.4 用戶選擇從本質(zhì)上講,osg程序通過(guò)兩個(gè)步驟來(lái)實(shí)現(xiàn)用戶選擇:1. 接受鼠標(biāo)事件osgGA提供了允許程序接受鼠標(biāo)事件的事件類(lèi),它具備設(shè)備平臺(tái)無(wú)關(guān)特性。2. 判斷場(chǎng)景圖形的哪個(gè)部分被鼠標(biāo)光標(biāo)覆蓋。osgUtil提供了一種相交集類(lèi)(Intersection),可以在鼠標(biāo)xy坐標(biāo)的周?chē)鷦?chuàng)建包圍盒,并判段包圍盒與場(chǎng)景圖

49、形的相交情況,osgUtil將按照由前至后的順序返回與包圍盒相交的節(jié)點(diǎn)列表。捕捉鼠標(biāo)事件osgGA:TrackballManipulator將鼠標(biāo)事件作為輸入,并修改用于控制用戶視口的osg:Camera視口矩陣。TrackballManipulator派生自osgGA:GUIEventHandler類(lèi),是虛基類(lèi),無(wú)法實(shí)例化,但用戶可以從GUIEventHandler派生自己的類(lèi),以實(shí)現(xiàn)各種基于GUI事件的操作。要實(shí)現(xiàn)鼠標(biāo)控制的選擇操作,可以從GUIEventHandler派生新的類(lèi),并重載GUIEventHandler:Handle()方法,以接收鼠標(biāo)事件。然后用戶可以創(chuàng)建新類(lèi)的實(shí)例并將其關(guān)

50、聯(lián)到應(yīng)用程序的觀察視口。Virtual bool GUIEventHandler:Handle(const osgGA:GUIEventAdapter & ea,osgGA:GUIActionAdapter & aa);用戶實(shí)現(xiàn)的Handle()方法可以接收來(lái)自GUIEventAdapter的各種GUI事件,包括鼠標(biāo)事件。GUIEventAdapter類(lèi)的頭文件中定義了枚舉類(lèi)型EventType,用戶程序可以從中選擇自己需要的GUI事件。使用GUIEventAdapter.getEventType()方法可以得到當(dāng)前的事件類(lèi)型。GUIActionAdapter是用戶返回給GUI系統(tǒng)的程序接口。

51、當(dāng)遇到鼠標(biāo)選擇的操作時(shí),用戶將用于選擇事件的GUIEventHandler關(guān)聯(lián)到視口類(lèi),則視口類(lèi)就是一個(gè)GUIActionAdapter。用戶需要使用他來(lái)實(shí)現(xiàn)當(dāng)前視口與場(chǎng)景之間的交互。在渲染視口之前,用戶往往會(huì)創(chuàng)建一個(gè)GUIEventHandler派生類(lèi)的實(shí)例,并使用Viewer:addEventHandler()將其關(guān)聯(lián)到視口。一個(gè)視口可以有多個(gè)事件處理器,Viewer將事件處理對(duì)象添加到一個(gè)事件處理列表中。運(yùn)行時(shí)Viewer將調(diào)用每個(gè)GUI事件的handle()函數(shù),直到其中一個(gè)的handle()函數(shù)返回true為止。要實(shí)現(xiàn)接收鼠標(biāo)事件并實(shí)現(xiàn)用戶選擇的功能,需要經(jīng)過(guò)以下幾個(gè)步驟:1. 從G

52、UIEventHandler繼承新的類(lèi),重載handler()方法。2. 在handler()方法中檢查GUIEventAdapter參數(shù)傳遞的事件類(lèi)型,并針對(duì)需要的事件類(lèi)型執(zhí)行相應(yīng)的操縱。方法返回true時(shí)將阻止其他事件處理器繼續(xù)接受事件消息。3. 在渲染之前,創(chuàng)建事件處理器的實(shí)例,并使用addEventHandler()方法添加到視口中。Osg將會(huì)把視口作為GUIActionAdapter參數(shù)傳遞給handler()方法。交集Osg使用一種多胞體(polytope)的金字塔形包圍盒代替射線。這種金字塔的頂峰位于視點(diǎn),其中心軸直接穿過(guò)鼠標(biāo)(光標(biāo))的位置。它距離視點(diǎn)的寬度是由視場(chǎng)和程序控制的寬

53、度參數(shù)決定的。osgUtil:IntersectionVisitor類(lèi)繼承自NodeVisitor,它可以監(jiān)測(cè)每個(gè)定點(diǎn)的包圍盒與交集包圍盒的關(guān)系,并允許在某個(gè)子圖形不可能存在有交集的子節(jié)點(diǎn)時(shí),跳過(guò)該子圖形的遍歷。用戶可以設(shè)置IntersectionVisitor類(lèi)并使用幾種不同的幾何結(jié)構(gòu)進(jìn)行交集檢測(cè)。其構(gòu)造函數(shù)使用osgUtil:Intersector作為輸入?yún)?shù),Intersector定義了選擇操作的幾何體并執(zhí)行實(shí)際的交集操作。Intersector是一個(gè)純虛基類(lèi),osgUtil庫(kù)從中派生了許多代表不同幾何結(jié)構(gòu)的新類(lèi)。有些程序需要拾取單獨(dú)的頂點(diǎn)和多邊形,而有些程序只需要簡(jiǎn)單的獲取那些包含了被

54、選節(jié)點(diǎn)的Group或Transform父節(jié)點(diǎn)。IntersectionVisitor返回osg:NodePath對(duì)象來(lái)滿足這些要求。NodePath是一個(gè)std:vector向量,它表示沿著根節(jié)點(diǎn)到葉節(jié)點(diǎn)呈現(xiàn)出一定排列層次的節(jié)點(diǎn)路線。如果用戶程序需要獲取中的父節(jié)點(diǎn),只需要從后到錢(qián)搜索滿足要求的節(jié)點(diǎn)即可。要實(shí)現(xiàn)osg中的鼠標(biāo)選擇操作,需要按照如下的步驟編寫(xiě)代碼:1. 創(chuàng)建并設(shè)置PolytopeIntersector,其中的鼠標(biāo)位置應(yīng)當(dāng)使用GUIEventAdapter中經(jīng)過(guò)歸一化的數(shù)據(jù)。2. 創(chuàng)建IntersectionVisitor對(duì)象,并將PolytopeIntersector作為其構(gòu)造函數(shù)

55、的輸入?yún)?shù)。3. 由場(chǎng)景圖形的根節(jié)點(diǎn)加載IntersectionVisitor,一般來(lái)說(shuō)是通過(guò)Viewer中的Camera對(duì)象,如下面的代碼:iv是一個(gè)IntersectionVisitor對(duì)象viewer.getCamera()-accept(iv);4. 如果PolytopeIntersector的返回值包含了交集,那么可以獲取返回的NodePath并搜索符合要求的節(jié)點(diǎn)。osg筆記 四 2011-08-03 16:10:23| 分類(lèi): OSG | 標(biāo)簽: |字號(hào)大中小 訂閱 九 例子系統(tǒng)osgParticle:explosionEffect用于爆炸的模擬,fireEffect用于火的模擬,

56、explosionDebrisEffect用于爆炸后四散的顆粒的模擬。osgParticle的中堅(jiān)類(lèi):osgParticle:Particle 粒子模板,塊定粒子的大小,顏色,生命周期等等。osgParticle:ParticleSystem 粒子系統(tǒng)的總體屬性,粒子總數(shù),紋理等。osgParticle:Counter 粒子產(chǎn)生的數(shù)目范圍 osgParticle:Placer 粒子出生點(diǎn)的形狀態(tài) 如環(huán) 圓 點(diǎn) 形osgParticle:Shooter 粒子發(fā)射器,決定粒子的初速 osgParticle:Emitter 上述模板以及操作都為此類(lèi)服務(wù),類(lèi)名:發(fā)射器osgParticle:Progr

57、am 可接受對(duì)粒子的操作,如軌跡的定義,矩陣的變換等等osgParticle:Operator 粒子操作或用戶自定義粒子操作osgParticle:ParticleEffect 可單獨(dú)使用的粒子渲染,模仿煙霧,爆炸等等osgParticle:osgPrecipitationEffect 可以使用霧效,雪效等等osg使用粒子系統(tǒng)所經(jīng)歷步驟:1. 確定意圖 包括粒子的運(yùn)動(dòng)方式等等 2. 建立粒子模板 按所需要的類(lèi)型確定粒子的角度,形狀,生命周期等3. 建立粒子系統(tǒng) 設(shè)置總的屬性4. 設(shè)置發(fā)射器 發(fā)射形狀,發(fā)射粒子的數(shù)目變化等等 5. 設(shè)置操作 旋轉(zhuǎn)度,風(fēng)力等等6. 加入節(jié)點(diǎn),更新視口&LOD&多通道1. 多視口創(chuàng)建視口必須有以下

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論