在OpenSceneGraph的建模和绘图工具中,osg::Geometry类有着十分重要的地位。使用Geometry类,用户可以通过指定顶点,颜色和法线的方式,绘制简单的线段,三角形,多边形。并将绘图的结果添加到场景的叶结点Geode中。
使用Gemetry类进行简单图形的绘制,一般可以分为这样几个步骤:
1、
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;
osg::UByteArray* colindex = new osg::UByteArray;
osg::Vec3Array* norarray = new osg::Vec3Array;
osg::UByteArray* norindex = new osg::UByteArray;
2、
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));
colarray->push_back(osg::Vec4(0.0, 1.0, 0.0, 1.0));
colarray->push_back(osg::Vec4(0.0, 0.0, 1.0, 1.0));
colarray->push_back(osg::Vec4(1.0, 1.0, 1.0, 1.0));
norarray->push_back(osg::Vec3(0.0, -1.0, 0.0));
3、
colindex->push_back(3);
colindex->push_back(2);
colindex->push_back(1);
colindex->push_back(0);
得到的结果将如右图所示。
注意,可以多次索引同一个坐标或者颜色数据,但是如果已经指定绘图中将要使用某个索引组,那么该向量组不能为空,否则会引发内存错误。
4、
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 | 绑定逐个点 | 逐点绑定。比如上面的例子,将四个颜色数据分别绑定到四个顶点坐标,可以实现顶点颜色之间的过渡效果。 |
5、 geo->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4)); 该行代码中,使用DrawArrays类向Geometry类送入了新几何体的信息,即,该几何体是一个QUADS,它的顶点坐标从索引数组中读入,从第1个索引值开始,共读入4个索引值,组成一个四边形图形。 几何体的形状参数除了QUADS之外,还有数种方式,以用于不同的用户需求,列表如下:
|