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

news2024/9/21 4:20:56

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.coloradmin.cn/o/1908403.html

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

相关文章

音频demo:将PCM数据与alaw、mulaw、g711数据的相互转换

1、README 前言 (截图来源:https://blog.csdn.net/u014470361/article/details/88837776) 我的理解: 首先需要知道的是u-law/a-law是用于脉冲编码的压缩/解压缩算法。而G.711是指在8KHz采样率(单声道)中,使用的u-law或…

uni-app 封装http请求

1.引言 前面一篇文章写了使用Pinia进行全局状态管理。 这篇文章主要介绍一下封装http请求,发送数据请求到服务端进行数据的获取。 感谢: 1.yudao-mall-uniapp: 芋道商城,基于 Vue Uniapp 实现,支持分销、拼团、砍价、秒杀、优…

搞不清啊?伦敦金与上海金区别是?

进入黄金市场的朋友,有可能会被各式各样的黄金交易品种带得眼花缭乱,其实各品种虽然都以黄金作为投资标的物,但是也是各有不同的,下面我们就来比较一下相似的投资品种——伦敦金和上海金。 首先在比较之前,我们要搞清楚…

计算机毕业设计Django+Vue.js考研推荐系统 考研分数线预测 中公考研爬虫 混合神经网络推荐算法 考研可视化 机器学习 深度学习 大数据毕业设计

Python数据分析与可视化期末项目报告 项目名称: 考研推荐系统数据分析与可视化 学 号: 姓 名: …

Spire.PDF for .NET【文档操作】演示:以特在 C# 中创建 PDF/A-1a 文件

PDF/A-1 标准为 PDF 文件指定了两个符合性级别:PDF/A-1a(符合 A 级)和 PDF/A-1b(符合 B 级)。使用 Spire.PDF,您可以轻松创建 PDF/A-1a 和 PDF/A-1b 文件。本文演示了如何使用 Spire.PDF 创建 PDF/A-1a 文件…

MySQL第三次练习

作业三 一 先创建DB abc,创建table student 1、插入一条记录 2、添加多条记录 3、添加部分记录 4、加0.5 5、删除成绩为空的记录 二 1、创建一个用户test1使他只能本地登录拥有查询student表的权限。 2、查询用户test1的权限。 3、删除用户test1. 全在一张图上…

刀客网源码账号合租平台

最新租号平台系统源码,支持单独租用或合租使用 这是一款租号平台源码,采用常见的租号模式。 平台的主要功能如下: 支持单独租用或采用合租模式,采用易支付通用接口进行支付,添加邀请返利功能,以便站长更好…

ubuntu22.04搭建mysql5.7

1.1 下载mysql安装包 MySQL下载地址:MySQL :: Download MySQL Community Server (Archived Versions) #下载wget https://cdn.mysql.com/archives/mysql-5.7/mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar#解压tar -xvf ./mysql-server_5.7.29-1ubuntu18…

排序学习笔记

1.什么是排序 1.1排序的概念 概念:排序的概念其实非常简单,本质上就是将一堆记录按照从大到小(降序),从小到大(升序)来进行排序。我们日常生活中每天都有着不同的排序,比如年龄大小排序,身高的排序等等。 稳定性&am…

如何把已经上传到gitlab的代码或者文件夹从git上删掉

有小伙伴不小心把缓存文件上传到了git,跑来问我,要怎么把这些文件给删掉,这里一共有两种方式, 先说第一种,通过命令删除,终端进入存在这个缓存文件的目录,执行命令ls,可以看到确实有…

STM32学习历程(day5)

EXTI外部中断 中断 中断就是在主程序运行过程中 出现了特定的中断触发条件(中断源),CPU会暂停当前的程序,去处理中断程序 处理完会返回被暂停的位置 继续运行原来的程序。 中断优先级 当有多个中断源同时申请中断时 CPU会根据…

如何安全隐藏IP地址,防止网络攻击?

当您想在互联网上保持隐私或匿名时,您应该做的第一件事就是隐藏您的 IP 地址。您的 IP 地址很容易被追踪到您,并被用来了解您的位置。下面的文章将教您如何隐藏自己,不让任何试图跟踪您的活动的人发现。 什么是 IP 地址? 首先&am…

初中生物知识点总结(人教版)

第一章 认识生物 一、 生物的特征: 1. 生物的生活需要营养 2. 生物能进行呼吸 3. 生物能排出身体内产生的废物 4. 生物能对外界的刺激做出反应 5. 生物能生长和繁殖 除病毒以外,生物都是由细胞构…

python中getattr/setattr/hasattr/delattr函数都是干什么的?

目录 1、getattr:动态获取属性 🔍 1.1 动态获取属性 1.2 默认值处理技巧 1.3 实战案例:配置文件动态加载 2、setattr:动态设置属性 🛠 2.1 修改对象属性 2.2 新增属性场景 2.3 应用场景:类的动态配置…

零基础也能成为产品册设计高手

​在当今数字化时代,产品册设计已成为企业营销的重要手段之一。过去,人们认为只有专业人士才能设计出精美的产品册,然而,随着设计工具的普及和在线学习资源的丰富,零基础的你也能成为产品册设计高手。本文将带你走进这…

一文清晰了解HTML

有这样一个txt记事本文件和一张图片&#xff1a; txt文本内容是这样的&#xff1a; <html><head><title>HTML学习</title></head><body><h1>hello HTML</h1><img src"高清修复.png"/></body> </html…

泫雅甜蜜官宣爱情开花

【标题】泫雅甜蜜官宣&#xff1a;爱情花开&#xff0c;携手龙俊亨共赴婚姻殿堂&#xff0c;邀您共鉴幸福时刻&#xff01;在这个金秋送爽、爱意弥漫的季节里&#xff0c;韩国娱乐圈迎来了一则振奋的消息——我们的“小野马”泫雅&#xff0c;正式宣布了她人生中的重大决定&…

MyBatis是如何分页的及原理

MyBatis 是一种持久层框架&#xff0c;支持通过配置文件和注解将 SQL 映射为 Java 对象。在实际开发中&#xff0c;查询数据时经常需要进行分页处理。 MyBatis 也提供了支持分页的方案&#xff0c;其主要思路是使用 Limit 偏移量和限制个数&#xff0c;来获取指定数量的数据。下…

全网视频下载之IDM下载安装,软破解

全网视频下载之IDM下载安装&#xff0c;软破解 介绍![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c94f612f7a8845c8a649f74f6b18fd70.png)下载安装配置浏览器Google浏览器Ddge浏览器 界面如何下载不破解如何重复使用总结 介绍 今天给大家分享一个更加简便的全网视…

【Python】已解决:FileNotFoundError: [Errno 2] No such file or directory: ‘D:\1. PDF’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;FileNotFoundError: [Errno 2] No such file or directory: ‘D:\1. PDF’ 一、分析问题背景 在Python编程中&#xff0c;当你尝试打开一个不存在的文件时&…