四叉树代码修改完善

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

    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. 解密Prompt系列10. 思维链COT原理探究

    前一章思维链基础和进阶玩法我们介绍了如何写Chain-of-thought Prompt来激活生成逐步推理,并提高模型解决复杂问题的能力,这一章我们追本溯源,讨论下COT的哪些元素是提升模型表现的核心 ...

  2. 4.3 x64dbg 搜索内存可利用指令

    发现漏洞的第一步则是需要寻找到可利用的反汇编指令片段,在某些时候远程缓冲区溢出需要通过类似于jmp esp等特定的反汇编指令实现跳转功能,并以此来执行布置好的ShellCode恶意代码片段,LyScr ...

  3. HTML前端js

    ajax请求方法书写 $.ajax({ type:"POST", url:CONTEXT_PATH+"/appAudit/insertSnDocCountAdmin&qu ...

  4. 关于ChatGPT与机器时代的展望

    关于 ChatGPT 与机器时代的展望 机器人这一概念,最初不是出自计算机科学家或工程师之手,而是来自于捷克的戏剧家卡雷尔·恰佩克(Karl Capek)在 1920 年编排的一出名为"罗森 ...

  5. YOLOX目标检测实战:LabVIEW+YOLOX ONNX模型实现推理检测(含源码)

    目录 前言 一.什么是YOLOX 二.环境搭建 1.部署本项目时所用环境: 2.LabVIEW工具包下载及安装: 三.模型的获取与转化[推荐方式一] 1.方式一:直接在官网下载yolox的onnx模型 ...

  6. linux内核vmlinux的编译过程(七)

    一. vmlinux目标及其构建规则 定义在顶层Makefile中,如下: # The all: target is the default when no target is given on th ...

  7. Redis理论

    什么是Redis Redis(Remote Dictionary Server)是使用C语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库. Redis可以存储键和五种不同类型 ...

  8. Easygraph:全面高效的图分析与社会计算开源工具

    前言图是对事物之间关系的一种原生的表达,利用图可以深入直接地认识世界中的关联.社交网络.交易数据.知识图谱.交通运输.生物技术等都是图数据的典型应用.社交网络是一种特殊的图数据,它建立在图网络的基础上 ...

  9. Vue: 在vscode中添加vue的代码片段

    创建vue文件模板 打开vscode,文件–>首选项->用户代码片段,在弹出的搜索框中输入vue,回车 删除原内容,将如下内容粘贴 { "Print to console&quo ...

  10. 王道oj/problem23

    网址:oj.lgwenda.problem/23 代码: #define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include<stri ...