OSG中的幾何體


osg::Shape類

繼承自osg::Object類;

 

osg::Shape類是各種內嵌幾何體的基類,不但可以用於剔除和碰撞檢測,還可用於生成預定義的幾何體對象;

常見的內嵌幾何體包括:

clipboard

 

osg::ShapeDrawable類:

派生自osg::Drawable類;

在osg::ShapeDrawable類的構造函數中提供了關聯osg::Shape的方法;

clipboard

同時,因為它繼承自osg::Drawable類,所以它的實例需要被添加到葉節點中才能被實例繪制。

 

createTexturedQuadGeometry函數解析

API解釋:

OSG_EXPORT Geometry* osg::createTexturedQuadGeometry(const Vec3 & corner,const Vec3 & widthVec,const Vec3 & heightVec,float l,float b,float r,float t )

Convenience function to be used for creating quad geometry with texture coords.

Tex coords go from left bottom (l,b) to right top (r,t).

 

看起來,corner變量是起點,從這個起點按照widthVec和heightVec來畫出一個QUAD矩形,至於后面的l,b,r,t,似乎是和二維貼圖有關的,也就是取貼圖上的那一部分。

根據這一點點說明,完全不夠,各種嘗試之后,各參數的功能大致如下。

先說l,b,r,t,l,b一般都取0.0,r,t如果不相等,那么二維的貼圖會變成長方形。也就是說,我的黑白棋盤格,會變成黑白長方格。相等的話,就會變成黑白正方格。

再說corner,這是從左下角起始的點,是這個起始點的世界坐標。

比如說,我想讓生成的正方形地面,面朝上,並且位於世界中心,那么corner,widthVec,heightVec應該這樣設置。

corner(-50.0, -50.0, -3.0) widthVec(0.0, 100.0, -3.0) heightVec(100.0, 0.0, 0.0)

也就是說,起點在攝像機的左后方,-3.0是使其略微下沉的意思。然后沿Y方向划出去100,再向X方向畫100。注意,-3.0在widht和height兩者之一進行指定就行了,如果兩個向量的Z值都是-3.0,畫出來的平面是斜的。

OSG--Geometry

在OpenSceneGraph的建模和繪圖工具中,osg::Geometry類有着十分重要的地位。使用Geometry類,用戶可以通過指定頂點,顏色和法線的方式,繪制簡單的線段,三角形,多邊形。並將繪圖的結果添加到場景的葉結點Geode中。

使用Gemetry類進行簡單圖形的繪制,一般可以分為這樣幾個步驟:

1、    建立新的Geometry實例,用於輸入頂點,顏色等數據的osg::Vec3Array,osg::Vec4Array變量數組,以及用於建立點索引的osg::UByteArray,osg:: IntArray等。示例代碼如下:

osg::ref_ptr<osg::Geometry> geo = new osg::Geometry;
osg::Vec3Array* vecarray = new osg::Vec3Array;     //頂點坐標數組
osg::UByteArray* vecindex = new osg::UByteArray;   //頂點索引數組
osg::Vec4Array* colarray = new osg::Vec4Array;     //顏色RGB值數組
osg::UByteArray* colindex = new osg::UByteArray;   //顏色索引數組
osg::Vec3Array* norarray = new osg::Vec3Array;     //法線坐標數組
osg::UByteArray* norindex = new osg::UByteArray;   //法線索引數組

 

 

2、    向頂點坐標變量數組中輸入頂點數據,osg::Vec3Array是一個模板類,繼承自STL的vector,因此可以使用push_back方法送入osg::Vec3的坐標數據。顏色數據,法線坐標數據的保存與此類似,不過一般來說顏色數據使用osg::Vec4Array加以保存,除了RGB值之外,還包括一個Alpha分量。示例代碼如下:

vecarray->push_back(osg::Vec3(1.0, 0.0, 1.0));
vecarray->push_back(osg::Vec3(-1.0, 0.0, 1.0));
vecarray->push_back(osg::Vec3(-1.0, 0.0, -1.0));
vecarray->push_back(osg::Vec3(1.0, 0.0, -1.0));

colarray->push_back(osg::Vec4(1.0, 0.0, 0.0, 1.0));    //Red
colarray->push_back(osg::Vec4(0.0, 1.0, 0.0, 1.0));    //Green
colarray->push_back(osg::Vec4(0.0, 0.0, 1.0, 1.0));    //Blue
colarray->push_back(osg::Vec4(1.0, 1.0, 1.0, 1.0));    //White

norarray->push_back(osg::Vec3(0.0, -1.0, 0.0));

 

 

3、    設置頂點坐標,顏色和法線坐標的索引值。索引值可以使用整數類型的向量組列表來存放,用戶使用索引表從頂點坐標的數組中獲取指定位置的數據,從而按照指定順序連接各個頂點,組成指定的圖形。用戶也可以選擇不設置索引數組,此時OSG內部將按照缺省的索引順序排列。例如上述的坐標和顏色信息,如果按照缺省的索引排列繪制一個四邊形,那么得到的結果如左圖;而如果使用索引值數組來重新獲取和排列坐標或者顏色的數據的的話,那么可以獲得與此不同的結果,例如:

colindex->push_back(3);
colindex->push_back(2);
colindex->push_back(1);
colindex->push_back(0);

注意,可以多次索引同一個坐標或者顏色數據,但是如果已經指定繪圖中將要使用某個索引組,那么該向量組不能為空,否則會引發內存錯誤。

 

4、    向Geometry類設置數據。

geo->setVertexArray(vecarray);
geo->setVertexIndices(vecindex);
geo->setColorArray(colarray);
geo->setColorIndices(colindex);
geo->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
geo->setNormalArray(norarray);
geo->setNormalIndices(norindex);
geo->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE);

 

如果要使用缺省的索引順序,那么便不必設置頂點、顏色或者法線的索引列表,即,屏蔽setVertexIndices,setColorIndices和setNormalIndices三段。

要注意的是,上一段程序中還設置了顏色數據,法線數據與頂點數據綁定的方式,即setColorBinding和setNormalBinding,綁定數據的方式有以下幾種:

BIND_OFF 取消綁定 此時,顏色數據或者法線數據與頂點數據完全沒有關系,頂點數據的顏色和法線方向完全由缺省值決定。
BIND_OVERALL 綁定全部幾何體 此時,顏色數組或者法線坐標數組中只需要保存一個數據,該數據將影響此Geometry類的所有頂點坐標。例如,將紅色綁定到全部幾何體上,則這個類繪制出的所有物體均是紅色的。
BIND_PER_PRIMITIVE 綁定逐個幾何體 此時,顏色數組或者法線坐標數組中保存的數據數量應當與用戶將要繪制的幾何體數量相同。例如,用戶依據8個頂點來繪制兩個四邊形時,可以分別為它們設置兩個法線坐標,並使用此參數進行綁定。
BIND_PER_VERTEX 綁定逐個點 逐點綁定。比如上面的例子,將四個顏色數據分別綁定到四個頂點坐標,可以實現頂點顏色之間的過渡效果。

轉載自:http://hi.baidu.com/wangr02/blog/item/78924216e871bd4b20a4e9db.html

[原創]OSG Discussion–2:Geometry類的基礎繪圖(2)

5、    向Geometry類添加幾何體,並使用Geode類的addDrawable方法將Geometry類加入場景圖形的某個葉節點。

 

geo->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,

0,

4));

該行代碼中,使用DrawArrays類向Geometry類送入了新幾何體的信息,即,該幾何體是一個QUADS,它的頂點坐標從索引數組中讀入,從第1個索引值開始,共讀入4個索引值,組成一個四邊形圖形。

幾何體的形狀參數除了QUADS之外,還有數種方式,以用於不同的用戶需求,列表如下:

POINTS 繪制點 繪制用戶指定的所有頂點。
LINES 繪制直線 直線的起點、終點由數組中先后相鄰的兩個點決定;用戶提供的點不止兩個時,將嘗試繼續繪制新的直線。
LINE_STRIP 繪制多段直線 多段直線的第一段由數組中的前兩個點決定;其余段的起點位置為上一段的終點坐標,而終點位置由數組中隨后的點決定。
LINE_LOOP 繪制封閉直線 繪圖方式與多段直線相同,但是最后將自動封閉該直線。
TRIANGLES 繪制三角形 三角形的三個頂點由數組中相鄰的三個點決定,並按照逆時針的順序進行繪制;用戶提供的點不止三個時,將嘗試繼續繪制新的三角形。
TRIANGLE_STRIP 繪制多段三角形 第一段三角形的由數組中的前三個點決定;其余段三角形的繪制,起始邊由上一段三角形的后兩個點決定,第三點由數組中隨后的一點決定。
TRIANGLE_FAN 繪制三角扇面 第一段三角形的由數組中的前三個點決定;其余段三角形的繪制,起始邊由整個數組的第一點和上一段三角形的最后一個點決定,第三點由數組中隨后的一點決定。
QUADS 繪制四邊形 四邊形的四個頂點由數組中相鄰的四個點決定,並按照逆時針的順序進行繪制;用戶提供的點不止四個時,將嘗試繼續繪制新的四邊形。
QUAD_STRIP 繪制多段四邊形 第一段四邊形的起始邊由數組中的前兩個點決定,邊的矢量方向由這兩點的延伸方向決定;起始邊的對邊由其后的兩個點決定,如果起始邊和對邊的矢量方向不同,那么四邊形將會扭曲;其余段四邊形的繪制,起始邊由上一段決定,其對邊由隨后的兩點及其延伸方向決定。
POLYGON 繪制任意多邊形 根據用戶提供的頂點的數量,繪制多邊形。


免責聲明!

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



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