[osgearth]OE地形平整代码解读

osgEarth的Rex引擎原理分析(九十五)地形变形(Terrain morphing) 目标:(十二)中的问题14 先看两张图,左图是使用了Image morphing,右图没有使用。morph的作用是使视域边界处的瓦片颜色和高程均匀变化。Image morphing控制颜色,Terrain morphing控制高程。 1、实现原理 2、如何控制 待继续分析列表: 9、earth文件中都有哪些options((九)中问题) 10、如何根据earth文... 阅读详情

在FlatteningLayer文件的createHeightField函数中:使用的github在2017年1月份的代码

if (!geoms.getComponents().empty())
{
osg::ref_ptr<osg::HeightField> hf = HeightFieldUtils::createReferenceHeightField(
ex,
, , // base tile size for elevation data
0u, // no border
true); // initialize to HAE (0.0) heights

// Initialize to NO DATA.
hf->getFloatArray()->assign(hf->getNumColumns()*hf->getNumRows(), NO_DATA_VALUE);

// Create an elevation query envelope at the LOD we are creating
osg::ref_ptr<ElevationEnvelope> envelope = _pool->createEnvelope(workingSRS, key.getLOD());

// Resolve the buffering widths:
double lineWidthLocal = lineWidth()->as(workingSRS->getUnits());
double bufferWidthLocal = bufferWidth()->as(workingSRS->getUnits());

if(integrate(key, hf, &geoms, workingSRS, lineWidthLocal, bufferWidthLocal, envelope, progress) || (progress && progress->isCanceled()))
{
//double t_create = OE_GET_TIMER(create);
//OE_INFO << LC << key.str() << " : t=" << t_create << "s\n";

// If integrate made any changes, return the new heightfield.
// (Or if the operation was canceled...return it anyway and it
// will be discarded).
return hf.release();
}
}

 创建一个高度场,长宽都是257,边界为0,高度引用大地水平基准面。

用默认值初始化高度场

在自己创建的LOD中创建一个高程查询信

解决缓存宽度

整合新高程

如果高程有任何改变,返回新的高程图,高度场。

这里integrate调用的函数,调用了integratePolygons函数来创建平整的高程图,我们看看这里具体怎么操作的

我们来看integratePolygons函数:


  1. // Creates a heightfield that flattens an area intersecting the input polygon geometry.创建一个包含集合多边形的高度场
  2. // The height of the area is found by sampling a point internal to the polygon.
  3. // bufferWidth = width of transition from flat area to natural terrain.
  4. bool integratePolygons(const TileKey& key, osg::HeightField* hf, const Geometry* geom, const SpatialReference* geomSRS,
  5. double bufferWidth, ElevationEnvelope* envelope, ProgressCallback* progress)
  6. {
  7. bool wroteChanges = false;
  8. const GeoExtent& ex = key.getExtent();
  9. double col_interval = ex.width() / (double)(hf->getNumColumns()-);
  10. double row_interval = ex.height() / (double)(hf->getNumRows()-);
  11. POINT Pex, P, internalP;
  12. bool needsTransform = ex.getSRS() != geomSRS;

循环遍历长宽间隔获取每个顶点坐标


  1. for (unsigned col = ; col < hf->getNumColumns(); ++col)
  2. {
  3. Pex.x() = ex.xMin() + (double)col * col_interval;
  4. for (unsigned row = ; row < hf->getNumRows(); ++row)
  5. {
  6. // check for cancelation periodically
  7. //if (progress && progress->isCanceled())
  8. // return false;
  9. Pex.y() = ex.yMin() + (double)row * row_interval;
  10. if (needsTransform)
  11. ex.getSRS()->transform(Pex, geomSRS, P);
  12. else
  13. P = Pex;
  14. bool done = false;
  15. double minD2 = bufferWidth * bufferWidth; // minimum distance(squared) to closest polygon edge
  16. const Polygon* bestPoly = 0L;
  17. ConstGeometryIterator giter(geom, false);
  18. while (giter.hasMore() && !done)
  19. {
  20. const Polygon* polygon = dynamic_cast<const Polygon*>(giter.next());
  21. if (polygon)
  22. {
  23. // Does the point P fall within the polygon?
    循环检查这里是否有点在这些几何形状里
  24. if (polygon->contains2D(P.x(), P.y()))
  25. {
  26. // yes, flatten it to the polygon's centroid elevation;
  27. // and we're dont with this point.
    如果这点就在几何形状范围里,直接跳出检查
  28. done = true;
  29. bestPoly = polygon;
  30. minD2 = -1.0;
  31. }
  32. // If not in the polygon, how far to the closest edge?
    如果没在,计算距离边缘最近的距离的平方

  1. else
  2. {
  3. double D2 = getDistanceSquaredToClosestEdge(P, polygon);
    查看获得值是否在缓存范围内
  4. if (D2 < minD2)
  5. {
    如果在范围内,就设置好这个点在缓存内最近的位置,以便后面计算
  6. minD2 = D2;
  7. bestPoly = polygon;
  8. }
  9. }
  10. }
  11. }
  12. if (bestPoly && minD2 != 0.0)
  13. {

  判断这些需要获取的高程点,有没有在需要关注的几何图形里或者缓冲区范围内的,如果有就做以下工作,来抬高地形:


  1. float h;
  2. POINT internalP = getInternalPoint(bestPoly);
  3. float elevInternal = envelope->getElevation(internalP.x(), internalP.y());
  4. if (minD2 < 0.0)
  5. {
  6. h = elevInternal;
  7. }
  8. else
  9. {
  10. float elevNatural = envelope->getElevation(P.x(), P.y());
  11. double blend = clamp(sqrt(minD2)/bufferWidth, 0.0, 1.0); // [0..1] 0=internal, 1=natural
  12. h = smoothstep(elevInternal, elevNatural, blend);
  13. }
  14. hf->setHeight(col, row, h);
  15. wroteChanges = true;
  16. }
  17. }
  18. }
  19. return wroteChanges;
  20. }

真正平整的函数在:integrate函数

进入FlatteningLayer文件的integratePolygons函数

先获取TileKey范围

获取长宽的间隔分别是多大长度

检查是否要做SRS转换,这里看是需要的

West -180  xMin    SRS-> -20037508.343

East  0     xMax

South -90  xMin    SRS-> -20037508.343

North 90    yMax

循环遍历长宽间隔获取每个顶点坐标

POINT P是这点的世界位置点

循环检查这些几何形状

看看点是否在这些几何形状里

如果不在,计算距离边缘最近的距离的平方

查看获得值是否在平整范围内

如果在范围内,就设置好这个点在范围内最近的位置,以便后面计算

如果点就在几何形状范围里,直接跳出检查

直接点说

就是判断这些需要获取的高程点,有没有在需要关注的几何图形里或者缓冲区范围内的,如果有就做以下工作,来抬高地形:

先找到几何图形内部的一个顶点(多为中心,质心等)

通过ElevationEnvelope类的getElevation函数计算这个点的高程

判断这个要改变高程的点与几何图形的位置关系:

如果在几何图形内就设置这个点用刚才获取的高程点(这个方式有待商榷)

如果在缓冲区上,获取这个点的现实高程值。获取当前点在缓冲区上的范围值,做smoothstep变换。

然后将之前得到的高程按格子塞入高程图。

齐活!

osgEarth的Rex引擎原理分析(一一四)rex与mp引擎的关系 目标:(一一三)中的问题201 rex与mp都是osgEarth加载地理高程和影像的引擎。rex比mp新,功能更强大。 rex引擎支持随机瓦片加载、地图颜色渐变、更快的添加删除 待继续分析列表: 9、earth文件中都有哪些options((九)中问题) 10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题) 11、rex地理信息引擎的四梁八柱((九)中问题) 12、osgEarth::TerrainEngineNode中setMap方法作用((... 阅读详情

相关推荐

osgEarth的Rex引擎原理分析(九十六)RenderingPasses和RenderBindings

目标:(九十五)中的问题177 RenderBindings用于声明rex引擎要渲染哪些种类的图层信息,比如影像、父影像、高程、法线等,只指定绑定类别,对每一个绑定类别都会设置其对应的采样器、偏移矩阵、纹理单元号,在rex的setupRenderBindings中有详细描述。 RenderingPasses用于声明rex实际有哪些图层要渲染,这里的图层中,同一类型的可能有多个,比如多个影像层、...

hankern的专栏 730

基于cesium和mars3d海洋三维管线信息系统开发完工总结

从8月20日开始着手开发海洋三维管线信息系统,到今天9月20日,刚好一个月,基本完成了自己最初的设想。博主也终于摆脱了这个困扰自己5-6年的梦魇(夸张了)。这个项目来源于单位为了鼓励年轻人创新,在内部设立的科技项目。这个项目也申请了好几年,一直没有上, 可能是审题老师觉得这个项目过于庞大,个人无法完成。博主后来基本上放弃了,后来政策发生了变化,领导突然想到这个项目,博主不好意思拒绝了领导的好意,只有硬着头皮上了。此时,博主即将步入中年了,不适宜与年青人抢项目了。 开发过程也是比较曲折,开...

Xiaok的专栏 2818

osgearth仿真平台(1)

osgearth仿真平台,主要是仿真一些专业领域的算法等。

weixin_41157291的博客 2140

第12节 实例-挖方填方量的计算

感谢 感谢网友热心提出这个问题,大家有问题也可以在评论区提出。 资源下载 本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹: 注意: 务必使用浏览器打开: 链接:https://pan.baidu.com/s/13gwJLwo_LbRnN3Bl2NXXXw 提取码:xrf5 功能 1. 我们先画一个盒子,长宽高是10,8,7,再随便旋转个30度,盒子的体积是560。这样我们就好看看我们自己的方式算的准不准。 2. 点击w键,会采样变密,点击s键会采样变粗,命令行中打印出采样的间隔以及算

一切皆可视 1810

osgEarth的Rex引擎原理分析(一零二)如何判断瓦片的添加删除

目标:(一零零)中的问题180 1、瓦片何时删除的事件是无法监听,貌似意义也不大 2、瓦片的添加监听步骤如下: 2.1瓦片在创建、有高程修改时会发出通知 osgEarthDrivers/engine_rex/TileNode.cpp void TileNode::create(const TileKey& key, TileNode* parent, EngineContext*...

hankern的专栏 829

osgEarth示例分析——osgearth_graticule

osgearth网格示例分析。

优快云的博客 2154

[原][osgearth]OE地形平整代码解读

在FlatteningLayer文件的createHeightField函数中:使用的github在2017年1月份的代码 if (!geoms.getComponents().empty()) { osg::ref_ptr&lt;osg::HeightField&gt; hf = HeightFieldUtils::createReferenceHeightField(...

weixin_34250434的博客 726

osg地形以及tms高程切片的cmd命令

1.osg地形 .\osgdem.exe -t D:\osg-osgearth\dem\img.tif -d D:\osg-osgearth\dem\ASTGTM_N30E103Y.tif --geocentric -o D:\osg-osgearth\dem\dixing.ive -ge startLon startLat lonDis latDis -t 影像图片;-d 高程图片;–geocentric 指定坐标系(后续在osg使用可以直接添加地形,不需要加载矩阵中设置位置经纬度;例如:root-&g

ambition_xiaoman的博客 2354

osgEarth地形压平案例 37. feature_elevation.earth

三维地形压平案例。

qq_24934183的博客 2375

GLOCOFFS:全球沿海沿海洪水预报系统:基于ADCIRC的全球风暴潮建模系统,可提供沿海洪水的实时预报

最新的6小时预报 免责声明:此模型正在开发中,有关浪涌和沿海洪水的预测仅出于研究目的。 在任何情况下,均不得将其用于航行目的或应急计划。 流体动力:最大浪涌(潮汐之上的气象驱动组件) 单击以查看单个区域中的最大喘振和最大风/最小压力的特写 ・・・・・・ 气象:最大10米风和最小海面压力 存档事件 如何获得预测? 预测是受到气象和天文强迫的二维非正弦三角网的正压海洋环流和淹没模拟,分别推动潮汐和潮汐。 在海面阻力驱动浪涌的计算中考虑了冰的影响。 使用模型的版本55进行模拟( ),每个预测模拟在96个计算处理器上需要大约10分钟的挂钟时间。 网格已使用 Matlab网格化工具箱自动生成( )。 每个预测使用单个无缝的非结构化网格。 覆盖整个地球的默认网格的沿海分辨率为1.5 km。 在海洋中,根据地形梯度和距海岸线的距离,分辨率在1.5 km和25 km之间变化。 注意:有关以下说

fibplus-8.0.0.zip

FIBPlus 是一套面向 Delphi / C++Builder 的 Firebird、InterBase 数据库访问组件,特点是直接走原生客户端 API,不经 BDE/ODBC,速度快且可控性强。8.0.0 版本主要适配 Delphi 2009 及以后的版本(Delphi 6–2007 需用 7.9.x),核心组件包括 TpFIBDatabase、TpFIBTransaction、TpFIBDataSet 等,支持精细事务管理、本地缓存、BLOB 处理和备份恢复等数据库服务。该库原为 Devrace 的商业组件,现由社区在 GitHub 的 madorin/fibplus 项目开源维护,建议从官方仓库获取源码而非第三方网盘压缩包。安装时解压后用对应版本的工程组(10.4+ 统一为 `FIB.groupproj`)Build 全部包,再 Install `dclFIB` 并在 Library 路径加入 Source 目录即可。新项目中若需官方技术支持,也可考虑 FireDAC、IBDAC 等更现代的替代方案。

第17节 实例-倾斜摄影数据挖填方

致谢 感谢网友提出这个问题。大家有问题也可以在评论区提出,有问必有答。 问题描述 在第12节(这是第17节,往前翻翻)挖填方的基础上,仍有网友提问怎么做倾斜摄影的挖填方,仿照大疆的一个什么软件的结果。如图: 下图是本程序的对比(结果大差不差): 各方确认各点的精确值并没有,因此上面的点我只能大差不差的点,而上图还一个最关键信息是:基准面:最低点 也就是以点出的点的最低点为基准面来计算挖填方。同时也有网友提出来我要在这个图形上挖个沟,沟的模型有,地表的模型有,求挖沟的挖方与填方。这与本节中所说的方法都是一样

一切皆可视 1790

利用抖音Cookie充值接口提取支付链接,调起原生微信h5支付宝h5支付

最近开始搞一些个人支付通道的开发,方便个人不用和第三方平台签约就能收款,省去很多流程手续的成本。 然后翻了一下网上并没有太多现成的技术教程,只能自己研究着搞了。 这次要分享的是利用抖音的充值接口,去分析提取出支付链接,分别包含微信原生支付的h5支付链接,和支付宝h5支付链接。 微信h5支付: 抖币充值,抖音充值,抖音直播充值官方入口 - 抖音 支付宝h5支付 抖币充值,抖音充值,抖音直播充值官方入口 - 抖音 整个开发流程思路是以下几步: 1.抓包分析抖音的充值的整个流程,提取关键的一些

Android-逆向的博客 6567

osgEarth示例分析——osgearth_tilesource

osgearth_tilesource示例,展示如何创建自定义瓦片源并添加到图层。

优快云的博客 1697

飞牛NAS+Docker打造私人IPTV直播源:手把手教你部署iptv-api

本文详细介绍了如何在飞牛NAS上通过Docker部署iptv-api,打造私人IPTV直播源。从SSH配置到Docker容器部署,手把手教你实现自动更新直播源、多终端支持的解决方案,适用于Kodi、PotPlayer等播放器,提升家庭娱乐体验。

earth的博客 5572

从零搭建VGGNet

在 forward 方法中实现了前向传播过程,包括卷积、激活、池化和平铺操作,最后通过全连接层得到分类结果。使用 torch.onnx.export 将模型导出为 ONNX 格式的文件 vgg.onnx。导出 ONNX:将模型导出为 ONNX 格式,便于在其他平台或框架中使用。定义 VGG 网络:构建了一个包含多个卷积层、池化层和全连接层的网络。使用 torch.save 将整个模型保存为 vgg.pth 文件。前向传播:对输入数据进行前向传播,得到输出结果。保存模型:将模型保存为 .pth 文件。

开源驱动,创造价值;坦诚清晰,快速失败;让复杂可计算。 521

5、osg绘制正方形和四方块以及内置的几何图形

1、首先要定义一个几何图形,用来创建正方形的一个对象,这个对象根据坐标,颜色来进行绘制,如下代码创建一个几何对象: osg::ref_ptr geom=new osg::Geometry();//定义一个几何体2、创建一个坐标集合对象,并且向对象中存入4个3维坐标点,如下代码所示: //首先定义四个点 osg::ref_ptr v=new osg::Vec3Array();//定义一个几何体坐

sxj的专栏 8412

CST高阶技巧:用周期性边界快速仿真共面波导色散特性(含JDM求解器优化)

本文详细介绍了在CST仿真软件中,利用周期性边界条件结合JDM本征模求解器,高效分析共面波导色散特性的高阶技巧。该方法通过仿真一个单元胞而非整条传输线,大幅提升计算效率,并提供了从建模、边界设置、求解器优化到后处理的完整工作流程,是高频电路设计的实用指南。

weixin_29280219的博客 402

三维地理信息平台介绍与比较

1 国外主流三维地理信息平台介绍 Google Earth和World Wind是两款优秀的网络维地球影像浏览器,它们的出现,打破了传统Web GIS的数据发布模式,为空间信息的快速发布提供了新的解决思路和技术手段 采用这种技术,客户端和服务器之间不是直接传输空间数据,而是传输影像图片和XML ( KML Key-hole Markup Language KML)文档,影像数据被预先按照不同比...

weixin_30778805的博客 1644

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

努力,加油每一天鸭~ 1037

大语言模型与ROS集成的自然语言机器人控制:开源框架与应用实例

近年来,大语言模型(LLM)与机器人操作系统(ROS)的集成逐步成熟,使得自然语言驱动的机器人控制成为可能。用户输入“捡起绿色方块”或“把微波炉里的饭热好端过来”这类日常语句,机器人能够自动拆解步骤、规划动作并执行。本文梳理2026年前后发布的三个代表性开源框架——ROS-LLM、ROSClaw以及LLM+Nav2基准测试系统,介绍其技术路径与工程落地情况。

Studying…… 633

java计算经纬度距离_【干货】无人机航测倾斜实景三维建模进行土方计算(基于Smart3D全面讲解)...

土石方工程量的核算往往是工程预算与结算中的争议与焦点,然而运用天星系列多镜头倾斜摄影测量系统的实景3D建模方法模拟土方石的开挖与回填,可以让施工方直观有效地开展土石方的挖运分析与运算,做到土方平衡计算的精确化与精细化,对项目成本管控发挥了重要作用。倾斜摄影技术在土石方工程量中的计算思路需解决的问题:1. 如何从原始地貌提取出初始数据 ?2. 如何把航测数据转化为3D模型?3. 如何从3D模型得到土...

weixin_39993301的博客 729

Arcgis使用NDVI值遥感反演叶面积指数(LAI)

经验模型反演操作不难,主要是要多看文献,了解公式。本文中的公式我也不清楚是哪个作物的NDVI和LAI的关系(别人提供的),继续看文献整理吧。后续会在下面罗列更新一下主要公式。

所有专家都曾始于新手 8430

在使用osgEarth时植被等纹理细节没有显示

数字高程模型(Digital Elevation Model,简称DEM)作为地球空间信息框架的基本内容和其他各种信息的载体被列为十分重要的基础地理信息产品。DEM描述的是地面高程信息,在测绘、水文、地质、通信、军事等领域有着广泛的应用。如在防洪减灾方面,DEM是进行水文分析如汇水区分析、水系网络分析、降雨分析、淹没分析等的基础;在无线通讯上,可用于蜂窝电话的基站分析等等。北京数字空间科技有向公司在DEM数据获取、数据组织、数据建模与分析领域,拥有先进技术方法,在空间数据基础设施建设和数字地球战略的实施方

aoxuestudy的专栏 1393

北斗导航 | ChatGPT之RTK、RTD、ARAIM算法原理及程序代码(ChatGPT看你怎么回答,附部分代码)

ChatGPT之RTK、RTD、ARAIM算法原理及程序代码

尘世冰封的专栏 3678

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: OpenGL中关于模板缓冲区的详细解释
下一篇: 地理空间框架(二):大地水准面、似大地水准面、参考椭球面
pplander
博客等级 码龄20年 111粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值