本文主要介紹在osgEarth中基於callback實現實時更新繪製的圖形。
繪製圖形和調用callback的代碼:
void drawLakes()
{
//初始化繪圖參數
const osgEarth::SpatialReference* geoSRS = mapNode->getMapSRS()->getGeographicSRS();
//湖面
osgEarth::Symbology::Style m_lakeStyle;
osgEarth::Annotation::FeatureNode* m_pLakeNode;
osgEarth::Annotation::FeatureEditor* m_pPolygonEdit;
m_lakeStyle.getOrCreate<osgEarth::Symbology::PolygonSymbol>()
->fill()->color() = osgEarth::Symbology::Color::Color(0.0, 0.27, 0.42, 1.0);
m_lakeStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
->clamping() = osgEarth::Symbology::AltitudeSymbol::CLAMP_TO_TERRAIN;
m_lakeStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
->technique() = osgEarth::Symbology::AltitudeSymbol::TECHNIQUE_DRAPE;
m_lakeStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
->verticalOffset() = 0.1;
osgEarth::Features::Feature* pFeature = new osgEarth::Features::Feature(
new osgEarth::Symbology::Polygon,
geoSRS, m_lakeStyle);
m_pLakeNode = new osgEarth::Annotation::FeatureNode(
mapNode, pFeature);
//添加所要連接的點的經緯度和高度
std::vector<osg::Vec3> m_vecPoint;
m_vecPoint.push_back(osg::Vec3(112.885, 21.9483, 130));
m_vecPoint.push_back(osg::Vec3(112.840, 21.905, 200));
m_vecPoint.push_back(osg::Vec3(112.820, 21.930, 200));
m_vecPoint.push_back(osg::Vec3(112.820, 21.940, 200));
m_vecPoint.push_back(osg::Vec3(112.885, 21.9483, 200));
pFeature->getGeometry()->clear();
m_pLakeNode->setStyle(m_lakeStyle);
for (int i = 0; i < m_vecPoint.size(); ++i)
{
pFeature->getGeometry()->push_back(m_vecPoint[i]);
}
m_pLakeNode->init();
m_pLakeNode->addUpdateCallback(new UpdateLake());
mRoot->addChild(m_pLakeNode);
}
callback代碼:
class UpdateLake :public osg::NodeCallback
{
public:
UpdateLake() :mRadius(0.001)
{//
}
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
{
osg::ref_ptr<osgEarth::Annotation::FeatureNode> m_pLakeNode =
dynamic_cast<osgEarth::Annotation::FeatureNode*>(node);
if (m_pLakeNode.get()) {
osgEarth::Features::Feature* pFeature = m_pLakeNode->getFeature();//刪除所有的geomertry對象
mRadius = mRadius + 1e-6;
osgEarth::Symbology::Style m_lakeStyle;
m_lakeStyle.getOrCreate<osgEarth::Symbology::PolygonSymbol>()
->fill()->color() = osgEarth::Symbology::Color::Color(0.0, 0.27, 0.42, 1.0);
m_lakeStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
->clamping() = osgEarth::Symbology::AltitudeSymbol::CLAMP_TO_TERRAIN;
m_lakeStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
->technique() = osgEarth::Symbology::AltitudeSymbol::TECHNIQUE_DRAPE;
m_lakeStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
->verticalOffset() = 0.1;
//添加所要連接的點的經緯度和高度
std::vector<osg::Vec3> m_vecPoint;
m_vecPoint.push_back(osg::Vec3(112.885, 21.9483, 130));
m_vecPoint.push_back(osg::Vec3(112.840, 21.905, 200));
m_vecPoint.push_back(osg::Vec3(112.820, 21.930, 200));
m_vecPoint.push_back(osg::Vec3(112.820 + mRadius, 21.940 + mRadius, 200));
m_vecPoint.push_back(osg::Vec3(112.885 + mRadius, 21.9483 + mRadius, 200));
pFeature->getGeometry()->clear();
m_pLakeNode->setStyle(m_lakeStyle);
for (int i = 0; i < m_vecPoint.size(); ++i)
{
pFeature->getGeometry()->push_back(m_vecPoint[i]);
}
m_pLakeNode->init();
}
traverse(node, nv);
}
public:
float mRadius;
};