#include "OsgEarthMapViewer.h"
#include <osgDB/ReadFile>
#include <osgEarth/Common>
#include <osgEarth/MapNode>
#include <osgEarth/EarthManipulator>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/Viewer>
#include <gdal_priv.h>
#include <ogr_api.h>
#include <ogr_core.h>
#include <ogr_feature.h>
#include <ogr_geometry.h>
#include <ogrsf_frmts.h>
#include "PolygonCubeObject3D.h"
#include "CylinderObject3D.h"
#include "CylinderObject3DEx.h"
#include "SphereObject3D.h"
#include "ConeObject3D.h"
#include "PyramidObject3D.h"
#include "BoxObject3D.h"
COsgEarthMapViewer::COsgEarthMapViewer()
: m_pGlobe(NULL)
, m_pMapNode(NULL)
, m_pAnnoGroup(NULL)
, m_pPolygonCube(NULL)
, m_pCylinder(NULL)
, m_pSphere(NULL)
, m_pCone(NULL)
, m_pPyramid(NULL)
, m_pBox(NULL)
{
OGRRegisterAll();
GDALAllRegister();
CPLSetConfigOption("GDAL_DATA", "../../Data/gdal_data");
CPLSetConfigOption("CPL_DEBUG", "YES");
CPLSetConfigOption("CPL_LOG", "../LOG/gdal.log");
osgEarth::initialize();
// map
m_pGlobe = osgDB::readNodeFile("../../Data/3d-data/Data/earth/FreeEarth_flat.earth");
//osg::Node* globe = osgDB::readNodeFile("../../Data/3d-data/Data/earth/FreeEarth_flat_simple.earth");
m_pMapNode = osgEarth::MapNode::get(m_pGlobe);
// manipulator
m_pMainManipulator = new osgEarth::Util::EarthManipulator;
InitGraphics();
DoInitTest();
}
COsgEarthMapViewer::~COsgEarthMapViewer()
{
}
void COsgEarthMapViewer::RunViewer()
{
if (NULL == m_pMapNode)
{
return;
}
// viewer
osgViewer::Viewer viewer;
viewer.setSceneData(m_pMapNode);
// manipulator
viewer.addEventHandler(new osgViewer::StatsHandler);
viewer.addEventHandler(this);
viewer.setCameraManipulator(m_pMainManipulator);
// run
viewer.setUpViewInWindow(100, 100, 800, 600);
viewer.run();
}
// ===== Override GUIEventHandler
// _Pyramid
// bool COsgEarthMapViewer::handle_Pyramid(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
// {
// if (ea.getEventType() == ea.KEYDOWN)
// {
// char key = ea.getKey();
// switch (key)
// {
// case 'p':
// {
// static double dLon = 114.052;
// static double dLat = 26.0;
// static double d = 5000.0;
// m_pPyramid->SetPosition(osg::Vec3d(dLon, dLat, d));
// dLon += 0.01;
// dLat += 0.01;
// d += 5000;
// }
// break;
//
// case 'r':
// {
// static double d = 5000.0;
// d += 5000;
// m_pPyramid->SetRectangleSize(d, d + 5000);
// m_pPyramid->SetHeight(d + 5000);
// }
// break;
//
// case 'c':
// {
// osgEarth::Color c((double)(rand() % 10) / 10, (double)(rand() % 10) / 10, (double)(rand() % 10) / 10, 0.8);
// m_pPyramid->SetFillColor(c);
// }
// break;
//
// case 'l':
// {
// static float d = 1.0;
// m_pPyramid->SetLineWidth(d);
// osgEarth::Color c((double)(rand() % 10) / 10, (double)(rand() % 10) / 10, (double)(rand() % 10) / 10, 0.8);
// m_pPyramid->SetLineColor(c);
// d += 0.2;
// }
// break;
//
// case 'n':
// {
// m_pPyramid->SetLineWidth(0);
// }
// break;
//
// case 't':
// {
// static double dPosX = 10;
// static double dPosY = 20;
// static double dPosZ = 30;
// m_pPyramid->SetPosture(osg::Vec3d(dPosX, dPosY, dPosZ));
// dPosX += 10;
// dPosY += 10;
// dPosZ += 10;
// }
// break;
//
// default:
// {
//
// }
// break;
//
// }
//
// return true;
// }
//
// return false;
// }
//_Box
// bool COsgEarthMapViewer::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
// {
// if (ea.getEventType() == ea.KEYDOWN)
// {
// char key = ea.getKey();
// switch (key)
// {
// case 'p':
// {
// static double dLon = 114.052;
// static double dLat = 26.0;
// static double d = 5000.0;
// m_pBox->SetPosition(osg::Vec3d(dLon, dLat, d));
// dLon += 0.01;
// dLat += 0.01;
// d += 5000;
// }
// break;
//
// case 'r':
// {
// static double d = 5000.0;
// d += 5000;
// //m_pBox->SetRectangleSize(d, d + 5000);
// m_pBox->SetHeight(d + 5000);
// }
// break;
//
// case 'c':
// {
// osgEarth::Color c((double)(rand() % 10) / 10, (double)(rand() % 10) / 10, (double)(rand() % 10) / 10, 0.8);
// m_pBox->SetFillColor(c);
// }
// break;
//
// case 'l':
// {
// static float d = 1.0;
// m_pBox->SetLineWidth(d);
// osgEarth::Color c((double)(rand() % 10) / 10, (double)(rand() % 10) / 10, (double)(rand() % 10) / 10, 0.8);
// m_pBox->SetLineColor(c);
// d += 0.2;
// }
// break;
//
// case 'n':
// {
// m_pBox->SetLineWidth(0);
// }
// break;
//
// case 't':
// {
// static double dPosX = 0;
// static double dPosY = 20;
// static double dPosZ = 0;
// m_pBox->SetPosture(osg::Vec3d(dPosX, dPosY, dPosZ));
// /* dPosX += 10;*/
// dPosY += 10;
// /* dPosZ += 10;*/
// }
// break;
//
// default:
// {
//
// }
// break;
//
// }
//
// return true;
// }
//
// return false;
// }
// _cone
bool COsgEarthMapViewer::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
static double dNum = 1;
if (ea.getEventType() == ea.KEYDOWN)
{
char key = ea.getKey();
switch (key)
{
case 'p':
{
static double dLon = 114.052;
static double dLat = 26.0;
static double d = 5000.0;
m_pCone->SetHeight(d + 5000);
m_pCone->SetRadius(d);
m_pCone->SetCenter(osg::Vec3d(dLon, dLat, d));
dLon += 0.01;
dLat += 0.01;
d += 5000;
}
break;
case 'r':
{
static double d = 5000.0;
d += 5000;
//m_pCone->SetRadius(d);
m_pCone->SetHeight(d + 5000);
}
break;
case 'c':
{
osgEarth::Color c((double)(rand() % 10) / 10, (double)(rand() % 10) / 10, (double)(rand() % 10) / 10, 0.8);
m_pCone->SetFillColor(c);
}
break;
case 'l':
{
osgEarth::Color c((double)(rand() % 10) / 10, (double)(rand() % 10) / 10, (double)(rand() % 10) / 10, 0.8);
m_pCone->SetSegmentation(dNum);
m_pCone->SetProfileColor(c);
m_pCone->SetProfileWidth(2);
dNum++;
}
break;
case 'n':
{
dNum = -1;
m_pCone->SetSegmentation(dNum);
}
break;
case 't':
{
static double dPosX = 0;
static double dPosY = 20;
static double dPosZ = 0;
m_pCone->SetPosture(osg::Vec3d(dPosX, dPosY, dPosZ));
/* dPosX += 10;*/
dPosY += 10;
/* dPosZ += 10;*/
}
break;
default:
{
}
break;
}
return true;
}
return false;
}
//_Sphere
// bool COsgEarthMapViewer::handle_Sphere(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
// {
// static double dVer = 1;
// static double dHor = 1;
//
// if (ea.getEventType() == ea.KEYDOWN)
// {
// char key = ea.getKey();
// switch (key)
// {
// case 'p':
// {
// static double dLon = 114.052;
// static double dLat = 26.0;
// static double d = 5000.0;
// m_pSphere->SetCenter(osg::Vec3d(dLon, dLat, d));
// dLon += 0.01;
// dLat += 0.01;
// d += 5000;
// }
// break;
//
// case 'r':
// {
// static double d = 5000.0;
// d += 5000;
// m_pSphere->SetRadius(d);
// }
// break;
// case 'c':
// {
// osgEarth::Color c((double)(rand() % 10) / 10, (double)(rand() % 10) / 10, (double)(rand() % 10) / 10, 0.8);
// m_pSphere->SetFillColor(c);
// }
// break;
//
// case 'l':
// {
//
// osgEarth::Color c((double)(rand() % 10) / 10, (double)(rand() % 10) / 10, (double)(rand() % 10) / 10, 0.8);
// m_pSphere->SetSegmentation(dVer, dHor);
// m_pSphere->SetProfileColor(c);
// m_pSphere->SetProfileWidth(2);
// dVer++;
// dHor++;
//
// }
// break;
//
// case 'n':
// {
// dVer = 0;
// dHor = 0;
//
没有合适的资源?快使用搜索试试~ 我知道了~
OsgEarth3的基础3D图元实现(最新)
共19个文件
cpp:10个
h:9个
5星 · 超过95%的资源 需积分: 27 16 下载量 117 浏览量
2022-11-24
19:21:26
上传
评论 5
收藏 16KB RAR 举报
温馨提示
1. 封装基于Osg+OsgEarth3实现的3D基础图元类,每个类提供各个图元的基础参数设置。 2. 封装的图元类:PolygonCubeObject3D(**任意立方体**)、CylinderObject3DEx(**圆柱**)、SphereObject3D(**球体**)、ConeObject3D(**圆锥**)、PyramidObject3D(**四棱锥**)、BoxObject3D(**矩形立方体**)。 3. OsgEarthMapViewer内包含响应按钮事件(hand函数),以动态修改图元属性的测试。注意测试指定图元属性修改时,需要打开指定handle的注释,并对应switch内的按键进行操作。 4. 建议自行建立工程后,编译源码后进行测试(内含main.cpp),随时修改以及时看到变化情况,了解各个参数对绘制的影响。 (相比上面的2D图元绘制的代码,3D图元绘制的资源内,封装了对绘制属性的设置修改,即封装成类,提供到接口操作)
资源推荐
资源详情
资源评论
收起资源包目录
OSGEarth_Graphics_3D_Source.rar (19个子文件)
Src
PyramidObject3D.h 1KB
OsgEarthMapViewer.cpp 15KB
ConeObject3D.h 1KB
SphereObject3D.h 1KB
BoxObject3D.h 1KB
CylinderObject3DEx.h 1KB
PolygonCubeObject3D.h 1KB
CylinderObject3D.h 934B
ElementGeometry.cpp 1KB
CylinderObject3DEx.cpp 5KB
ConeObject3D.cpp 4KB
BoxObject3D.cpp 4KB
PyramidObject3D.cpp 4KB
SphereObject3D.cpp 5KB
OsgEarthMapViewer.h 1KB
main.cpp 128B
PolygonCubeObject3D.cpp 3KB
CylinderObject3D.cpp 2KB
ElementGeometry.h 788B
共 19 条
- 1
资源评论
- stophin2024-08-21资源很好,收获很大,学到了很多,特别是绘制不同几何体的方法
Being--
- 粉丝: 119
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功