在知道如何使用Viewer視景器來進行仿真循環之后.總不會一直嘗試著顯示一頭有著球面映射的牛進行觀賞著.總會想著如何搭建自己的模型.如何實現自己所要繪制的一切.如你一樣.我也擁有著這種沖動.如同我一開始學OpenGL的時候.我繪制出第一個三角形便覺得十分的興奮.但當我嘗試用它們建立各種奇怪的圖形的時候.就像是搭積木一樣.覺得怪異卻....
Drawable 故名 可繪制的.. 那么什么才是可繪制的.我們可以想象.常使用的點.線.三角形.四邊形.等.這些就是可繪制的.OpenGL大可只能實現繪制最終也只是這些..
經常使用的場景圖是一般都是一顆樹. 那么在OSG也不例外.它是一顆節點樹.其最末梢的節點是Geode.即葉子節點. 一個Geode可以包含多個Drawable.因此在OSG中我們想要繪制諸如三角形等.最終需要使用的肯定也是Geode葉子節點.然后將Drawable加入Geode下...
osg/Drawable 只是一個抽象類.那么實現它的類有多少呢? 還是比較多的.

而這中間最常用的莫屬Geometry.幾何體繪制..而說到幾何體.需要的無非是點..顏色.以及如何組成圖元<Primitive>..
因此一個Geometry需要擁有的數據大可有點.法線坐標 紋理坐標.索引值...以及PrimitiveSet.
點,法線,顏色等 需要用到矢量 即 osg::Vec2 osg::Vec3 osg::Vec4
PrimitiveSet.則包含了組成如何組成一個圖元的規則..如GL_POINT GL_TRIANGLES.等.
用實例說明吧.如使用下面這段代碼將會創建一個多彩的三角形.和一個白色的立方體.

Geode
osg::Node* create()


{

/**//**
geode is a leaf node,It must contain some drawables..
*/
osg::Geode* geode = new osg::Geode;


/**//** define a Geometry for draw a triangle.*/
osg::Geometry* triangle = new osg::Geometry;
geode->addDrawable(triangle);


/**//** triangle Vertexs */
osg::Vec3Array* Tvertex = new osg::Vec3Array;
triangle->setVertexArray(Tvertex);
Tvertex->push_back(osg::Vec3(-2.0,0.0,-1.0));
Tvertex->push_back(osg::Vec3( 0.0,0.0,-1.0));
Tvertex->push_back(osg::Vec3(-1.0,0.0, 1.0));

/**//** set the color */
osg::Vec3Array* Tcolor = new osg::Vec3Array;
triangle->setColorArray(Tcolor);
triangle->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
Tcolor->push_back(osg::Vec3(1.0,0.0,0.0));
Tcolor->push_back(osg::Vec3(0.0,1.0,0.0));
Tcolor->push_back(osg::Vec3(0.0,0.0,1.0));


/**//** set the normal*/
osg::Vec3Array* Tnormal = new osg::Vec3Array;
Tnormal->push_back(osg::Vec3(0.0,-1.0,0.0));
triangle->setNormalArray(Tnormal);
triangle->setNormalBinding(osg::Geometry::BIND_OVERALL);


/**//** set the Primitive use GL_TRIANGLES*/
osg::PrimitiveSet* Tprimitive = new osg::DrawArrays(GL_TRIANGLES,0,3);
triangle->addPrimitiveSet(Tprimitive);



/**//** now define a box(center,width)*/
osg::Box* boxtest = new osg::Box(osg::Vec3(1.5,0.0,0.0),1.0);

/**//** use the ShapeDrawable*/
osg::ShapeDrawable* box = new osg::ShapeDrawable(boxtest);
geode->addDrawable(box);

return geode;
}
這里我將解釋一些東西.
1.Geometry默認是使用顯示列表來繪制圖元的.你大可觀看源碼或文檔去了解.你可以設置
setUseDisplayList(false) 禁用它.或者若在綁定數據的時候使用了BING_PER_PRIMITIVE也將會禁用顯示列表
2.ShapeDrawable 則是內置一些形狀的圖元.諸如 圓柱.球體.圓錐等.自己實現嘗試一下.
3.BING_PER_VERTEX 則指的每個頂點對應于一種屬性(如例子中的顏色).
4.BING_OVERALL 則是全部頂點使用一樣的屬性(如例子中的法線)
實例源代碼下載: ..
下載地址
忘了說明一點.在OSG當中的坐標系是 z朝上.y朝里.x朝右..與OpenGL中剛好繞x軸旋轉了90度..
還有一點則是.我們通常情況下默認使用視景器其中的一個關于攝像機漫游器其實默認是使用TrackballManipulator 因此.它會將視點中心指向整個場景的包圍球中心...
最終結果圖:如下:
posted on 2009-08-23 18:34
米游 閱讀(6162)
評論(2) 編輯 收藏 引用 所屬分類:
OpenGL/OSG