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.pswp.cn/web/42148.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42148.shtml
英文地址,請注明出處:http://en.pswp.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 地址。一般都用在防火墻是邊界的場景下 防火墻需要的部署/配置: 接…

【入門篇】STM32尋址范圍(更新中)

寫在前面 STM32的尋址范圍涉及存儲器映射和32位地址線的使用。并且STM32的內存地址訪問是按字節編址的,即每個存儲單元是1字節(8位)。 一、尋址大小與范圍 地址線根數 地址編號(二進制) 地址編號數(即內存大小) <

實現基于Elasticsearch的搜索服務

實現基于Elasticsearch的搜索服務 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. Elasticsearch簡介 Elasticsearch是一個開源的分布式搜索引擎&#xff0c;提供強大的全文搜索和分析功能。本文…

10、DDD分層架構

微服務架構模型有很多種&#xff0c;例如洋蔥架構、CQRS和六邊形架構等。雖然這些架構模式提出的時代和背景不同&#xff0c;但其核心理念都是為了設計出“高內聚&#xff0c;低耦合”的微服務&#xff0c;輕松實現微服務的架構演進。DDD分層架構的出現&#xff0c;使微服務的架…

什么是ThreadLocal以及內存泄漏問題、hash沖突問題

ThreadLocal是什么 ThreadLocal類用來提供線程內部的局部變量 它主要有三大特性&#xff1a; 線程安全: 在多線程并發的場景下保證線程安全傳遞數據&#xff1a;通過ThreadLocal在同一線程傳遞公共變量線程隔離&#xff1a;每個線程的變量都是獨立的&#xff0c;不會互相影響…

這次讓我們從幾個點認識一下Mysql的Innodb

MySQL 的 InnoDB 存儲引擎是 MySQL 默認和最常用的存儲引擎之一。它主要關注的是高可靠性、性能以及完整的事務支持。以下是對 InnoDB 存儲引擎的詳細介紹&#xff1a; 1. 數據庫特性 1.1 事務支持 InnoDB 是完全支持事務的存儲引擎&#xff0c;支持四種主要的事務隔離級別&…

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

前言 在開發中&#xff0c;使用uniapp開發的項目開發效率是極高的&#xff0c;使用一套代碼就能夠同時在多端上線&#xff0c;像筆者之前寫過的使用Flutter端和webview端之間的相互通信方法和問題&#xff0c;這種方式本質上實際上是h5和h5之間的通信&#xff0c;網上有非常多…

ios身份證實名認證接口開發示例助力電商物流實名認證

為了更好的利用貨車資源&#xff0c;也方便企業正常的運送貨物&#xff0c;“互聯網電商”平臺可謂風起云涌。貨車司機和有發貨需求的人們可以在物流平臺注冊&#xff0c;貨車司機接單為有運送需求的用戶提供有償貨運服務。那么&#xff0c;如何讓企業放心的將貨物安心的交予貨…

物聯網實訓室建設可行性報告

一、建設物聯網實訓室的目的和意義 隨著信息技術的快速發展&#xff0c;物聯網&#xff08;IoT&#xff09;已成為推動社會進步和經濟發展的關鍵技術之一。物聯網技術的集成應用&#xff0c;不僅能夠提高生產效率&#xff0c;還能促進智慧城市、智能家居、智能農業等多個領域的…

python04——類(基礎new)

類其實也是一種封裝的思想&#xff0c;類就是把變量、方法等封裝在一起&#xff0c;然后可以通過不同的實例化對其進行調用操作。 1.類的定義 class 類名&#xff1a; 變量a def __init__ (self,參數2&#xff0c;參數2...)&#xff1a;初始化函數&#xff01;&#xff01;&…

vivado DELAY_VALUE_XPHY、DIFF_TERM

延遲_值_XPHY PORT對象上的DELAY_VALUE_XPHY屬性指定要添加的延遲量 Versal XPHY邏輯接口的輸入或輸出路徑。在的早期階段 opt_design在重新生成高級I/O向導IP時 DELAY_VALUE_XPHY值將從PORT復制到的XPHY實例上 輸入或輸出路徑。Vivado設計套件中存在DRCs&#xff0c;以確保 DE…

簡單實現聯系表單Contact Form自動發送郵件

如何實現簡單Contact Form自動郵件功能&#xff1f;怎樣簡單設置&#xff1f; 聯系表單不僅是訪客與網站所有者溝通的橋梁&#xff0c;還可以收集潛在客戶的信息&#xff0c;從而推動業務的發展。AokSend將介紹如何簡單實現一個聯系表單&#xff0c;自動發送郵件的過程&#x…

java Collections類介紹

Java 的 java.util.Collections 類提供了一組靜態方法&#xff0c;用于操作或返回集合&#xff08;如列表、集合和映射&#xff09;。Collections 類是一個實用工具類&#xff0c;旨在為集合提供便捷的算法和操作。以下是對 Collections 類及其常用方法的介紹。 常用方法總結 …

【游戲客戶端】大話slg玩法架構(一)滾動基類

【游戲客戶端】大話slg玩法架構&#xff08;一&#xff09;滾動基類 大家好&#xff0c;我是Lampard家杰~~ 今天我們兌現諾言&#xff0c;給大家分享SLG玩法的實現j架構&#xff0c;關于SLG玩法的介紹可以參考這篇上一篇文章&#xff1a;【游戲客戶端】制作率土之濱Like玩法 PS…

保險理論與實踐

《保險理論與實踐》是由中國保險學會主辦的學術集刊&#xff0c;于2016年1月正式創辦&#xff0c;致力于發表權威、嚴謹、高質量的理論研究、政策研究和實務研究成果&#xff0c;強調學術性與政策性、理論性與實踐性的有機結合。本刊由中國金融出版社公開出版&#xff0c;每月下…

postmessage()在同一域名下,傳遞消息給另一個頁面

這里是同域名下&#xff0c;getmessage.html&#xff08;發送信息&#xff09;傳遞消息給index.html&#xff08;收到信息&#xff0c;并回傳收到信息&#xff09; index.html頁面 <!DOCTYPE html> <html><head><meta http-equiv"content-type"…