研发三维GIS系统笔记/实现wgs84投影-002

研发,三维,gis,系统,笔记,实现,wgs84,投影 · 浏览次数 : 0

小编点评

**修改完善后的四叉树代码:** ```cpp // ... void generate(const real2& vStart, const real2& vEnd, int level, ChildId corner) { // Initialize child nodes to 0 _childs[0] = 0; _childs[1] = 0; _childs[2] = 0; _childs[3] = 0; // Calculate UV coordinates float2 vHalf = (_parent->_uvEnd - _parent->_uvStart) * 0.5f; float2 vCenter = (_parent->_uvStart + _parent->_uvEnd) * 0.5f; // Determine UV coordinates for child nodes 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; // ... Similar cases omitted for brevity } // Check if parent has image data if (_parent->hasFlag(FLAG_HAS_IMAGE)) { _flag |= FLAG_RENDER; } // Get texture ID for child node _textureId = _parent->getTerrain()->_textureId; // Generate child node _childs[corner] = new CELLQuadTree( 3, _terrain.getHalfSize(), real2(vCenter.x - vSize.x, vCenter.z), real2(vCenter.x, vCenter.z + vSize.z), (int)_tileId._lev + 1, corner ); // Recursively generate children of child node _childs[corner]->generate(vStart, vEnd, level + 1, corner); } // ... ``` **修改说明:** * 使用 `_childs`数组存储每个分支的子节点。 * 在计算 UV 坐标时使用 `vHalf` 和 `vCenter` 来平铺区域。 * 对于不同分支的 UV 坐标,使用 `switch` 语句进行处理。 * 在 `generate` 方法中,递归地生成子节点。 * 使用 `hasFlag` 方法检查父节点是否具有图像数据。

正文

  四叉树代码修改完善

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

    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相似的内容:

研发三维GIS系统笔记/实现wgs84投影-002

四叉树代码修改完善 原来的代码中,没有使用投影转换,直接使用的是世界坐标(单位是米), CELLQuadTree::CELLQuadTree( CELLTerrainInterface* pInterface ,CELLQuadTree* parent ,const real2 vStart ,co

研发三维GIS系统笔记/实现wgs84投影-001

1. 工作内容,改造引擎,支持wgs84投影 改造原因:目前投影是墨卡托投影(与Google Map一致) 目前的GIS系统是二维的采用这个坐标系是没有问题的 但不支持wgs84瓦片数据以及高程数据,工作中很多数据是wgs84格式的,尤其很多三维GIS都是采用wgs84投影 wgs84 与merca

研发三维GIS系统笔记/框架改造/智能指针重构框架-003

1. 使用智能指针重构系统 原有的系统都是裸指针,在跨模块与多线程中使用裸指针管理起来很麻烦,尤其是多任务系统中会出现野指针 1 class CELLTileTask :public CELLTask 2 { 3 public: 4 CELLQuadTree* _node; 5 TileId _ti

如何基于three.js(webgl)引擎架构,研发一套通过配置就能自动生成的3D机房系统

自动化3D机房、微模块、3D机房、3D数据中心、科技感数据中心、三维机房、3d建筑,3d消防,消防演习模拟,3d库房,3d档案室,3d密集架,webGL,threejs,3d机房,bim管理系统

计算机视觉五大核心研究任务全解:分类识别、检测分割、人体分析、三维视觉、视频分析

> 本篇文章深入探讨了计算视觉的定义和主要任务。内容涵盖了图像分类与识别、物体检测与分割、人体分析、三维计算机视觉、视频理解与分析等技术,最后展示了无监督学习与自监督学习在计算机视觉中的应用。 > 作者 TechLead,拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦

[转帖]三星研发出首个基于存算一体技术的GPU大型计算系统 (收录于存算一体芯片赛道投资融资分析)

https://zhuanlan.zhihu.com/p/591850021 陈巍谈芯:产业巨头已经打通存算一体技术的落地通道,存算一体技术加快应用部署。与未使用HBM-PIM(HBM-PIM GPU v.s. HBM GPU)相比,仅用20nm工艺就使7nm集群计算性能提升了2.5倍。这个思路也是

研发高阶能力之「技术规划」

企业有三类角色:worker、partner、owner,不同角色基于不同的身份认同,工作在不同的平面,表现出不同的行为,创造出不同的价值,从而分配不同的蛋糕份额

uniapp+vue3聊天室|uni-app+vite4+uv-ui跨端仿微信app聊天语音/朋友圈

原创研发uniapp+vue3+pinia2跨三端仿微信app聊天模板Uniapp-Wechat。 uni-vue3-wchat基于uni-app+vue3+pinia2+uni-ui+uv-ui等技术跨端仿制微信App界面聊天项目,支持编译到H5+小程序端+App端。实现编辑框多行消息/emoj混

DevOps | 产研协同效能提升之评审、审批流、质量卡点

研发过程中有各种需求的评审、审批流和质量卡点,有的是为了质量把关,有的是为了彰显权力,还有一些是为了信息告知。本文主要讨论在软件开发过程中涉及的评审、审批和质量卡点三种情况,同时探讨对研发流程的影响,在这过程中如何去提效。 同团队内部评审 同团队之间的评审包括产品团队内部的PRD评审,RD团队内部的

一图看懂CodeArts Inspector 三大特性,带你玩转漏洞管理服务

华为云漏洞管理服务CodeArts Inspector是面向软件研发和服务运维提供的一站式漏洞管理能力,通过持续评估系统和应用等资产,内置风险量化管理和在线风险分析处置能力,帮助组织快速感应和响应漏洞,并及时有效地完成漏洞修复工作,更好地应对潜在的安全威胁。