osgEarth设置模型旋转角度

#include<windows.h>
#include <osgViewer/Viewer>
#include <osgEarthDrivers/gdal/GDALOptions>
#include <osg/ShapeDrawable>
#include <osgEarthUtil/EarthManipulator>
#include <osg/MatrixTransform>
#include <osgEarthFeatures/ConvertTypeFilter>
#include <osgEarthDrivers/model_simple/SimpleModelOptions>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/StateSetManipulator>

#ifdef _DEBUG
#pragma comment(lib, "osgd.lib")
//#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgViewerd.lib")
#pragma comment(lib, "osgGAd.lib")
#pragma comment(lib, "osgEarthd.lib")
#pragma comment(lib, "osgEarthUtild.lib")
#else
#pragma comment(lib, "osg.lib")
#pragma comment(lib, "osgDB.lib")
#pragma comment(lib, "osgViewer.lib")
#pragma comment(lib, "osgGA.lib")
#endif // DEBUG

// lonlat1:雷达波圆锥顶点
// lonlat2:轨迹点
void rotateCone(osg::MatrixTransform* mt, const osgEarth::SpatialReference* sr, osg::Vec3d lonlat1, osg::Vec3d lonlat2)
{
    // 雷达波模型所在位置
    osgEarth::GeoPoint geoPoint1(
        sr,
        lonlat1.x(),
        lonlat1.y(),
        lonlat1.z(),
        osgEarth::ALTMODE_ABSOLUTE);
    osg::Matrixd matrix1;
    // 获取雷达波模型从原点变换到lonlat1位置的变换矩阵
    geoPoint1.createLocalToWorld(matrix1);
    // 经纬度高程到xyz的变换
    osg::Vec3d world1, world2;
    // geoPoint1.toWorld(world1);//等同于    sr->transformToWorld(lonlat1,world1);
    sr->transformToWorld(lonlat2, world2);
    // 计算轨迹点在雷达波模型坐标系下的位置
    osg::Vec3 point2InRadarCoordinateSystem = world2*osg::Matrix::inverse(matrix1);
    // 在雷达波模型坐标系下,对Z轴进行旋转,与连接原点指向轨迹点方向的矢量重合,计算出此旋转矩阵
    osg::Matrixd rotMat = osg::Matrixd::rotate(osg::Z_AXIS, point2InRadarCoordinateSystem-osg::Vec3(0,0,0));
    // 将计算出的旋转矩阵赋给雷达波模型所在的mt
    mt->setMatrix(rotMat);
}
int main(int argc, char** argv)
{
    osgViewer::Viewer viewer;
    std::string world_tif = "data/world.tif";
    osgEarth::Map* map = new osgEarth::Map();
    // Start with a basemap imagery layer; we‘ll be using the GDAL driver
    // to load a local GeoTIFF file:
    osgEarth::Drivers::GDALOptions basemapOpt;
    basemapOpt.url() = world_tif;
    map->addImageLayer(new osgEarth::ImageLayer(osgEarth::ImageLayerOptions("basemap", basemapOpt)));

    osgEarth::MapNodeOptions mapNodeOptions;
    mapNodeOptions.enableLighting() = false;
    osgEarth::MapNode* mapNode = new osgEarth::MapNode(map, mapNodeOptions);

    osgEarth::Drivers::SimpleModelOptions opt;
    opt.location() = osg::Vec3(118, 40, 10000);
    //opt.url() = "cow.osg.1000,1000,1000.scale";
    osg::Geode* geode = new osg::Geode;
    osg::ShapeDrawable* cone = new osg::ShapeDrawable(new osg::Cone(osg::Vec3(), 10000, 50000));
    //osg::ShapeDrawable* cone = new osg::ShapeDrawable(new osg::Box(osg::Vec3(), 50000));
    geode->addDrawable(cone);
    osg::MatrixTransform* mtCone = new osg::MatrixTransform;
    mtCone->addChild(geode);
    opt.node() = mtCone;
    map->addModelLayer(new osgEarth::ModelLayer("", opt));

    rotateCone(mtCone, map->getProfile()->getSRS(), osg::Vec3(118, 40, 100), osg::Vec3(120, 40, 100));

    osg::Group* root = new osg::Group();
    root->addChild(mapNode);
    viewer.setSceneData(root);
    viewer.setCameraManipulator(new osgEarth::Util::EarthManipulator());

    // Process cmdline args
    //MapNodeHelper().parse(mapNode, arguments, &viewer, root, new LabelControl("Features Demo"));

    //视点定位模型所在位置
    osgEarth::Viewpoint vp("", 118, 40, 1000.0, -2.50, -90.0, 1.5e6);
    (dynamic_cast<osgEarth::Util::EarthManipulator*>(viewer.getCameraManipulator()))->setViewpoint(vp);

    // add some stock OSG handlers:
    viewer.addEventHandler(new osgViewer::StatsHandler());
    viewer.addEventHandler(new osgViewer::WindowSizeHandler());
    viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
    viewer.setUpViewInWindow(100, 500, 1024, 768);
    return viewer.run();
}
时间: 2024-11-03 23:06:11

osgEarth设置模型旋转角度的相关文章

xBIM WeXplorer 设置模型颜色

目录 基础 xBIM WeXplorer 简要介绍 xBIM WeXplorer xViewer 基本应用 xBIM WeXplorer xViewer 浏览器检查 xBIM WeXplorer xViewer的导航,相机.剖切.隐藏 等操作 xBIM WeXplorer  设置模型颜色 高级应用 xBIM 综合使用案例与 ASP.NET MVC 集成(一) xBIM 综合使用案例与 ASP.NET MVC 集成(二) xBIM 综合使用案例与 ASP.NET MVC 集成(三) 本次我们探讨模

[原][osgearth]设置OE的高程,高度场的数据。修改设置高度值

for( unsigned int row=0; row < hf->getNumRows(); ++row ) { for( unsigned int col=0; col < hf->getNumColumns(); ++col ) { float val = hf->getHeight(col, row); if ( !isNoData( val ) ) { continue; } if ( col > 0 ) val = hf->getHeight(col

fluent批量处理&mdash;&mdash;模型参数的设置

对于常见的工程应用来说,计算的工况很多,尤其优化工作,少则几百,多则上千,面对如此之多的case文件要写,假如按照一个一个的读写的话,相信你一定会为这么机械的工作烦躁,甚至影响今后好几天的心情,那么有什么简便一些的方法呢?答案是肯定的.那就是采用fluent的journal文件.首先打开fluent软件,在file/write/start journal,见下图: 选择保存文件名*.journal后(看你自己怎么设置文件名),我一般按照这一组的类型来命名:这样, journal文件就开始记录你以

WebGL或OpenGL关于模型视图投影变换的设置技巧

目录 1. 具体实例 2. 解决方案 1) Cube.html 2) Cube.js 3) 运行结果 3. 详细讲解 1) 模型变换 2) 视图变换 3) 投影变换 4) 模型视图投影矩阵 4. 存在问题 1. 具体实例 看了不少的关于WebGL/OpenGL的资料,笔者发现这些资料在讲解图形变换的时候都讲了很多的原理,然后举出一个特别简单的实例(坐标是1.0,0.5的那种)来讲解.确实一看就懂,但用到实际的场景之中就一脸懵逼了(比如地形的三维坐标都是很大的数字).所以笔者这里结合一个具体的实例

xBIM 实战02 在浏览器中加载IFC模型文件并设置特效

系列目录    [已更新最新开发文章,点击查看详细] 在模型浏览器中加载模型后,可以对模型做一些特殊操作.下图是常用的设置. 都是通过 xbim-viewer.js 中的 API 来设置以达到一定的效果.代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>xViewer</title> 5 <meta http-equiv="content-type" content=&

opengl漫游模型示例

opengl漫游模型示例: #include <stdio.h> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtx/transform.hpp> #include <GLFW/glfw3.h> #include "TrackballController.h" #define CIGAMA 0.1 TrackballController* TrackballControlle

清华版CG 实验5 OpenGL模型视图变换

1.实验目的: 理解掌握OpenGL程序的模型视图变换. 2.实验内容: (1)阅读实验原理,运行示范实验代码,理解掌握OpenGL程序的模型视图变换: (2)根据示范代码,尝试完成实验作业: 3.实验原理: 在OpenGL程序中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和视口变换. 1.在指定的视图变换之前,应该使用glLoadIdentity()函数把当前矩阵设置为单位矩阵. 2.在载入单位矩阵之后,使用gluLookAt()函数指定视图变换.如果程序没有调用g

第62课 模型视图中的委托(下)

1. 委托的本质 (1)为视图提供数据编辑的上下文环境 (2)产生界面元素的工厂类 (3)能够使用和设置模型中的数据 2. 自定义委托类 (1)自定义委托类的继承关系 (2)自定义委托时需要重写的函数 ①createEditor ②updateEditorGeometry ③setEditorData ④setModelData ⑤paint(可选) (3)自定义委托时重写的函数由谁调用? 由于模型视图设计模式,视图中组合了委托对象,既然委托存在于视图内部,就应该由视图来调用(可从上图的函数调用

PHPCMS内链设置,PHPCMS关联链接设置

需求: 在网站中的关键词,自动加上链接. 在PHPCMS中叫做“关联链接”,在DEDECMS中叫做TAG标签. 第1步:后台 -> 扩展 -> 关联链接 -> 添加关联链接: 第2步: 内容 > 内容相关设置 > 模型管理 >  字段管理. 第3步:修改 content(内容)字段. 第4步: 勾选:是否启用关联链接 第5步: 到此为止,大功告成!