OSG::geometry绘图类
来源:互联网 发布:webkey 源码 编辑:程序博客网 时间:2024/05/16 11:21
在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之外,还有数种方式,以用于不同的用户需求,列表如下:
POINTS
绘制点
绘制用户指定的所有顶点。
LINES
绘制直线
直线的起点、终点由数组中先后相邻的两个点决定;用户提供的点不止两个时,将尝试继续绘制新的直线。
LINE_STRIP
绘制多段直线
多段直线的第一段由数组中的前两个点决定;其余段的起点位置为上一段的终点坐标,而终点位置由数组中随后的点决定。
LINE_LOOP
绘制封闭直线
绘图方式与多段直线相同,但是最后将自动封闭该直线。
TRIANGLES
绘制三角形
三角形的三个顶点由数组中相邻的三个点决定,并按照逆时针的顺序进行绘制;用户提供的点不止三个时,将尝试继续绘制新的三角形。
TRIANGLE_STRIP
绘制多段三角形
第一段三角形的由数组中的前三个点决定;其余段三角形的绘制,起始边由上一段三角形的后两个点决定,第三点由数组中随后的一点决定。
TRIANGLE_FAN
绘制三角扇面
第一段三角形的由数组中的前三个点决定;其余段三角形的绘制,起始边由整个数组的第一点和上一段三角形的最后一个点决定,第三点由数组中随后的一点决定。
QUADS
绘制四边形
四边形的四个顶点由数组中相邻的四个点决定,并按照逆时针的顺序进行绘制;用户提供的点不止四个时,将尝试继续绘制新的四边形。
QUAD_STRIP
绘制多段四边形
第一段四边形的起始边由数组中的前两个点决定,边的矢量方向由这两点的延伸方向决定;起始边的对边由其后的两个点决定,如果起始边和对边的矢量方向不同,那么四边形将会扭曲;其余段四边形的绘制,起始边由上一段决定,其对边由随后的两点及其延伸方向决定。
POLYGON
绘制任意多边形
根据用户提供的顶点的数量,绘制多边形。
- OSG::geometry绘图类
- 6、osg::Geode,osg::Drawable,osg::Shape,osg::Geometry,
- osg::Geode,osg::Drawable,osg::Shape,osg::Geometry
- OSG geometry 手动设置纹理
- 2.osg内置几何类型、osg::Geometry的类型与osg::MatrixTransform
- 矩阵变换、osg的回调、动画路径和Geometry
- osg学习中的小问题---“setVertexIndices”: 不是“osg::Geometry”的成员
- 4、osg::Node,osg::Group,osg::Switch,osg::MatrixTransform类
- Geometry类详解
- geometry
- geometry
- geometry
- Geometry
- 10、osg::AnimationPath,osg::NodeVisitor类
- OSG::ref_ptr模板类
- osg中的LOD类
- OSG
- osg
- android图片缩放的2个代码
- Java乔晓松-使用Filter过滤器清除网页缓存
- VMware虚拟机上的文件如何和Windows进行共享
- Express.js 中文入门指引手册
- jQuery EasyUI datagrid 不同列用同一 field 输出时没有 formatter 问题
- OSG::geometry绘图类
- 重置所有串行COM口
- ANDROID快捷方式
- 前端知识积累(继续更新)
- 数学之路(2)-数据分析-R基础(13)
- hdu 2647 (拓扑)
- 专访陈勇: 敏捷开发现状及发展之路
- 二逼程序员 VS 苦逼程序员
- Convention插件实现Struts2.1以上版本零配置