osg::Shape類html
繼承自osg::Object類;數組
osg::Shape類是各類內嵌幾何體的基類,不但能夠用於剔除和碰撞檢測,還可用於生成預約義的幾何體對象;wordpress
常見的內嵌幾何體包括:函數
osg::ShapeDrawable類:工具
派生自osg::Drawable類;spa
在osg::ShapeDrawable類的構造函數中提供了關聯osg::Shape的方法;code
同時,由於它繼承自osg::Drawable類,因此它的實例須要被添加到葉節點中才能被實例繪製。orm
API解釋:htm
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,畫出來的平面是斜的。
在OpenSceneGraph的建模和繪圖工具中,osg::Geometry類有着十分重要的地位。使用Geometry類,用戶能夠經過指定頂點,顏色和法線的方式,繪製簡單的線段,三角形,多邊形。並將繪圖的結果添加到場景的葉結點Geode中。
使用Gemetry類進行簡單圖形的繪製,通常能夠分爲這樣幾個步驟:
一、 創建新的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; //法線索引數組
二、 向頂點座標變量數組中輸入頂點數據,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));
三、 設置頂點座標,顏色和法線座標的索引值。索引值可使用整數類型的向量組列表來存放,用戶使用索引表從頂點座標的數組中獲取指定位置的數據,從而按照指定順序鏈接各個頂點,組成指定的圖形。用戶也能夠選擇不設置索引數組,此時OSG內部將按照缺省的索引順序排列。例如上述的座標和顏色信息,若是按照缺省的索引排列繪製一個四邊形,那麼獲得的結果如左圖;而若是使用索引值數組來從新獲取和排列座標或者顏色的數據的的話,那麼能夠得到與此不一樣的結果,例如:
colindex->push_back(3); colindex->push_back(2); colindex->push_back(1); colindex->push_back(0);
注意,能夠屢次索引同一個座標或者顏色數據,可是若是已經指定繪圖中將要使用某個索引組,那麼該向量組不能爲空,不然會引起內存錯誤。
四、 向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)
五、 向Geometry類添加幾何體,並使用Geode類的addDrawable方法將Geometry類加入場景圖形的某個葉節點。
geo->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4)); 該行代碼中,使用DrawArrays類向Geometry類送入了新幾何體的信息,即,該幾何體是一個QUADS,它的頂點座標從索引數組中讀入,從第1個索引值開始,共讀入4個索引值,組成一個四邊形圖形。 幾何體的形狀參數除了QUADS以外,還有數種方式,以用於不一樣的用戶需求,列表以下:
|