四叉树代码修改完善

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

    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. StencilJs学习之事件

    其实并没有所谓的 stencil Event,相反 stencil 鼓励使用 DOM event.然而,Stencil 提供了一个 API 来指定组件可以触发的事件,以及组件监听的事件. 这是通过 E ...

  2. 编译器性能调优:使用C++11实现高效编译器

    目录 1. 引言 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍 <编译器性能调优:使用C++11实现高效编译器> 编译器是计算机程序的入口点,将源代码转换为可执行文 ...

  3. pyinstaller打包程序后提示No module named ‘xxxx‘

    解决方法1 1.检查 先在venv环境中安装xxx 报错的这个包 以我的举例 查看settings>project interpreter  (存在对应的包) 解决方法2 2.在xxx.spec ...

  4. 音视频开发进阶|第四讲:音频自动增益控制 AGC

    在之前的文章中,我们已经接触了两个重要的音频前处理模块 – 回声消除 AEC 和噪声抑制 ANS,它们分别解决了 RTC 场景下的回声.噪声问题,极大提升了用户的体验.至此,音频前处理三剑客中,就只剩 ...

  5. hexo博客git报错

    一.意外的标记异常 1.异常内容: xxx:blog xxxx$ hexo g INFO Start processing FATAL Something's wrong. Maybe you can ...

  6. maxwell数据抓取工具

    前言 maxwell是一款开源MySQL数据抓取工具,可以读取MySQL的binlog,然后转换成json并输出到kafka.redis等消息队列中. bin/maxwell,用于增量抓取 bin/m ...

  7. [golang]使用logrus自定义日志模块

    简介 logrus是一个第三方日志库,性能虽不如zap和zerolog,但方便易用灵活.logrus完全兼容标准的log库,还支持文本.JSON两种日志输出格式. 特点 相较于标准库,logrus有更 ...

  8. [python]爬取手机号码前缀和地区信息

    概述 使用python爬取手机号码前缀7位.区号和地区. 小网站不容易,对爬虫也挺友好,就不放链接了. 代码 import requests from lxml import etree from f ...

  9. Jenkins远程执行shell脚本,超时报错(ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,001 ms])

    通过Jenkins远程执行脚本时,发现Jenkins构建任务失败,但是服务器本身的脚本是生效的. 排查确认是Jenkins构建任务超时,导致Jenkins看板显示任务构建失败,但是服务器上的自动脚本执 ...

  10. Godot无法响应鼠标点击等输入事件时,检查这些内容

    注:本文以Godot 4.0 为基准,可能其他版本也能参考. 这是我用C#写项目时发现的,可能和gdscript使用者遇到的问题有一定区别. 如果你用Godot制作的游戏无法响应鼠标点击等输入事件,请 ...