TA的每日心情 | 开心 2020-3-20 17:50 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
osgearth提供简洁方式的AnnotationNode。
CircleNode EllipseNode FeatureNode GeoPositionNode
ImageOverlay LableNode LocalGeometryNode PlaceNode
RectangleNode TrackNode
但有时候发现不好用,缺乏灵活性,如何是 new osgEarth::Features::Feature(new osgEarth::Symbology:olygon,
会发现样式有很大的限制导致无法使用真正的面。
这时候有第二种方法使用原语操作geom->addPrimitiveSet(new osg:rawArrays(osg::PrimitiveSet:UADS,0,4));
几何体的形状参数除了QUADS之外,还有数种方式,以用于不同的用户需求,列表如下:
和opengl对比:
osg::PrimitiveSet::POINTS对应OpenGL中的GL_POINTS绘制单独的点
osg::PrimitiveSet:INES对应OpenGL中的GL_LINES绘制每两点连接的线
osg::PrimitiveSet::LINE_STRIP对应OpenGL中的GL_LINE_STRIP绘制依次连接各点的线
osg::PrimitiveSet::LINE_LOOP对应OpenGL中的GL_LINE_LOOP绘制依次连接各点的线,首尾相连
osg::PrimitiveSet::POLYGON对应OpenGL中的GL_POLYGON绘制依次连接各点的多边形
osg::PrimitiveSet::QUADS对应OpenGL中的GL_QUADS绘制依次连接每四点的四边形
如:1、2、3、4、5、6、7、8点 绘制结果1、2、3、4组成四边形,5、6、7、8组成四边形
osg::PrimitiveSet::QUAD_STRIP对应OpenGL中的GL_QUAD_STRIP绘制四边形
如:1、2、3、4、5、6、7、8点 绘制结果1、2、3、4组成四边形,3、4、5、6组成四边形、5、
6、7、8组成四边形
osg::PrimitiveSet::TRIANGLES对应OpenGL中的GL_TRIANGLES绘制每三点连接的三角形
如:1、2、3、4、5、6点 绘制结果1、2、3组成三角形,4、5、6组成三角形
osg::PrimitiveSet::TRIANGLE_STRIP对应OpenGL中的GL_TRIANGLE_STRIP
如:1、2、3、4、5、6点 绘制结果1、2、3组成三角形,2、3、4组成三角形,3、4、5组成三角
形4、5、6组成三角形
osg::PrimitiveSet::TRIANGLE_FAN对应OpenGL中的GL_TRIANGLE_FAN
如:1、2、3、4、5、6点 绘制结果1、2、3组成三角形,1、3、4组成三角形,1、4、5组成三角
形,1、5、6组成三角形
例子代码
enum Mode
{
POINTS = GL_POINTS,
LINES = GL_LINES,
LINE_STRIP = GL_LINE_STRIP,
LINE_LOOP = GL_LINE_LOOP,
TRIANGLES = GL_TRIANGLES,
TRIANGLE_STRIP = GL_TRIANGLE_STRIP,
TRIANGLE_FAN = GL_TRIANGLE_FAN,
QUADS = GL_QUADS,
QUAD_STRIP = GL_QUAD_STRIP,
POLYGON = GL_POLYGON,
LINES_ADJACENCY = GL_LINES_ADJACENCY,
LINE_STRIP_ADJACENCY = GL_LINE_STRIP_ADJACENCY,
TRIANGLES_ADJACENCY = GL_TRIANGLES_ADJACENCY,
TRIANGLE_STRIP_ADJACENCY = GL_TRIANGLE_STRIP_ADJACENCY,
PATCHES = GL_PATCHES
}; 四边形如下
osg::ref_ptr<osg::Node> GEOQuardTest::CreateNode()
{
osg::ref_ptr<osg::Group> _root = new osg::Group;
//创建一个叶结点对象
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
//创建一个几何体对象
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
//创建顶点数组,逆时针顺序
osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
//逆时针添加数据
v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
v->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
v->push_back(osg::Vec3(1.0f, 0.0f, 1.0f));
v->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
//设置顶点数据
geom->setVertexArray(v);
//创建颜色数组
osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array;
vc->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
vc->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
vc->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));
vc->push_back(osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f));
//设置颜色数组
geom->setColorArray(vc);
//设置颜色绑定模式
geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
//创建法线数组
osg::ref_ptr<osg::Vec3Array> nc = new osg::Vec3Array;
//增加法线,几何体顶点都是是在XOZ面上,所以法线是Y轴
nc->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));
//设置法线
geom->setNormalArray(nc);
//设置法线的绑定方式为全部节点
geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
//添加图元,绘图基元为四边形,从第0个元素开始的四个元素,按照QUADS方式绘制四边形
geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));
//添加到叶子节点中
geode->addChild(geom);
_root->addChild(geode);
return _root.get();
}
按照索引组织绘制数据,示例代码:
osg::ref_ptr<osg::Node> GEOQuardIndexTest::CreateNode()
{
osg::ref_ptr<osg::Group> _root = new osg::Group;
//创建一个叶结点对象
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
//创建一个几何体对象
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
//创建顶点数组,逆时针顺序
osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
//逆时针添加数据
v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
v->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
v->push_back(osg::Vec3(1.0f, 0.0f, 1.0f));
v->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
v->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));
//设置顶点数据
geom->setVertexArray(v);
//创建四边形顶点索引数组,指定绘图基元为四边形
osg::ref_ptr<osg::DrawElementsUInt> quad = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
//添加四边形的索引数据
quad->push_back(0);
quad->push_back(1);
quad->push_back(2);
quad->push_back(3);
//添加到几何体
geom->addPrimitiveSet(quad);
//创建三角形顶点索引数据,制定绘图基元为三角形
osg::ref_ptr<osg::DrawElementsUInt> tri = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
//添加数据
tri->push_back(4);
tri->push_back(0);
tri->push_back(3);
//添加到几何体
geom->addPrimitiveSet(tri);
//创建颜色数组
osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array;
vc->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
vc->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
vc->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));
vc->push_back(osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f));
vc->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));
//设置颜色数组
geom->setColorArray(vc);
//设置颜色绑定模式
geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
//创建法线数组
osg::ref_ptr<osg::Vec3Array> nc = new osg::Vec3Array;
//增加法线,几何体顶点都是是在XOZ面上,所以法线是Y轴
nc->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));
//设置法线
geom->setNormalArray(nc);
//设置法线的绑定方式为全部节点
geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
//添加到叶子节点中
geode->addChild(geom);
_root->addChild(geode);
return _root.get();
}
|
|