目錄
本文主要介紹如何通過複選框等事件實現OSGEarth中所繪製直線的顯示與隱藏。
一、聲明全局變量
將如下代碼放在類屬性中,或聲明爲全局變量。
osgEarth::Annotation::FeatureNode* m_pStippleFeatureNode;
二、實現直線的顯示
通過下面的代碼進行直線的繪製,並將繪製的直線添加到mRoot。
void showLine()
{
const osgEarth::SpatialReference* geoSRS = mapNode->getMapSRS()->getGeographicSRS();
// 初始化繪圖參數
osgEarth::Symbology::Style m_lineLakeStyle;
m_lineLakeStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
->stroke()->color() = osgEarth::Symbology::Color::Red;
m_lineLakeStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
->stroke()->width() = 2.0;
m_lineLakeStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
->tessellation() = 20.0;
m_lineLakeStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
->verticalOffset() = 0.1;
m_lineLakeStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
->stroke()->stipple() = 255;
osgEarth::Features::Feature* m_pLakeFeature;
std::vector<osg::Vec3> m_vecLakePoint;
m_pLakeFeature = new osgEarth::Features::Feature(
new osgEarth::Annotation::LineString,
geoSRS, m_lineLakeStyle);
m_pStippleFeatureNode = new osgEarth::Annotation::FeatureNode(
mapNode, m_pLakeFeature);
double out_haml = 0.0;
//std::fstream fin("./Module/sensor/position.txt", std::ios::in);
double lat, lon;
lat = 44.227523;
lon = 81.624970;
query->getElevation(osgEarth::GeoPoint(mapNode->getMapSRS(), lon, lat, 0.0, osgEarth::AltitudeMode::ALTMODE_RELATIVE),
out_haml, query_resolution, &out_resolution);
//存儲當前點
m_vecLakePoint.push_back(osg::Vec3(lon, lat, out_haml + 5));
lat = 44.227523;
lon = 81.624057;
query->getElevation(osgEarth::GeoPoint(mapNode->getMapSRS(), lon, lat, 0.0, osgEarth::AltitudeMode::ALTMODE_RELATIVE),
out_haml, query_resolution, &out_resolution);
//存儲當前點
m_vecLakePoint.push_back(osg::Vec3(lon, lat, out_haml + 5));
lat = 44.227102;
lon = 81.624364;
query->getElevation(osgEarth::GeoPoint(mapNode->getMapSRS(), lon, lat, 0.0, osgEarth::AltitudeMode::ALTMODE_RELATIVE),
out_haml, query_resolution, &out_resolution);
//存儲當前點
m_vecLakePoint.push_back(osg::Vec3(lon, lat, out_haml + 5));
lat = 44.227523;
lon = 81.624057;
query->getElevation(osgEarth::GeoPoint(mapNode->getMapSRS(), lon, lat, 0.0, osgEarth::AltitudeMode::ALTMODE_RELATIVE),
out_haml, query_resolution, &out_resolution);
//存儲當前點
m_vecLakePoint.push_back(osg::Vec3(lon, lat, out_haml + 5));
lat = 44.226859;
lon = 81.623650;
query->getElevation(osgEarth::GeoPoint(mapNode->getMapSRS(), lon, lat, 0.0, osgEarth::AltitudeMode::ALTMODE_RELATIVE),
out_haml, query_resolution, &out_resolution);
//存儲當前點
m_vecLakePoint.push_back(osg::Vec3(lon, lat, out_haml + 5));
lat = 44.227523;
lon = 81.624057;
query->getElevation(osgEarth::GeoPoint(mapNode->getMapSRS(), lon, lat, 0.0, osgEarth::AltitudeMode::ALTMODE_RELATIVE),
out_haml, query_resolution, &out_resolution);
//存儲當前點
m_vecLakePoint.push_back(osg::Vec3(lon, lat, out_haml + 5));
lat = 44.226452;
lon = 81.622972;
query->getElevation(osgEarth::GeoPoint(mapNode->getMapSRS(), lon, lat, 0.0, osgEarth::AltitudeMode::ALTMODE_RELATIVE),
out_haml, query_resolution, &out_resolution);
//存儲當前點
m_vecLakePoint.push_back(osg::Vec3(lon, lat, out_haml + 5));
mRoot->addChild(m_pStippleFeatureNode);
m_pLakeFeature->getGeometry()->clear();
m_pStippleFeatureNode->setStyle(m_lineLakeStyle);
for (int i = 0; i < m_vecLakePoint.size(); ++i)
{
m_pLakeFeature->getGeometry()->push_back(m_vecLakePoint[i]);
}
m_pStippleFeatureNode->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);//關閉深度測試
m_pStippleFeatureNode->init();
}
三、實現直線的隱藏
將添加到mRoot的直線進行移除。
void hideLine()
{
mRoot->removeChild(m_pStippleFeatureNode);
}