three-tile 一个开源的轻量级三维瓦片库

three-tile 介绍

three-tile 是一个开源的轻量级三维瓦片库,它基于threejs使用typescript开发,提供一个三维地形模型,能轻松给你的应用增加三维瓦片地图。

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

源码:https://github.com/sxguojf/three-tile

示例:https://github.com/sxguojf/three-tile-example

1. three-tile是什么?

  • three-tile 是 webgis?不,它的gis功能很弱,仅提供了三维地图模型和地理坐标转换功能。
  • three-tile 是基于cesium、mapbox等的二次封装吗?不,它是基于 threejs 自主实现的。
  • three-tile 更像是游戏开发中的LOD地形,但它可以使用地图服务商提供的地形和影像瓦片数据渲染地图。
  • three-tile 的地图被封装为一个普通的 Mesh,能轻松添加进 threejs 应用中。
  • three-tile 的核心实际与地图无关,它就是一个LOD模型,地图只是其典型应用之一。

2. 开发初衷

  • 市面上的三维 webgis 框架不少,如 cesium、MapBox.gl 等,功能强大,但这些地图作为重量级框架,它包揽了三维场景、摄像机、模型、灯光等一切,想深度定制难度较大,另外,它们本身占用资源太多,功能一多速度难以满足需求。

  • 三维地形也是游戏引擎中的重要功能之一,但主流的游戏引擎地形数据要么随机生成,要么美工手工设计,地形制作工作量较大。当然,unity3d、unreal4等游戏引擎,也有一些插件可以导入真实地形,但通用性较差,操作复杂。

是否能将真实地图数据与游戏的三维地形结合,提供一个使用瓦片地图服务的轻量级三维地形模型? OK,这就是three-tile的开发初衷。

3. 3D开发技术选型

  • webgl: web下3D开发必备,但直接基于webgl开发很繁琐,选择一个3D引擎能大大节省开发时间。
  • threejs: 封装了webgl,使用简单,国内具有非常好的生态。
  • babylonjs: 封装了webgl,大厂出品,ts编写,支持webgpu,但国内生态不如threejs。
  • unity3d: 游戏引擎,可用C#、JavaScript开发,但主要用于游戏,web端支持较差。
  • unreal: 游戏引擎,主要用于游戏,只能做桌面版。

综合比较,如果开发web版的3d地图,选择threejs和babylon.js更加适合,考虑个人开发影响力太小,需要借助其它框架生态,那threejs是首选。

当然,如果确实有需求,我觉得用babylon或unity3d也可以考虑。目前还是使用threejs开发。

4. 典型应用场景

4.1 给现有应用增加地形

在threejs示例中,大部分简单应用使用一个平面作为地面,如果能把平面换为真实地形,立马增色不少:

在这里插入图片描述threejs中的傻鸟在这里插入图片描述加上地形,让它翱翔在青藏高原
three.js examples (threejs.org)three-tile demo (sxguojf.github.io)
在这里插入图片描述threejs中可爱的小房子在这里插入图片描述西安南二环找块工地放上去
three.js examples (threejs.org)three-tile demo (sxguojf.github.io)
在这里插入图片描述threejs中孤独的小兵兵在这里插入图片描述放到地图上执行任务
three.js examples (threejs.org)three-tile demo (sxguojf.github.io)
在这里插入图片描述threejs中平淡无奇的夕阳在这里插入图片描述加上地形才是它真正的效果
three.js examples (threejs.org)three-tile demo (sxguojf.github.io)

而这一切使用three-tile仅需三步:

  1. 定义地图数据源
  2. 创建地图模型
  3. 用地图替换原来的平面

4.2 简单的webgis

当然,你如果要把three-tile当做一个简单三维gis也未尝不可,地图模型可直接使用主流瓦片数据源,渲染出逼真的地形;提供地理坐标(经纬度海拔高度)到三维场景坐标的转换,将地图元素(模型、标签)叠加在指定位置;通过鼠标键盘控制摄像机,实现地图缩放、平移、旋转和漫游;内置mapbox、bing、goole、arcgis、天地图、高德、腾讯等瓦片地图支持,也可以自行扩展支持其它瓦片地图服务。

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

4.3 游戏开发

如果你想将three-tile用于游戏开发,也可以试试,它完美支持threejs内置的各种控制器,仅更换控制器,即可实现第一人称、飞行等游戏功能,在真实地图上开战效果应该不错。由于地图是实时下载的,如果对地图加载中的空白块不爽,可以通过调整地图的数据缓存和渲染缓冲区大小参数,以空间换时间缓解这个问题。

在这里插入图片描述第一人称射击在这里插入图片描述即时战略在这里插入图片描述模拟飞行
three-tile demothree-tile demothree-tile demo

4.4 数据可视化

目前,three-tile在生产环境的应用主要是数据可视化:

在这里插入图片描述三维卫星云图在这里插入图片描述风场动画
three-tile demo
在这里插入图片描述500hpa高度场在这里插入图片描述pm2.5体渲染
three-tile demo

在这里插入图片描述总之,three-tile仅提供一个地形Mesh,利用threejs的强大生态实现各种炫酷的效果。如果你是threejs开发者,值得一试。

5. 特点

  • 轻量级:地图以一个三维模型方式提供,使用它不会对已有程序架构产生任何影响。
  • 依赖少:整个框架仅有 threejs(R165)一个依赖。

  • 速度快:对资源占用做极致优化,核显也能轻松跑到 60FPS。

  • 使用简单:熟悉 threejs 基本上没有学习成本。

  • 扩展性强:数据、模型、纹理、材质、渲染过程均能根据自己需要扩展和替换。

6. 局限性

能力有限,three-tile目前还有一些短板,期待有兴趣的开发者参与。

  • 地图未使用球面坐标系:为了保持库的简洁,地图模型使用笛卡尔坐标,地球并不是个球,而是投影到了平面。

    为什么不做成球,一方面是为了开发简单,另一方面使用球面坐标系,threejs内置的大部分几何体、着色器都需要修改,如BoxGeometry,它的边不能是直线,而要与地球曲率相适应,threejs的生态完全不适用了。开始的开发计划,就是打算做个平面地图,毕竟从太空才能看出来地球是个球,但无法满足贪婪的用户需求,好吧,搞个伪球体把多余的部分遮住,远看像个球就行了。

  • 存在z-fight问题: 受计算精度影响,在远距离观察时,webgl分不清物体的前后遮挡,即存在让所有三维开发者头痛的z-fight问题。

    既想在数万公里看地球,又要贴地看清地面的小汽车,z-fight不可避免,虽然可以使用logarithmicDepthBuffer缓解,但这个缩放范围实在太大了,上万公里高空webgl已经无法分清你的模型距地0.1公里还是0.2公里,它会不停闪烁。能否参考cesium使用分段渲染的方式解决?但three-tile初衷是只是做一个模型,不涉及模型外的东西,如果z-fight确实对你的应用影响较大,那可以试试分段渲染。

  • 贴地功能未实现:three-tile最大的短板是贴地功能,目前贴地是使用射线法计算地形高度,但效率太低,线、面的贴地计算量太大无法完成。

    cesium使用深度缓冲区对模型进行剪裁实现,真是脑洞大开!我也尝试使用深度缓冲区使用着色器进行三维模型重建,但无奈未能成功。

  • 暂未做移动端匹配:要改的太多,暂没有精力。

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

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

相关文章

【TB作品】51单片机 Proteus仿真 00013红外proteus仿真循迹避障小车

实验报告:智能小车系统设计与实现 一、背景介绍 本实验旨在设计并实现一个基于STC89C52单片机控制的智能小车系统。该系统通过超声波传感器进行避障,通过红外接收器实现远程控制,同时具备循迹功能。整个系统的核心是单片机,它通…

YOLOv10改进 | 损失函数篇 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

一、本文介绍 本文给大家带来的是YOLOv10最新改进,为大家带来最近新提出的InnerIoU的内容同时用Inner的思想结合SIoU、WIoU、GIoU、DIoU、EIOU、CIoU等损失函数,形成 InnerIoU、InnerSIoU、InnerWIoU、等新版本损失函数,同时还结合了Focus和…

LeetCode42(接雨水)[三种解法:理解动态规划,双指针,单调栈]

接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 这是一道困难题,难度确实有点层次.我们先来朴素思想走一波. 要求能接多少雨水,我们可以具化到每个硅谷,每个硅谷能存多少雨水,那么答案就是每个…

PDA:Prompt-based Distribution Alignment for Unsupervised Domain Adaptation

文章汇总 式中, y s y^s ys表示源域数据的one-hot ground-truth, K K K为类数, w i w_i wi​和 z ~ s \tilde{z}_s z~s​分别表示源域经过提示调优的最终文本表示和最终图像表示的第 i i i类。 同理,为了进一步利用目标领域的数据…

防火墙详解(USG6000V)

0、防火墙组网模式 防火墙能够工作在三种模式下分别是路由模式、透明模式、旁路检测模式、混合模式 0.1、路由模式 路由模式:防火墙全部以第三层对外连接,即接口具有IP 地址。一般都用在防火墙是边界的场景下 防火墙需要的部署/配置: 接…

10、DDD分层架构

微服务架构模型有很多种,例如洋葱架构、CQRS和六边形架构等。虽然这些架构模式提出的时代和背景不同,但其核心理念都是为了设计出“高内聚,低耦合”的微服务,轻松实现微服务的架构演进。DDD分层架构的出现,使微服务的架…

【uniapp-ios】App端与webview端相互通信的方法以及注意事项

前言 在开发中,使用uniapp开发的项目开发效率是极高的,使用一套代码就能够同时在多端上线,像笔者之前写过的使用Flutter端和webview端之间的相互通信方法和问题,这种方式本质上实际上是h5和h5之间的通信,网上有非常多…

物联网实训室建设可行性报告

一、建设物联网实训室的目的和意义 随着信息技术的快速发展,物联网(IoT)已成为推动社会进步和经济发展的关键技术之一。物联网技术的集成应用,不仅能够提高生产效率,还能促进智慧城市、智能家居、智能农业等多个领域的…

python04——类(基础new)

类其实也是一种封装的思想,类就是把变量、方法等封装在一起,然后可以通过不同的实例化对其进行调用操作。 1.类的定义 class 类名: 变量a def __init__ (self,参数2,参数2...):初始化函数!!&…

简单实现联系表单Contact Form自动发送邮件

如何实现简单Contact Form自动邮件功能?怎样简单设置? 联系表单不仅是访客与网站所有者沟通的桥梁,还可以收集潜在客户的信息,从而推动业务的发展。AokSend将介绍如何简单实现一个联系表单,自动发送邮件的过程&#x…

【游戏客户端】大话slg玩法架构(一)滚动基类

【游戏客户端】大话slg玩法架构(一)滚动基类 大家好,我是Lampard家杰~~ 今天我们兑现诺言,给大家分享SLG玩法的实现j架构,关于SLG玩法的介绍可以参考这篇上一篇文章:【游戏客户端】制作率土之滨Like玩法 PS…

机器学习统计学基础 - 最大似然估计

最大似然估计(Maximum Likelihood Estimation, MLE)是一种常用的参数估计方法,其基本原理是通过最大化观测数据出现的概率来寻找最优的参数估计值。具体来说,最大似然估计的核心思想是利用已知的样本结果,反推最有可能…

binutils ifunc 流程图

上图是x86 binutils 的流程图。 函数说明_bfd_x86_elf_link_hash_table_createInit local STT_GNU_IFUNC symbol hash.elf_x86_64_check_relocsAdd support for handling STT_GNU_IFUNC symbols_bfd_elf_x86_get_local_sym_hashFind and/or create a hash entry for local sym…

Leetcode—97. 交错字符串【中等】

2024每日刷题&#xff08;140&#xff09; Leetcode—97. 交错字符串 2d动规实现代码 class Solution { public:bool isInterleave(string s1, string s2, string s3) {int m s1.length();int n s2.length();int len s3.length();if(m n ! len) {return false;}vector<…

SpringBoot日常:封装rabbitmq starter组件

文章目录 逻辑实现RabbitExchangeEnumRabbitConfigRabbitModuleInfoRabbitModuleInitializerRabbitPropertiesRabbitProducerManagerPOM.xmlspring.factories 功能测试application.yml配置生产者&#xff1a;消费者&#xff1a;测试结果&#xff1a;总结 本章内容主要介绍编写一…

stm32 USB CDC类虚拟串口初体验

1. 目标 本文介绍CubeMX生成 USB CDC类虚拟串口工程的操作步骤。 2. 配置流程 时钟配置 usb外设需要48M时钟输入 stm32405使用外部时钟源HSE,否则配不出来48M时钟stm32h750内部有一个48M时钟 stm32f405时钟配置 stm32h750时钟配置 Connectivity ->USB_OTG_FS 和 Connect…

C++初阶:从C过渡到C++的入门基础

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ C发展历史 C的起源可以追溯到1979年&#xff0c;当时BjarneStroustrup(本贾尼斯特劳斯特卢普&#xff0c;这个翻译的名字不同的地⽅可能有差异)在⻉尔实验室从事计算机科学和软件⼯程的研究⼯作。⾯对项⽬中复…

JavaDS —— 顺序表ArrayList

顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。在物理和逻辑上都是连续的。 模拟实现 下面是我们要自己模拟实现的方法&#xff1a; 首先我们要创建一个顺序表&#xff0c;顺序表…

关于Mars3d的入门

关于Mars3d的入门 一. 创建地球&#xff0c;加载瓦片图层二 矢量图层2.1 常用矢量图层2.1.1 GraphicLayer2.1.2 GeoJsonLayer 2.2 矢量图层的点击事件 三 矢量数据四 事件机制 一. 创建地球&#xff0c;加载瓦片图层 // 1. 创建地球let map new mars3d.Map("mars3dContai…

从零开始做题:My_lllp

题目 给出一张png图片 解题 ┌──(holyeyes㉿kali2023)-[~/Misc/题目/zulu/My_lllp] └─$ python2 lsb.py extract my_lllp.png out.txt my_lllp [] Image size: 1080x1079 pixels. [] Written extracted data to out.txt. ┌──(holyeyes㉿kali2023)-[~/Misc/题目/zul…