接上一篇 VS2019新建osgEarth项目时,GL.h文件提示报错_Alexabc3000的专栏-CSDN博客
继续写。
在osgEarth中,可以使用ModelNode在指定的经纬高绘制多边形。这样做的好处在于,可以通过ModelNode的setLocalRotation方法,直接对多边形进行旋转变换,相对于通过多种矩阵计算而言,代码简洁。
在osgearth_annotation.cpp的 “// initialize the viewer: ”之前,添加如下代码:
// osgEarth用ModelNode在指定位置绘制多边形.
// OSG相关代码来自《openscenegraph-30-beginners-guide》 的69至70页
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
vertices->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
vertices->push_back(osg::Vec3(1.0f, 0.0f, 1.0f));
vertices->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
normals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
colors->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
colors->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));
colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
osg::ref_ptr<osg::Geometry> quad = new osg::Geometry;
quad->setVertexArray(vertices.get());
quad->setNormalArray(normals.get());
quad->setNormalBinding(osg::Geometry::BIND_OVERALL);
quad->setColorArray(colors.get());
quad->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
quad->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4));
// 创建ModelNode对象
Style modelStyle;
modelStyle.getOrCreateSymbol<ModelSymbol>()->setModel(quad);
osg::ref_ptr<ModelNode> modelNode = new ModelNode(mapNode, modelStyle);
// 放大以便于观察
modelNode->setScale(osg::Vec3f(100000.0, 100000.0, 100000.0));
// 指定经纬高
modelNode->setPosition(osgEarth::GeoPoint(geoSRS,116.333, 39.9, 100000));
//modelNode->setLocalRotation(osg::Quat(...)) 设置旋转角度
annoGroup->addChild(modelNode);
运行结果如下图所示:
上一篇:
VS2019新建osgEarth项目时,GL.h文件提示报错
下一篇: osgEarth显示绕端点旋转的线段