写一个 osgearth 卫星轨道运动的例子,要可以运行的
时间: 2023-12-02 15:51:01 浏览: 88
简单的OSG模型移动的例子
5星 · 资源好评率100%
以下是一个简单的osgEarth卫星轨道运动的例子,可以直接运行:
```cpp
#include <osgEarth/MapNode>
#include <osgEarthUtil/EarthManipulator>
#include <osgEarthUtil/Sky>
#include <osgViewer/Viewer>
int main(int argc, char** argv)
{
// 创建 Viewer。
osgViewer::Viewer viewer;
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
// 创建地球场景图。
osg::ref_ptr<osgEarth::MapNode> mapNode = osgEarth::MapNode::create();
viewer.setSceneData(mapNode);
// 创建地球自由视模式控制器。
osg::ref_ptr<osgEarth::Util::EarthManipulator> manipulator = new osgEarth::Util::EarthManipulator;
viewer.setCameraManipulator(manipulator);
// 创建天空盒子。
osg::ref_ptr<osgEarth::Util::SkyNode> skyNode = osgEarth::Util::SkyNode::create(mapNode);
mapNode->addChild(skyNode);
// 创建卫星模型。
osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform;
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("path/to/satellite.ive");
pat->addChild(model);
mapNode->addChild(pat);
// 设置卫星初始位置。
osg::Vec3d center;
double radius;
mapNode->getBound(center, radius);
osg::Vec3d satPos(center.x(), center.y() + radius + 1000000.0, center.z());
pat->setPosition(satPos);
// 创建卫星轨道运动动画路径。
osg::ref_ptr<osg::AnimationPath> path = new osg::AnimationPath;
path->setLoopMode(osg::AnimationPath::LOOP);
path->insert(0.0, osg::AnimationPath::ControlPoint(satPos));
path->insert(60.0, osg::AnimationPath::ControlPoint(osg::Vec3d(center.x(), center.y() - radius - 1000000.0, center.z())));
osg::ref_ptr<osg::AnimationPathCallback> apcb = new osg::AnimationPathCallback(path, 0.0, 1.0);
// 将动画路径关联到卫星模型上。
pat->setUpdateCallback(apcb);
// 运行 Viewer。
return viewer.run();
}
```
上述代码通过创建一个 osg::PositionAttitudeTransform 对象来表示卫星模型的位置和姿态。同时,也创建了一个 osg::AnimationPath 对象来表示卫星的运动路径,然后将其关联到卫星模型的 osg::AnimationPathCallback 对象上。
在运行程序时,卫星将沿着预设的轨道运动。
阅读全文