GIS融合之路(八)-如何用Cesium直接加载OSGB文件(不用转换成3dtiles)

系列传送门:

山海鲸可视化:GIS融合之路(一)技术选型CesiumJS/loaders.gl/iTowns?

山海鲸可视化:GIS融合之路(二)CesiumJS和ThreeJS深度缓冲区整合

山海鲸可视化:GIS融合之路(三)CesiumJS和ThreeJS相机同步

山海鲸可视化:GIS融合之路(四)如何用CesiumJS做出Cesium For Unreal的效果

山海鲸可视化:GIS融合之路(五)给CesiumJS加上体积云(Volumetric Cloud)和高度雾(Height Fog)

山海鲸可视化:GIS融合之路(五)番外-山海鲸的体积云又又又升级了

山海鲸可视化:GIS融合之路(六)-Cesium的雨雪风雷电效果

山海鲸可视化:GIS融合之路(七)-Cesium实现夜空月亮星星渲染


本来觉得这个系列已经结束了,最近山海鲸研发了一个新产品-GISBox,研发过程中遇到了一个新的问题,那就是如何在Web中直接加载OSGB文件。

这里先说下GISBox项目的背景,我们在做倾斜摄影项目的过程有大量需要编辑OSGB模型的需求,但目前市面的产品要么就是产品功能单一,要么就是连试用都无法试用。我们希望打造一款真正业内愿意使用,也能一站式的搞定从OSGB编辑,转换,切片,分发完整链路的产品,这样GISBox就诞生了,目前产品正在快速完善中,大家可以下载体验:

GIS工具箱(GISBox)-免费的倾斜摄影OSGB/3Dtiles编辑转换发布平台

当然我们这篇文章并不打算介绍GISBox的研发内容,而是因为在GISBox中,我们要做OSGB文件的编辑。但OSGB如何直接加载呢?我们先看下OSGB文件的基本结构:

OSGB文件目录结构和文件内容结构

当然这张图对于osg::Group下面的osg::Geometry,osg::Texture2D,osg::DrawElement等等的元素没有进行描述,实际的文件结构要复杂的多,其中osg::PagedLOD上还存储了LOD不同计算方式和子文件地址的指向。

了解了文件的结构,那么问题来了。用什么库来加载呢?经过调研,我们发现了以下几种方案:

1.OSGViewer开源项目

最常见的做OSGB编辑的软件都是直接用OpenSceneGraph这个库里的OSGViewer开源项目来改的,这种方案的优势是OSGB的读取和渲染都无需自己写,只要在开源项目的基础上添加功能即可。但是这个方案的缺点也很明显,首先这个库是一个几乎10年前就停止维护的老库,渲染甚至还采用了OpenGL1.0的标准,想要在视觉上做一些调整几乎不可能。同时了解山海鲸的朋友应该知道,我们山海鲸创立了CS/BS动态切换的软件架构,我们所有的软件都可以既当作纯软件使用,也可以转换为服务器,变成内网协同的Web系统来使用。而OpenSceneGraph这套代码很难跑在Web上。

关于山海鲸的CS/BS切换,大家可以移步看下这个视频:

【山海鲸可视化CSaaS功能演示】实现BS/CS架构一键热切换​

2.osg-serializer-js开源库

这个库应该是目前Github上唯一一个可以直接解析OSGB的JS库了,好心的作者根据OpenSceneGraph的C++版本写了一套js的版本。我们试用了一下,基本的功能还是实现的不错的,基本可以将OSGB的文件很好的加载进来。这个库的优点是可以方便的在Web上使用。问题也很明显,兼容性略显不足,有些OSGB文件不支持。作者自己也说了不再维护这个库,推荐直接编译OpenSceneGraph的wasm。而且渲染端也是需要自己写的。

3.OpenSceneGraph编译WASM

根据第2条中提到的作者说的方案,我们做了直接的OpenSceneGraph的wasm编译。这个方案优点是兼容性好,且可以直接在Web中使用,缺点呢主要是和前端代码的整合。我们最初使用这套方案时,是通过修改Ceisum中3dtiles渲染逻辑直接来渲染加载进来的osgb的,但因为OpenSceneGraph中使用NodeVisitor的逻辑,需要去继承C++的库,同时需要同时处理C++和JS之间的类通信问题。代码上需要进行较为复杂的处理。

4.自己写OSGB解析库

上面这三种方案各有各的优缺点,虽然我们采用第3条方案,成功地在Cesium中显示了OSGB,且可以正常的有PagedLOD的逻辑。但前文也说了,这个方案的问题是整个项目难以维护,需要同时维护C++和Cesium两端的代码,另外通信部分也较为复杂。因此最终我们放弃了这套方案,而是选择了一条根据OpenSceneGraph开源库完全重写一套自己的OSGB的TS库的方案,这个方案的显然是最直观的方案,但也是成本最高的方案。

完成了这套库后,我们处理了InputStream和Buffer的兼容性,实现了在Web上和软件中可以同样逻辑打开OSGB并显示的方案。另外将来也可以进一步去升级渲染效果和直接对OSGB的顶点数据直接进行修改,大家可以简单看下加载的效果,可以发现虽然相比C++的OSGViewer来说加载速度略有下降,但考虑到可以直接在Web上加载和编辑,也可以叠加我们系列文章中提到的大气云层效果,最终呈现已经很让人满意了:

大家也可以直接下载GISBox体验一下效果:

GIS工具箱(GISBox)-免费的倾斜摄影OSGB/3Dtiles编辑转换发布平台

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cooper+隐含数+2元cooper

发现群里一个题,应该是几天前一个比赛的。作了一下午。 from Crypto.Util.number import * import os from hashlib import * from random import * p getPrime(512) q getPrime(512) n p*q m bytes_to_long(os.urandom(20)) x pow(m,p,n) y pow(m,q,n)with…

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过,上架后却一直无法被搜索到。打开后,再在 QQ 上下拉查看 “最近使用”,发现他出现一下又马上消失。 上线是按正常流程走的,开发、备案、审核,没有任何违规&#xf…

word 中长公式换行 / 对齐 | Mathtype 中长公式换行拆分 | latex 中长公式换行

注:本文为 “word 中长公式换行 / 对齐 | Mathtype 中长公式换行拆分 | latex 中长公式换行” 相关专题文章合辑。 未整理去重。 “公式较长时最好在等号 “=” 处转行,如难实现,则可在+、-、、 运算符号处…

【优选算法 — 滑动窗口】串联所有单词的子串 最小覆盖子串

串联所有单词的子串 串联所有单词的子串 题目描述 题目解析 算法原理 以示例一为例,一定要记得,words中的每一个字符串长度相同,所以我们可以根据 words 中的每一个字符串的长度length,将 s 这个字符串以 length 个为一组来…

了解 Solon MVC 的参数注入规则

关于 Solon MVC 参数注入,主要尊守以下基本规则: 参数名与请求数据名一一对应。当对上不上时,会采用整体数据注入(如果接收的是实体)参数名与请求数据同名时,又想整体注入(如果接收的是实体&am…

[SpB]如何开始使用 Spring Boot?

如何开始使用 Spring Boot? Spring Boot 简化了 Java 项目开发,你只需要专注于业务逻辑,底层的很多配置和功能由 Spring Boot 自动帮你处理。下面是你如何快速上手 Spring Boot 的步骤,以及如何通过 IDEA 了解 Spring Boot 的功能…

vue如何实现组件切换

一、使用条件渲染 (v-if) <template><div><button click"currentView ComponentA">Show Component A</button><button click"currentView ComponentB">Show Component B</button><component-a v-if"curren…

WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等

SQL注入课程体系&#xff1a; 1、数据库注入-access mysql mssql oracle mongodb postgresql 2、数据类型注入-数字型 字符型 搜索型 加密型&#xff08;base64 json等&#xff09; 3、提交方式注入-get post cookie http头等 4、查询方式注入-查询 增加 删除 更新 堆叠等 …

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕&#xff1a;printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾&#xff1a; VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序C语言概念之旅&#xff1a;解锁关…

SHELL(4)脚本与用户交互以及if条件判断

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

Springboot集成ElasticSearch实现minio文件内容全文检索

一、docker安装Elasticsearch &#xff08;1&#xff09;springboot和Elasticsearch的版本对应关系如下&#xff0c;请看版本对应&#xff1a; 注意安装对应版本&#xff0c;否则可能会出现一些未知的错误。 &#xff08;2&#xff09;拉取镜像 docker pull elasticsearch:7…

部分利用oracle数据字典查询对应信息的语句。

查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user_role_privs; 查看当前用户的系统权限和表级权限 SQL>select * from user_sys_privs; SQL>select * from user_tab_privs; …

#Ts篇: ts学习再梳理

ts类型梳理 类型声明的写法&#xff0c;一律为在标识符后面添加“冒号 类型”。函数参数和返回值&#xff0c;也是这样来声明类型。 function toString(num: number): string {return String(num); }上面示例中&#xff0c;函数toString()的参数num的类型是number。参数列表…

使用chrome 访问虚拟机Apache2 的默认页面,出现了ERR_ADDRESS_UNREACHABLE这个鸟问题

本地环境 主机MacOs Sequoia 15.1虚拟机Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659)虚拟机-操作系统Ubuntu 22.04 服务器版本 最小安装 开发环境 编辑器编译器调试工具数据库http服务web开发防火墙Vim9Gcc13Gdb14Mysql8Apache2Php8.3Iptables 第一坑 数…

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…

【工控】线扫相机小结 第三篇

海康软件更新 目前使用的是 MVS_STD_4.3.2_240705.exe &#xff0c;最新的已经到4.4了。 一个大的变动 在上一篇中我们提到一个问题&#xff1a; 需要注意的是&#xff0c;我们必须先设置 TriggerSelector 是 “FrameBurstStart” 还是 “LineStart” 再设置TriggerMode 是 …

零基础利用实战项目学会Pytorch

目录 pytorch简介 1.线性回归 2.数据类型 2.1数据类型检验 2.2Dimension0/Rank0 2.3 Dim1/Rank1 2.4 Dim2/Rank2 3.一些方法 4.Pytorch完成分类任务 4.1模型参数 4.2 前向传播 4.3训练以及验证 4.4 三行搞定&#xff01; 4.5 准确率 5、Pytorch完成回归任务 5.…

MySQL的游标和While循环的详细对比

MySQL游标和While循环的详细对比 在 MySQL 中&#xff0c;游标和 WHILE 循环是两种常用的处理结果集的机制。它们各自有不同的应用场景和特点。本文将详细对比这两种机制&#xff0c;并提供具体的示例代码和说明。 1. 游标&#xff08;Cursor&#xff09; 游标是一种数据库对…

【#IEEE独立出版、EI稳定检索##高录用 快见刊 稳检索#】2024健康大数据与智能医疗国际会议(ICHIH 2024,12月13-15日)

#IEEE独立出版、EI稳定检索# #往届快至会后3-4个月检索# #高录用 快见刊 稳检索# 2024健康大数据与智能医疗国际会议&#xff08;ICHIH 2024&#xff09; 2024 International Conference on Health Big Data and Intelligent Healthcare 重要信息 大会官网&#xff1a;ww…

C++网络编程之SSL/TLS加密通信

概述 在互联网时代&#xff0c;数据的安全性变得尤为重要。随着网络安全威胁的不断增加&#xff0c;确保信息传输过程中的机密性、完整性和可用性成为了开发者必须考虑的关键因素。在C网络编程中&#xff0c;使用SSL/TLS加密通信是一种常见的做法。它允许客户端和服务器之间通过…