目前我在网上找得比较多的是osgearth2.10及以下的版本及加载数字地球的方法,但是我使用的是osg3.6.5和osgEarth3.。但是3.x版本和2.x版本差别很大,主要区别在于2.x有7个主要库,而3.x版本只有osgEarth这一个库。所以,特别记录一下。
我使用的是纯qt开发哈。
一、加载数字地球
1.直接上源码pro文件和cpp文件
pro文件
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets opengl
greaterThan(QT_MAJOR_VERSION,5):QT += openglwidgets
CONFIG += c++17
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp
INCLUDEPATH += F:/osgEarth/osgt/osg365/include
DEPENDPATH += F:/osgEarth/osgt/osg365/include
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
INCLUDEPATH += F:/osgEarth/osgt/oe32/include
DEPENDPATH += F:/osgEarth/osgt/oe32/include
CONFIG(debug,debug|release){
LIBS += -LF:\osgEarth\osgt\osg365\lib \
-lOpenThreadsd \
-losgd -losgDBd \
-losgGAd \
-losgUtild \
-losgViewerd
LIBS += -LF:\osgEarth\osgt\oe32\lib\ -losgEarthd
}else {
LIBS += -LF:\osgEarth\osgt\osg365\lib \
-lOpenThreads \
-losg \
-losgDB \
-losgGA \
-losgUtil \
-losgViewer \
LIBS += -LF:\osgEarth\osgt\oe32\lib\ -losgEarth
}
cpp文件
#include <Windows.h>
#include <osgViewer/Viewer>
#include <osgEarth/EarthManipulator>
#include <osgDB/ReadFile>
#include <osgGA/StateSetManipulator>
#include <osgViewer/ViewerEventHandlers>
int main(int argc, char** argv)
{
osgEarth::initialize();
osgViewer::Viewer *viewer=new osgViewer::Viewer;
//添加状态事件,可以相应键盘和鼠标事件,响应L T B W
viewer->addEventHandler(new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()));
//窗口大小变化,响应F
viewer->addEventHandler(new osgViewer::WindowSizeHandler);
//添加路径记录 Z
viewer->addEventHandler(new osgViewer::RecordCameraPathHandler);
//帮助文档显示H
viewer->addEventHandler(new osgViewer::HelpHandler);
//截屏 C
viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);
//添加一些常用状态设置,响应S
viewer->addEventHandler(new osgViewer::StatsHandler);
viewer->setCameraManipulator(new osgEarth::Util::EarthManipulator);
osg::Group* root = new osg::Group;
root->addChild(osgDB::readNodeFile("simple.earth"));//此处配置了环境变量的哈
viewer->setSceneData(root);
return viewer->run();
}
后面我将它集成到qt的窗体再上传更新新的代码。
二、在数字地球上加载模型
#include <Windows.h>
#include <osgViewer/Viewer>
#include <osgEarth/EarthManipulator>
#include <osgDB/ReadFile>
#include <osgEarth/GeoTransform>
#include <osgEarth/AutoClipPlaneHandler>
#include <osg/PositionAttitudeTransform>
#include <osgGA/StateSetManipulator>
#include <osgViewer/ViewerEventHandlers>
int main(int argc, char** argv)
{
osgEarth::initialize();
osgViewer::Viewer *viewer = new osgViewer::Viewer;
osg::Group* root = new osg::Group;
osg::Node*earth = osgDB::readNodeFile("simple.earth");
root->addChild(earth);
//添加状态事件,可以相应键盘和鼠标事件,响应L T B W
viewer->addEventHandler(new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()));
//窗口大小变化,响应F
viewer->addEventHandler(new osgViewer::WindowSizeHandler);
//添加路径记录 Z
viewer->addEventHandler(new osgViewer::RecordCameraPathHandler);
//帮助文档显示H
viewer->addEventHandler(new osgViewer::HelpHandler);
//截屏 C
viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);
//添加一些常用状态设置,响应S
viewer->addEventHandler(new osgViewer::StatsHandler);
osgEarth::Util::EarthManipulator*em = new osgEarth::Util::EarthManipulator;
viewer->setCameraManipulator(em);
osgEarth::MapNode*mapNode = osgEarth::MapNode::findMapNode(earth);
viewer->getCamera()->addCullCallback(new osgEarth::Util::AutoClipPlaneCullCallback(mapNode));
//先在坐标原点绘制三维曲面,再通过GeoTransform将绘制结果转移到雷达的经纬坐标处
osgEarth::GeoTransform* xform = new osgEarth::GeoTransform();
xform->setPosition(osgEarth::GeoPoint(osgEarth::SpatialReference::get("wgs84"), 116.0, 40.0, 10,osgEarth::AltitudeMode::ALTMODE_RELATIVE));
// 局部坐标系
osg::PositionAttitudeTransform* pat = new osg::PositionAttitudeTransform;
pat->setUserValue("pos", osg::Vec3d(116.0, 40.0, 10));
//pat->setScale(osg::Vec3(20.0, 20.0, 20.0));
xform->addChild(pat);
pat->addChild(osgDB::readNodeFile("cow.osg"));
root->addChild(xform);
viewer->setSceneData(root);
em->setViewpoint(osgEarth::Viewpoint("", 116.0, 40.0, 10.0, 0.0, -90.0, 100), 5);
return viewer->run();
}