OSG中的幾何體

osg::Shape類html

繼承自osg::Object類;數組

 

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

常見的內嵌幾何體包括:函數

clipboard

 

osg::ShapeDrawable類:工具

派生自osg::Drawable類;spa

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

clipboard

同時,由於它繼承自osg::Drawable類,因此它的實例須要被添加到葉節點中才能被實例繪製。orm

 

createTexturedQuadGeometry函數解析

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,畫出來的平面是斜的。

OSG--Geometry

在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以外,還有數種方式,以用於不一樣的用戶需求,列表以下:

POINTS 繪製點 繪製用戶指定的全部頂點。
LINES 繪製直線 直線的起點、終點由數組中前後相鄰的兩個點決定;用戶提供的點不止兩個時,將嘗試繼續繪製新的直線。
LINE_STRIP 繪製多段直線 多段直線的第一段由數組中的前兩個點決定;其他段的起點位置爲上一段的終點座標,而終點位置由數組中隨後的點決定。
LINE_LOOP 繪製封閉直線 繪圖方式與多段直線相同,可是最後將自動封閉該直線。
TRIANGLES 繪製三角形 三角形的三個頂點由數組中相鄰的三個點決定,並按照逆時針的順序進行繪製;用戶提供的點不止三個時,將嘗試繼續繪製新的三角形。
TRIANGLE_STRIP 繪製多段三角形 第一段三角形的由數組中的前三個點決定;其他段三角形的繪製,起始邊由上一段三角形的後兩個點決定,第三點由數組中隨後的一點決定。
TRIANGLE_FAN 繪製三角扇面 第一段三角形的由數組中的前三個點決定;其他段三角形的繪製,起始邊由整個數組的第一點和上一段三角形的最後一個點決定,第三點由數組中隨後的一點決定。
QUADS 繪製四邊形 四邊形的四個頂點由數組中相鄰的四個點決定,並按照逆時針的順序進行繪製;用戶提供的點不止四個時,將嘗試繼續繪製新的四邊形。
QUAD_STRIP 繪製多段四邊形 第一段四邊形的起始邊由數組中的前兩個點決定,邊的矢量方向由這兩點的延伸方向決定;起始邊的對邊由其後的兩個點決定,若是起始邊和對邊的矢量方向不一樣,那麼四邊形將會扭曲;其他段四邊形的繪製,起始邊由上一段決定,其對邊由隨後的兩點及其延伸方向決定。
POLYGON 繪製任意多邊形 根據用戶提供的頂點的數量,繪製多邊形。
相關文章
相關標籤/搜索