在知道如何使用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
Geode
 osg::Node* create()
osg::Node* create()


 {
{

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


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


 /**//** triangle Vertexs */
    /**//** triangle Vertexs */
 osg::Vec3Array* Tvertex = new osg::Vec3Array;
    osg::Vec3Array* Tvertex = new osg::Vec3Array;
 triangle->setVertexArray(Tvertex);
    triangle->setVertexArray(Tvertex);
 Tvertex->push_back(osg::Vec3(-2.0,0.0,-1.0));
    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( 0.0,0.0,-1.0));
 Tvertex->push_back(osg::Vec3(-1.0,0.0, 1.0));
    Tvertex->push_back(osg::Vec3(-1.0,0.0, 1.0));
 
    

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


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


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



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

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

 return geode;
    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 
米游 阅读(6217) 
评论(2)  编辑 收藏 引用  所属分类: 
OpenGL/OSG