为了实现绕端点动态显示的功能,一种实现方法是自己写一个osg::NodeCallback的子类,并重载圆括号运算符。本文中,该子类的名字为MyRotateCallback。实现代码如下:
class MyRotateCallback: public osg::NodeCallback
{
public:
MyRotateCallback() {
m_rotate = 0; // 旋转角度(弧度)
}
~MyRotateCallback() {}
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) {
ModelNode* mn = dynamic_cast<ModelNode*>(node);
if (mn) {
mn->setLocalRotation(osg::Quat(0, osg::X_AXIS,
0, osg::Y_AXIS,
m_rotate, osg::Z_AXIS));
m_rotate += 0.01; // 每次增加0.01弧度
if (m_rotate >= 2 * osg::PI)
m_rotate -= 2 * osg::PI;
}
}
protected:
double m_rotate; // 旋转角度(弧度)
};
其中,m_rotate是线段绕自身Z轴旋转的角度,单位是弧度。
然后,需要在main函数中添加如下代码,以实现线段的绘制及相关属性的设置。
// 旋转的线段
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));
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(1.0f, 0.0f, 0.0f, 1.0f));
osg::ref_ptr<osg::Geometry> line = new osg::Geometry;
line->setVertexArray(vertices.get());
line->setNormalArray(normals.get());
line->setNormalBinding(osg::Geometry::BIND_OVERALL);
line->setColorArray(colors.get());
line->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
line->addPrimitiveSet(new osg::DrawArrays(GL_LINES, 0, 2));
// 设置线宽
line->getOrCreateStateSet()->setAttribute(new osg::LineWidth(5.0));
// 创建ModelNode对象
Style modelStyle;
modelStyle.getOrCreateSymbol<ModelSymbol>()->setModel(line);
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->addUpdateCallback(new MyRotateCallback());
annoGroup->addChild(modelNode);
其中,
(1)为了使用线宽类osg::LineWidth,需要添加包含头文件的代码
#include <osg/LineWidth>
(2)代码“modelNode->addUpdateCallback(new MyRotateCallback());”,创建回调函数类的实例。
使用免费软件GifCam( Download GifCam - free - latest version )录屏制作的gif文件如下: