osgearth2.10 实现卫星轨道的绘制代码
时间: 2023-09-12 16:10:49 浏览: 187
以下是使用OSGEarth 2.10实现卫星轨道的绘制代码示例:
```cpp
#include <osgEarth/MapNode>
#include <osgEarthUtil/Sky>
#include <osgEarthUtil/Controls>
#include <osgEarthUtil/ExampleResources>
#include <osgEarthUtil/Orbit>
#include <osgEarthUtil/Controls>
#include <osgEarthUtil/EarthManipulator>
#include <osgEarthAnnotation/AnnotationRegistry>
#include <osgEarthAnnotation/AnnotationNode>
#include <osgViewer/Viewer>
using namespace osgEarth;
using namespace osgEarth::Util;
using namespace osgEarth::Annotation;
using namespace osgEarth::Util::Controls;
//创建一个标记节点
AnnotationNode* createLabel(osg::Vec3d position, const std::string& text)
{
LabelNode* label = new LabelNode(text);
label->setStyle(
new TextStyle(
Color::White,
Color::Black,
2.0f));
AnnotationNode* node = new AnnotationNode(
label,
GeoPoint(
MapNode::getMapSRS(),
position,
ALTMODE_RELATIVE),
AltitudeSymbol::CLAMP_TO_TERRAIN);
return node;
}
int main(int argc, char** argv)
{
osgViewer::Viewer viewer;
//创建地球模型
osgEarth::Map* map = new osgEarth::Map();
osgEarth::TerrainOptions options;
options.enableMercatorFastPath() = true;
map->setTerrainOptions(options);
osgEarth::ImageLayer* layer = new osgEarth::ImageLayer(osgEarth::TileSourceOptions::create("world"), osgEarth::ProfileOptions::create("global-geodetic"));
map->addLayer(layer);
osgEarth::ModelLayer* modelLayer = new osgEarth::ModelLayer(osgEarth::ModelLayerOptions("Earth"));
osgEarth::ModelSourceOptions modelOptions;
modelOptions.setURL(osgEarth::URI(osgEarth::URI::ZERO, EXAMPLES_DIR) + "osgearth/globe.earth");
modelLayer->addModel(modelOptions);
map->addLayer(modelLayer);
osg::ref_ptr<osgEarth::MapNode> mapNode = new osgEarth::MapNode(map);
//创建相机
osg::ref_ptr<osg::Camera> camera = viewer.getCamera();
camera->setViewport(0, 0, 800, 600);
camera->setProjectionMatrixAsPerspective(
30.0,
static_cast<double>(800) / static_cast<double>(600),
1.0,
1000.0);
//创建卫星轨道
osg::ref_ptr<Orbit> orbit = new Orbit();
orbit->setCenter(osg::Vec3d(0.0, 0.0, 0.0));
orbit->setRadius(6371000.0 + 1000000.0);
orbit->setInclination(osg::DegreesToRadians(45.0));
orbit->setNumSegments(100);
orbit->setRenderBinNumber(1);
orbit->setAutoScaleToScreen(true);
orbit->setColor(osg::Vec4(1.0, 1.0, 0.0, 1.0));
mapNode->addChild(orbit.get());
//创建标记节点
osg::Vec3d position = orbit->getPosition(osg::Timer::instance()->time_s());
osg::ref_ptr<AnnotationNode> label = createLabel(position, "Satellite");
mapNode->addChild(label.get());
//设置相机的初始位置和目标
osgEarth::Util::EarthManipulator* manipulator = new osgEarth::Util::EarthManipulator();
manipulator->setViewpoint(osgEarth::Viewpoint(
osgEarth::SpatialReference::get("wgs84"),
-122.4167, 37.7833, 5000.0,
0.0, -90.0, 500000.0));
viewer.setCameraManipulator(manipulator);
//添加天空盒
osg::ref_ptr<SkyNode> sky = SkyNode::create(map);
mapNode->addChild(sky.get());
//设置相机的初始位置和目标
osgEarth::Viewpoint vp(
osgEarth::SpatialReference::get("wgs84"),
-122.4167, 37.7833, 5000.0,
0.0, -90.0, 500000.0);
manipulator->setViewpoint(vp);
viewer.setSceneData(mapNode.get());
return viewer.run();
}
```
在这个示例中,我们首先创建了一个地球模型,并将其添加到地图中。接着,我们创建了一个相机,并设置了其视口和投影矩阵。然后,我们创建了一个卫星轨道,将其添加到地球模型中,并创建了一个标记节点,将其添加到地球模型中。最后,我们添加了一个天空盒,并设置了相机的初始位置和目标。
阅读全文