osgEarth基於callback更新繪製的圖形(附帶:osgEarth繪製多邊形方法)

本文主要介紹在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;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章