osg::Shape類
繼承自osg::Object類;
osg::Shape類是各種內嵌幾何體的基類,不但可以用於剔除和碰撞檢測,還可用於生成預定義的幾何體對象;
常見的內嵌幾何體包括:
osg::ShapeDrawable類:
派生自osg::Drawable類;
在osg::ShapeDrawable類的構造函數中提供了關聯osg::Shape的方法;
同時,因為它繼承自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之外,還有數種方式,以用於不同的用戶需求,列表如下:
|