OSG::geometry绘图类

OpenSceneGraph的建模和绘图工具中,osg::Geometry类有着十分重要的地位。使用Geometry类,用户可以通过指定顶点,颜色和法线的方式,绘制简单的线段,三角形,多边形。并将绘图的结果添加到场景的叶结点Geode中。

使用Gemetry类进行简单图形的绘制,一般可以分为这样几个步骤:

1、    建立新的Geometry实例,用于输入顶点,颜色等数据的osg::Vec3Arrayosg::Vec4Array变量数组,以及用于建立点索引的osg::UByteArrayosg:: IntArray等。示例代码如下:

osg::ref_ptr 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;   //法线索引数组

 

2、    向顶点坐标变量数组中输入顶点数据,osg::Vec3Array是一个模板类,继承自STLvector,因此可以使用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));

 

3、    设置顶点坐标,颜色和法线坐标的索引值。索引值可以使用整数类型的向量组列表来存放,用户使用索引表从顶点坐标的数组中获取指定位置的数据,从而按照指定顺序连接各个顶点,组成指定的图形。用户也可以选择不设置索引数组,此时OSG内部将按照缺省的索引顺序排列。例如上述的坐标和颜色信息,如果按照缺省的索引排列绘制一个四边形,那么得到的结果如左图;而如果使用索引值数组来重新获取和排列坐标或者颜色的数据的的话,那么可以获得与此不同的结果,例如:

colindex->push_back(3);

colindex->push_back(2);

colindex->push_back(1);

colindex->push_back(0);

得到的结果将如右图所示。

注意,可以多次索引同一个坐标或者颜色数据,但是如果已经指定绘图中将要使用某个索引组,那么该向量组不能为空,否则会引发内存错误。

OSG::geometry绘图类_第1张图片

 

4、    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);

如果要使用缺省的索引顺序,那么便不必设置顶点、颜色或者法线的索引列表,即,屏蔽setVertexIndicessetColorIndicessetNormalIndices三段。

要注意的是,上一段程序中还设置了颜色数据,法线数据与顶点数据绑定的方式,即setColorBindingsetNormalBinding,绑定数据的方式有以下几种:

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)

5、    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

绘制任意多边形

根据用户提供的顶点的数量,绘制多边形。

 

你可能感兴趣的:(计算机图形学)