四叉树代码修改完善

  原来的代码中,没有使用投影转换,直接使用的是世界坐标(单位是米),

    CELLQuadTree::CELLQuadTree(
CELLTerrainInterface* pInterface
,CELLQuadTree* parent
,const real2 vStart
,const real2 vEnd
,int level
,ChildId corner)
{
_terrain = pInterface;
    /// 这里使用y作为高度,因为如果是三维,后续初始化后应该使用高程数据填充
    /// 初始化用0,
_aabb.setExtents(vStart.x, 0, vStart.y, vEnd.x, 0, vEnd.y);
real3 vXenter = _aabb.getCenter();
    /// 这里计算经纬度,输入世界坐标转换成经纬度
real2 vLonLat = pInterface->spRef()->worldToLongLat(real2(vLonLat.x,vLonLat.z));
    /// 调用接口根据经纬度计算出来瓦片的Id,加载瓦片会根据该id访问 网络/磁盘瓦片,例如 d:/data/vTileId.z/vTileId.x/vTileId.y.jpg
int3 vTileId = pInterface->spRef()->getKey(level,vWorld.x,vWorld.y);
_tileId._lev = level;
_tileId._col = vTileId.x;
_tileId._row = vTileId.y;
_cornerId = corner;
_parent = parent;
_vStart = vStart;
_vEnd = vEnd;
_childs[0] = 0;
_childs[1] = 0;
_childs[2] = 0;
_childs[3] = 0;
_uvStart = float2(0.0f, 0.0f);
_uvEnd = float2(1.0f, 1.0f); _terrain->getCounts()._nodes ++;
_flag = 0;
_flag &= ~FLAG_HAS_IMAGE;
    /// 如果是没有父点,则说明是根节点,直接请求瓦片,不做处理
if (_parent == nullptr)
{
_terrain->request(this);
return;
}
    /// 如果不是根节点,那么默认情况下是没有瓦片数据的,则使用父亲节点数据作为子节点的输入
    /// 需要重新计算UV坐标,子节点的坐标应该是父节点的一半

float2 vHalf = (_parent->_uvEnd - _parent->_uvStart) * 0.5f;
float2 vCenter = (_parent->_uvStart + _parent->_uvEnd) * 0.5f;
_textureId = _parent->_textureId;
    /// 不同的子节点,UV计算是不一样的
switch (corner)
{
case CHILD_LT:
_uvStart = vCenter - float2(vHalf.x,0);
_uvEnd = vCenter + float2(0,vHalf.y);
break;
case CHILD_RT:
_uvStart = vCenter;
_uvEnd = vCenter + vHalf;
break;
case CHILD_LB:
_uvStart = vCenter - vHalf;
_uvEnd = vCenter ;
break;
case CHILD_RB:
_uvStart = vCenter - float2(0,vHalf.y);
_uvEnd = vCenter + float2(vHalf.x,0);
break;
default:
break;
}
if (_parent->hasFlag(FLAG_HAS_IMAGE))
{
_flag |= FLAG_RENDER;
}
    /// 重点:引用父节点数据
_textureId = _parent->_textureId;
_terrain->request(this);
}
  上图:
  
  
当一张瓦片被分裂成四张后,会存一个问题,瓦片是否有数据,默认情况下,使用父节点的书作为子节点输入


纹理坐标如下代码:
        switch (corner)
{
case CHILD_LT:
_uvStart = vCenter - float2(vHalf.x,0);
_uvEnd = vCenter + float2(0,vHalf.y);
break;
case CHILD_RT:
_uvStart = vCenter;
_uvEnd = vCenter + vHalf;
break;
case CHILD_LB:
_uvStart = vCenter - vHalf;
_uvEnd = vCenter ;
break;
case CHILD_RB:
_uvStart = vCenter - float2(0,vHalf.y);
_uvEnd = vCenter + float2(vHalf.x,0);
break;
default:
break;
}

瓦片裂分流程代码:

 1           vSize   =   _aabb.getHalfSize();
2 _childs[CHILD_LT] = new CELLQuadTree(
3 _terrain
4 , this
5 ,real2(vCenter.x - vSize.x,vCenter.z)
6 ,real2(vCenter.x,vCenter.z + vSize.z)
7 ,(int)_tileId._lev + 1
8 ,CHILD_LT
9 );
10
11 _childs[CHILD_RT] = new CELLQuadTree(
12 _terrain
13 ,this
14 , real2(vCenter.x, vCenter.z)
15 , real2(vCenter.x + vSize.x, vCenter.z + vSize.z)
16 , (int)_tileId._lev + 1
17 , CHILD_RT
18 );
19
20 _childs[CHILD_LB] = new CELLQuadTree(
21 _terrain
22 , this
23 , real2(vCenter.x - vSize.x, vCenter.z - vSize.z)
24 , real2(vCenter.x, vCenter.z)
25 , (int)_tileId._lev + 1
26 , CHILD_LB
27 );
28 _childs[CHILD_RB] = new CELLQuadTree(
29 _terrain
30 , this
31 , real2(vCenter.x, vCenter.z - vSize.z)
32 , real2(vCenter.x + vSize.x, vCenter.z)
33 , (int)_tileId._lev + 1
34 , CHILD_RB
35 );
 

研发三维GIS系统笔记/实现wgs84投影-002的更多相关文章

  1. VC、OpenGL、ArcGIS Engine开发的二维三维结合的GIS系统

    一.前言 众所周知,二维GIS技术发展了近四十年,伴随着计算机软硬件以及关系型数据库的飞速发展,二维GIS技术已日臻完善.在对地理信息的分析功能上有着无可比拟的优势.一些宏观的地理信息,一维的地理信息 ...

  2. 19个三维GIS软件对比

    19个三维GIS软件对比 麦豆科研技术中心 days ago 我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方 ...

  3. 国内外主流的三维GIS软件

    我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方向之一.上世纪八十年代末以来,空间信息三维可视化技术成为业界研 ...

  4. 3DEarth PPT :一款专为GIS系统研发的三维汇报演示系统

    3DEarth PPT(三维地球汇报演示系统)又称 3DGis PPT,是专为GIS系统研发的三维汇报演示系统.对有3DGis系统的客户它可以作为一个组件(dll)嵌入原系统,对没有3DGis系统的客 ...

  5. 三维GIS引擎地图可视化渲染方案设计

    1.GIS地图可视化流程 GIS地图可视化就是将空间数据转化为地图数据再进行交互处理的方法,下图一展示了地图可视化的可编程渲染的典型管道,原始空间数据必须处理为图形API支持基础图元用以地图渲染.下图 ...

  6. 开源(免费)三维 GIS(地形,游戏)

    先写想法: 想做个简单的地形漫游,于是考虑在ww直接开发,或找个控件形式的开发组件. 最大的期望有: 1. 支持google的sketchup,快速智能三维建模 2. 设计模式做好点,最好先做成组件形 ...

  7. 数字孪生,数据驱动下的北京 CBD 智能楼宇三维可视化系统

    前言 楼宇作为建筑基础设施的主体,为人们提供着重要的生存空间.随着物联网.人工智能概念的兴起以及智慧城市如火如荼的开展,智能楼宇的重要性越发突显. 随着城市现代化建设的发展,建筑的智能化,特别是公用建 ...

  8. 类似阿里双十一的可视化看板是怎么做的?无人机三维GIS看板也来了!

    天猫双十一数据可视化看板 每年的双十一,天猫都会在整点时刻直播战绩,惊叹于可怕战绩的同时,也会被背后展示的数据大屏吸引,这样让人眼前一亮的可视化数据看板是怎么做出来的? 所谓可视化数据看板,就是挂在墙 ...

  9. Java web与web gis学习笔记(一)——Tomcat环境搭建

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  10. 绿色城市智慧运营:Web 3D 垃圾分类 GIS 系统

    前言 感谢所有为上海疫情奉献的人,祈求上海疫情早日清零,中国加油,上海加油! <上海市生活垃圾管理条例>施行至今已有两年多,上海市民践行绿色低碳理念.主动参与生活垃圾分类的习惯基本养成,分 ...

随机推荐

  1. FPGA加速技术在人机交互界面中的应用及优化

    目录 引言 随着人工智能.云计算.大数据等技术的发展,人机交互界面的重要性也越来越凸显.作为用户与计算机之间的桥梁,人机交互界面的性能和效率直接影响用户的体验和使用效果.为了优化人机交互界面的性能,我 ...

  2. stream流根据集合中的元素的属性进行去重的方法

    public class StreamListTest { public static void main(String[] args) { List<Student> studentLi ...

  3. Java 输入字符串,统计大写字母,小写字母,数字字符的个数

    代码如下: public static void main(String[] args) { String str = "AaFsECvcS12483fs+-*/"; int bi ...

  4. 据说,Transformer 不能有效地进行时间序列预测?

    简介 几个月前,我们介绍了 Informer 这个模型,相关论文 (Zhou, Haoyi, et al., 2021) 是一篇获得了 AAAI 2021 最佳论文奖的时间序列论文.我们也展示了一个使 ...

  5. 了解前端中的BFC(块级格式化上下文)

    BFC(块级格式化上下文) 什么是BFC 指的是一个块级渲染作用域,该区域内拥有一套完整的规则来约束块级盒子的布局,且与区域外部无关. 为什么要使用BFC 当一个盒子不设置高度,当其中的子元素都浮动时 ...

  6. Python 运行 shell 命令的一些方法

    哈喽大家好,我是咸鱼 我们知道,python 在自动化领域中被广泛应用,可以很好地自动化处理一些任务 就比如编写 Python 脚本自动化执行重复性的任务,如文件处理.数据处理.系统管理等需要运行其他 ...

  7. 如何动态修改 spring aop 切面信息?让自动日志输出框架更好用

    业务背景 很久以前开源了一款 auto-log 自动日志打印框架. 其中对于 spring 项目,默认实现了基于 aop 切面的日志输出. 但是发现一个问题,如果切面定义为全切范围过大,于是 v0.2 ...

  8. 2023-7-27 WPF自定义命名空间在xaml中的使用

    xaml自定义命名空间 [作者]长生 为啥要用自定义命名空间 这是常见的几种命名空间 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/ ...

  9. Cobalt Strike使用教程二

    0x00 前言 继前一章介绍了Cobalt Strike的基本用法,本章接着介绍如何攻击.提权.维权等. 0x01 与Metasploit联动 Cobalt Strike → Metasploit m ...

  10. 【Leaflet入门篇】 Leaflet快速入门

    0 前言 Leaflet 是一个开源并且对移动端友好的交互式地图 JavaScript 库. 它大小仅仅只有 42 KB of JS, 并且拥有绝大部分开发者所需要的所有地图特性 .Leaflet 简 ...