OSG中的几何体绘制(一)

任何复杂的东西都是由一些简单部分组合构成的,对于OSG创建的场景和对象也同样如此,它们是由简单的图元(我们把构成3D对象的构件成为图元)按照一定的方式排列和组合而成的,OSG中的所有图元都是一维或二维对象,包括点、线和复杂的多边形。

几何体(osg::Geometry)类,继承自osg::Drawable类,使用它用户可以通过指定顶点,颜色和法线的方式,绘制简单的线段,三角形,多边形,并将绘图的结果添加到场景的叶结点Geode中。一般步骤可分为:

1、建立新的Geometry实例,用于输入顶点,颜色等数据的变量数组

osg::ref_ptr geometry = 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、向顶点坐标变量数组中输入顶点数据。向颜色数组中添加颜色数据,除了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、向Geometry类设置数据

//指定向量数据
geometry->setVertexArray(vecarray);  //设置顶点数组
geometry->setVertexIndices(vecindex); //设置顶点索引数组
geometry->setColorArray(colarray);  //设置颜色数组
geometry->setColorIndices(colindex); //设置颜色索引数组
geometry->setNormalArray(norarray); //设置法线数组
geometry->setNormalIndices(norindex); //设置法线索引数组

//设置绑定方式
geometry->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE);  //设置法线绑定方式
geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); //设置颜色绑定方式

说明:绑定方式主要有以下几种:

BIND_OFF                 //不启用绑定。此时,颜色数据或者法线数据与顶点数据完全没有关系,顶点数据的颜色和法线方向完全由缺省值决定
BIND_OVERALL             //绑定全部的顶点。此时,颜色数组或者法线坐标数组中只需要保存一个数据,该数据将影响此Geometry类的所有顶点坐标。
BIND_PER_PRIMITIVE_SET   //单个绘图单元绑定。此时,颜色数组或者法线坐标数组中保存的数据数量应当与用户将要绘制的几何体数量相同。
BIND_PER_PRIMITIVE       //单个独立的绘图基元绑定
BIND_PER_VERTEX          //单个顶点绑定。逐点绑定。比如上面的例子,将四个颜色数据分别绑定到四个顶点坐标,可以实现顶点颜色之间的过渡效果。

4、添加图元,绘图基元为四边形

//数据解析,向Geometry类添加几何体,并使用Geode类的addDrawable方法将Geometry类加入场景图形的某个叶节点。
//geometry->addPrimitiveSet(new osg::DeawArray(osg::PrimitiveSet::POINTS,vecarray->size()));
geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,vecarray->size()));  //设置渲染方式

geode->addDrawable(geometry.get());
root->addChild(geode.get());

说明:几何体的形状参数:

POINTS	//绘制点。绘制用户指定的所有顶点。
LINES	//绘制直线。直线的起点、终点由数组中先后相邻的两个点决定;用户提供的点不止两个时,将尝试继续绘制新的直线。
LINE_STRIP	//绘制多段直线。多段直线的第一段由数组中的前两个点决定;其余段的起点位置为上一段的终点坐标,而终点位置由数组中随后的点决定。
LINE_LOOP  //绘制封闭直线绘图方式与多段直线相同,但是最后将自动封闭该直线。
TRIANGLES	//绘制三角形。三角形的三个顶点由数组中相邻的三个点决定,并按照逆时针的顺序进行绘制;用户提供的点不止三个时,将尝试继续绘制新的三角形。
TRIANGLE_STRIP	//绘制多段三角形。第一段三角形的由数组中的前三个点决定;其余段三角形的绘制,起始边由上一段三角形的后两个点决定,第三点由数组中随后的一点决定。
TRIANGLE_FAN	//绘制三角扇面。第一段三角形的由数组中的前三个点决定;其余段三角形的绘制,起始边由整个数组的第一点和上一段三角形的最后一个点决定,第三点由数组中随后的一点决定。
QUADS	//绘制四边形。四边形的四个顶点由数组中相邻的四个点决定,并按照逆时针的顺序进行绘制;用户提供的点不止四个时,将尝试继续绘制新的四边形。
QUAD_STRIP	//绘制多段四边形。第一段四边形的起始边由数组中的前两个点决定,边的矢量方向由这两点的延伸方向决定;起始边的对边由其后的两个点决定,如果起始边和对边的矢量方向不同,那么四边形将会扭曲;其余段四边形的绘制,起始边由上一段决定,其对边由随后的两点及其延伸方向决定。
POLYGON	//绘制任意多边形。根据用户提供的顶点的数量,绘制多边形。

 

你可能感兴趣的