osg3.6.5---osgEarth3.2 实现数字地球的加载

目前我在网上找得比较多的是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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌武贰玖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值