文章目录

  • 1. 概述
  • 2. 实例
    • 2.1. 代码
    • 2.2. 解析
  • 3. 结果

1. 概述

ContextCapture(Smart3D)生成的倾斜摄影模型数据一般都形如如下组织结构:

在Data目录下包含了分块的瓦片数据,每个瓦片都是一个LOD文件夹。osg能够直接读取osgb格式,理论上只需要依次加载每个LOD的金字塔层级最高的osgb,整个倾斜摄影模型数据就加载进来了。不过有点麻烦的是这类数据缺乏一个整体加载的入口,如果每次加载都遍历整个文件夹加载的话,会影响加载的效率。所以一般的数据查看软件都会为其增加一个索引。

这里就给倾斜摄影数据添加一个osgb格式的索引文件,生成后就可以通过OSG直接加载整个倾斜摄影模型数据。

2. 实例

2.1. 代码

具体的实现代码如下:

#include <iostream>
#include <string>#include <QDir>#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>using namespace std;//查找目录下所有的文件夹
static void findDir(string dir, vector<string>& subDirs)
{//subDirs.clear();QDir fromDir(QString::fromLocal8Bit(dir.c_str()));QStringList filters;//QFileInfoList fileInfoList = fromDir.entryInfoList(filters, QDir::AllDirs | QDir::Files);foreach(QFileInfo fileInfo, fileInfoList){if (fileInfo.fileName() == "." || fileInfo.fileName() == ".."){continue;}if (fileInfo.isDir()){QByteArray dir = fileInfo.filePath().toLocal8Bit();subDirs.push_back(dir.data());}}
}//得到文件路径的文件名   C:\\b\\a(.txt) -> a
static std::string DirOrPathGetName(std::string filePath)
{size_t m = filePath.find_last_of('/');if (m == string::npos){return filePath;}size_t p = filePath.find_last_of('.');if (p != string::npos && p > m)                //没有点号或者{filePath.erase(p);}std::string dirPath = filePath;dirPath.erase(0, m + 1);return dirPath;
}void createObliqueIndexes(std::string fileDir)
{string dataDir = fileDir + "/Data";osg::ref_ptr<osg::Group> group = new osg::Group();vector<string> subDirs;findDir(dataDir, subDirs);for (size_t i = 0; i < subDirs.size(); i++){string name = DirOrPathGetName(subDirs[i]);string path = subDirs[i] + "/" + name + ".osgb";osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(path);osg::ref_ptr<osg::PagedLOD> lod = new osg::PagedLOD();auto bs = node->getBound();auto c = bs.center();auto r = bs.radius();lod->setCenter(c);lod->setRadius(r);lod->setRangeMode(osg::LOD::RangeMode::PIXEL_SIZE_ON_SCREEN);osg::ref_ptr<osg::Geode> geode = new osg::Geode;geode->getOrCreateStateSet();lod->addChild(geode.get());std::string relativeFilePath = "./Data/" + name + "/" + name + ".osgb";  //相对路径lod->setFileName(0, "");lod->setFileName(1, relativeFilePath);lod->setRange(0, 0, 1.0);                                                                                           //第一层不可见lod->setRange(1, 1.0, FLT_MAX);lod->setDatabasePath("");group->addChild(lod);}std::string outputLodFile = fileDir + "/Data.osgb";osgDB::writeNodeFile(*group, outputLodFile);
}int main(int argc, char *argv[])
{string fileDir = "D:/Data/scene/city";std::string outputLodFile = fileDir + "/Data.osgb";createObliqueIndexes(fileDir);osgViewer::Viewer viewer;osg::Node * node = new osg::Node;node = osgDB::readNodeFile(outputLodFile);viewer.setSceneData(node);return viewer.run();
}

2.2. 解析

如果直接读取每一块的LOD然后通过osgDB::writeNodeFile写入到一个osgb文件,这个文件就会保存所有块的LOD第一层信息。这样在第二册加载的时候还是会比较慢,所以这里就创建了一个空的节点,形成了索引所有LOD块的数据结构。对于每一块数据,新建两层LOD,第一层为自身的空白节点,第二层为分块LOD的第一层数据:

osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(path);
osg::ref_ptr<osg::PagedLOD> lod = new osg::PagedLOD();auto bs = node->getBound();
auto c = bs.center();
auto r = bs.radius();
lod->setCenter(c);
lod->setRadius(r);
lod->setRangeMode(osg::LOD::RangeMode::PIXEL_SIZE_ON_SCREEN);
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->getOrCreateStateSet();
lod->addChild(geode.get());std::string relativeFilePath = "./Data/" + name + "/" + name + ".osgb";  //相对路径lod->setFileName(0, "");
lod->setFileName(1, relativeFilePath);lod->setRange(0, 0, 1.0);                                                                                           //第一层不可见
lod->setRange(1, 1.0, FLT_MAX);lod->setDatabasePath("");group->addChild(lod);

LOD的Center和Radius都非常重要,需要预先设置好;setRangeMode设置了细节层级调度的模式,一般都为PIXEL_SIZE_ON_SCREEN;setFileName设置了每一层的数据路径,setRange确定了当前层级的范围。由于这个LOD只是个索引文件,所以会设置第二层为极大的可见范围值。

3. 结果

可以像加载普通OSGB文件一样加载这个索引文件,通过osgviewer加载的效果如下:

OSG加载倾斜摄影数据相关推荐

  1. Unity3D(UE4)加载倾斜摄影数据OSGB格式

    在Unity3D平台动态加载调度倾斜摄影数据,利用多线程动态加载瓦片数据,可以顺畅加载海量的瓦片数据.目前测试可流畅加载100G左右数据,支持加载本地数据,数据可不放在Unity工程内,也可以将数据放 ...

  2. osg加载osgb数据_铁路工程三维协同大数据云平台研究与开发

    铁路工程三维协同大数据云平台是基于3DGIS空间信息平台.BIM云平台.GIM云平台.在线监测云平台及增强现实云平台的多平台融合技术 现代铁路工程建设更加注重BIM.物联网等新技术,构建全生命周期一体 ...

  3. SuperMap三维专题之倾斜摄影——WebGL加载倾斜摄影数据篇

    本篇内容将会结合SuperMap的两个产品iDesktop和iServer来展现.iDesktop主要用于数据的处理,iServer主要用于web端数据的服务发布和展现.话不多说,我们直接进入操作阶段 ...

  4. Cesium开发及离线加载倾斜摄影

    前言 前段时间接手了一个任务,让我研究一下开源的地图引擎,可以加载倾斜摄影数据,展示3D效果,实现地图应该有的大部分功能~好吧,我听到时真是一头雾水.WTF?地图引擎?3D模型?倾斜摄影?这都是什么鬼 ...

  5. Unity加载倾斜摄影模型/激光点云,开源

    [重大更新]现已支持WebGL 业余时间尝试了下用Unity加载倾斜摄影模型/激光点云,目前支持Bentley ContextCapture生成的3MX格式 源码见 https://github.co ...

  6. 第38.1节 osg加载大tif-编译vpb

    目录 本节内容 具体内容 本节内容 本节开始实现使用osg加载超大tif的功能,具体有多大的tif可以支持呢,就是要多大有多大. 要不是网友们提这个功能,我基本上已经忘记vpb了,它是osg早期关于使 ...

  7. Cesium加载大数据量地下管线

    Cesium加载大数据量地下管线 Cesium优化加载 管线加载 管井.摄像头.交通信号灯等模型加载 与倾斜摄影模型结合加载 Cesium优化加载 管线.管井.路灯.交通信号灯.接电箱等模型使用Pri ...

  8. vite+cesium加载3DTile数据

    Cesium 3D Tile是Cesium的一种特有的3D模型格式,其文件名后缀为.b3dm,而要在自己开发的平台上调用这些3D Tile,一般为通过后缀为.json格式的文件来调用.b3dm格式的3 ...

  9. SuperMap iMobile 8C 技术文档 ——加载倾斜摄影模型

    作者:博哥 北京超图软件股份有限公司 中国•北京 ##** 目 录** ###**1 概述 ** ###**2 操作流程 ** ####**2.1 生成配置文件 ** #####2.1.1 使用说明 ...

  10. autoware加载地图数据与使用rosbag包建图(三)

    autoware加载地图数据(三) 介绍如何为autoware加载地图数据 启动autoware $ cd ~/autoware.ai $ source install/setup.bash $ ro ...

最新文章

  1. 他是阿里中台之父,从一线员工做到CTO:有商业意识的技术人,才有未来!
  2. 【偶尔一道ctf】xctf adword mobile easy-apk
  3. 牛客网(剑指offer) 第十五题 反转链表
  4. ROS2学习(十一).ROS概念 - 命令行工具的使用
  5. axure怎么做5秒倒计时_罗胖60秒:怎么做一个课程?
  6. python3实用编程技巧_9.python3实用编程技巧进阶(四)
  7. qq浏览器插件_惊艳与吐槽:QQ浏览器升级到 Chromium70 内核以后
  8. nlp-tutorial代码注释3-1,RNN简介
  9. 微软物联网发掘万物互联的价值
  10. 读书笔记:《小米生态链战地笔记》
  11. Python的request官方文档
  12. 进出口流程 报关单据
  13. 简单基于tun实现的用户态NAT64
  14. ubuntu流量监控_ubuntu 流量监控
  15. unity之粒子特效制作图片拼合文字效果
  16. 计算机绘画社团活动教案,电脑绘画社团活动策划书精选
  17. 游戏资讯:预计在10月底至11月内, 版号审批将会恢复
  18. 强制内联和强制不内联
  19. hydrus1d使用说明_Hydrus-1D中文说明.doc
  20. rj45 千兆接口定义_rj45接口定义,大神教你秒懂rj45的接线方法【详细方法】

热门文章

  1. 最GIS应用案例——告诉你什么是GIS!
  2. JAVA数据结构之Map和Set
  3. android短信验证码登录,Android注册登录实时自动获取短信验证码
  4. 6个适合成年人的自学网站,每天半小时改变你一生
  5. python理财基金数据分析可视化系统
  6. 邮件服务器需要445端口,445端口是什么服务端口(2)
  7. STM32串口中断接收一帧数据
  8. react devtools插件报错处理
  9. opencv 数据库裁剪图片
  10. python github 12306 文贤平_抢票工具成了GitHub热榜第一,最新支持候补抢票,Python跑起来...