vue + Cesium 實現 3D 地圖水面效果詳解

一、引言

Cesium 是一個強大的開源 JavaScript 庫,用于創建基于 Web 的 3D 地理信息系統 (GIS) 應用程序。它提供了豐富的 API,可以實現各種復雜的地理可視化效果,包括地形渲染、建筑物建模、矢量數據顯示等。本文將詳細介紹如何使用 Cesium 實現 3D 地圖中的水面效果,包括水面材質的配置、動畫效果的實現以及性能優化。

二、Cesium 基礎與水面效果原理

2.1 Cesium 基礎概念

  • Viewer:Cesium 的核心組件,負責管理整個地圖視圖和交互
  • Primitive:Cesium 中渲染的基本單位,用于組織和渲染幾何圖形
  • Geometry:定義幾何形狀,如點、線、面等
  • Appearance:定義幾何圖形的外觀,包括材質和著色方式
  • Material:定義物體表面的視覺特性,如顏色、光澤等

2.2 水面效果原理

Cesium 中的水面效果主要通過以下技術實現:

  • 使用PolygonGeometry創建水面區域
  • 應用內置的 "Water" 材質模擬水面反射和折射
  • 通過法線貼圖和動畫參數實現水面波浪效果
  • 調整頻率、振幅和速度參數控制波浪形態和流動效果

三、實現 3D 地圖水面效果的代碼解析

下面是實現 Cesium 3D 地圖水面效果的核心代碼:

<template><div id="cesiumContainer" style="width: 100%; height: 100vh"></div>
</template><script>
import initMap from '@/config/initMap.js';
import { mapConfig } from '@/config/mapConfig';
export default {data() {return {viewer: null,waterEntity: null,};},mounted() {// 初始化地圖并設置初始視圖this.viewer = initMap(mapConfig.gaode.url3, true);this.drawWater();this.viewer.scene.globe.depthTestAgainstTerrain = false;this.viewer.camera.setView({destination: Cesium.Cartesian3.fromDegrees(118.006, 39.7128, 150000),});},methods: {// 創建水面效果drawWater() {this.viewer.scene.primitives.add(new Cesium.Primitive({geometryInstances: new Cesium.GeometryInstance({geometry: new Cesium.PolygonGeometry({polygonHierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray([// 定義水面多邊形的頂點坐標117.18714141845703, 39.377288818359375,117.172721862792957, 39.345016479492188,117.18164825439453, 39.303817749023438,117.25855255126953, 39.2962646484375,117.25855255126953, 39.366302490234375,117.18714141845703, 39.377288818359375,])),vertexFormat: Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT,}),}),appearance: new Cesium.EllipsoidSurfaceAppearance({aboveGround: true,material: new Cesium.Material({fabric: {type: 'Water',uniforms: {normalMap: Cesium.buildModuleUrl('Assets/Textures/waterNormals.jpg'),frequency: 1000.0,animationSpeed: 0.01,amplitude: 10,},},}),}),show: true,}));},// 設置初始視角setInitialView() {const center = Cesium.Cartesian3.fromDegrees(116.39, 39.9, 1000);const heading = Cesium.Math.toRadians(1110);const pitch = Cesium.Math.toRadians(-20);this.viewer.camera.setView({destination: center,orientation: {heading: heading,pitch: pitch,roll: 0,},});},},beforeDestroy() {// 清理資源,防止內存泄漏if (this.waterEntity) {this.viewer.entities.remove(this.waterEntity);}if (this.viewer) {this.viewer.destroy();}},
};
</script><style lang="scss" scoped>
#cesiumContainer {width: 100%;height: 100vh;touch-action: none;
}
</style>

3.1 代碼關鍵部分解析

3.1.1 初始化與地圖設置
mounted() {// 初始化地圖,使用高德地圖3D服務this.viewer = initMap(mapConfig.gaode.url3, true);this.drawWater(); // 繪制水面// 設置地形深度測試,影響水面與地形的交互this.viewer.scene.globe.depthTestAgainstTerrain = false;// 設置初始相機位置和高度this.viewer.camera.setView({destination: Cesium.Cartesian3.fromDegrees(118.006, 39.7128, 150000),});
},
3.1.2 水面效果實現
drawWater() {this.viewer.scene.primitives.add(new Cesium.Primitive({geometryInstances: new Cesium.GeometryInstance({geometry: new Cesium.PolygonGeometry({// 定義水面多邊形區域polygonHierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray([...])),vertexFormat: Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT,}),}),appearance: new Cesium.EllipsoidSurfaceAppearance({aboveGround: true,material: new Cesium.Material({fabric: {type: 'Water', // 使用內置水面材質uniforms: {// 水面材質參數配置normalMap: Cesium.buildModuleUrl('Assets/Textures/waterNormals.jpg'),frequency: 1000.0, // 波浪頻率animationSpeed: 0.01, // 波浪動畫速度amplitude: 10, // 波浪振幅},},}),}),show: true,}));
},
3.1.3 資源清理
beforeDestroy() {// 組件銷毀前清理Cesium資源if (this.waterEntity) {this.viewer.entities.remove(this.waterEntity);}if (this.viewer) {this.viewer.destroy(); // 釋放查看器資源}
},

四、水面效果參數調優

Cesium 的水面效果通過多個參數控制,合理調整這些參數可以獲得不同的水面效果:

4.1 主要參數說明

  • normalMap:法線貼圖,控制水面的波浪形態
  • frequency:頻率,控制波紋的緊密程度,值越大波紋越密集
  • animationSpeed:動畫速度,控制水面流動的速度
  • amplitude:振幅,控制波浪的高度,值越大波浪越明顯

4.2 參數調優建議

  • 對于平靜的湖泊,可以使用較低的 frequency (500-1000) 和 amplitude (5-10)
  • 對于海洋效果,可以使用較高的 frequency (1500-2000) 和 amplitude (15-30)
  • animationSpeed 通常在 0.005-0.02 之間調整,過大的值會使水面看起來不自然

五、性能優化與注意事項

5.1 性能優化

  • 復雜的水面效果會影響性能,特別是在移動設備上
  • 可以通過降低 frequency 和 amplitude 值來提高性能
  • 對于大面積水域,可以考慮將水域分割成多個較小的區域

5.2 注意事項

  • depthTestAgainstTerrain屬性會影響水面與地形的交互,開啟后可能導致水面在某些視角下不可見
  • 確保在組件銷毀時正確清理 Cesium 資源,避免內存泄漏
  • 水面效果在不同的 Cesium 版本中可能有差異,建議查看對應版本的文檔

六、總結

通過本文的介紹,我們了解了如何使用 Cesium 實現 3D 地圖中的水面效果。主要步驟包括初始化地圖、創建水面多邊形、應用水面材質以及設置動畫效果。通過調整材質參數,可以模擬不同類型的水體,從平靜的湖泊到波濤洶涌的海洋。同時,我們也提到了性能優化和資源管理的重要性,這些都是開發高質量 Cesium 應用的關鍵因素。

希望本文對您理解和使用 Cesium 實現水面效果有所幫助,歡迎在評論區分享您的經驗和問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91700.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

統信 UOS 運行 Windows 應用新利器!彩虹虛擬化軟件 V3.2 全新上線,限時30天免費體驗

原文鏈接&#xff1a;統信 UOS 運行 Windows 應用新利器&#xff01;彩虹虛擬化軟件 V3.2 全新上線&#xff0c;限時30天免費體驗 在國產操作系統逐漸普及的今天&#xff0c;許多用戶仍面臨一個實際問題——一些辦公軟件或行業工具仍然僅支持 Windows 系統。對于已全面部署統信…

Vue中使用vue-3d-model實現加載3D模型預覽展示

場景 要實現在頁面中簡單快速的加載3D模型用于產品展示。 實現效果如下&#xff1a; 注&#xff1a; 博客&#xff1a; 霸道流氓氣質-CSDN博客 實現 3D模型技術方案對比 這里用于快速展示簡單3d模型。 3D模型文件下載 可下載的網站較多&#xff0c;比如&#xff1a; Sk…

GaussDB join 連接的用法

1 join 連接的作用join 連接用于把來自兩個或多個表的行結合起來&#xff0c;基于這些表之間的共同字段。 最常見的 join 類型&#xff1a;inner join&#xff08;簡單的 join&#xff09;。 inner join 從多個表中返回滿足 join條件的所有行。2 示例數據讓我們看看選自 "…

GitHub開源輕量級語音模型 Vui:重塑邊緣智能語音交互的未來

前言 今天將深入解析一款顛覆性開源語音模型——Vui&#xff08;來自 Fluxions-AI 項目&#xff09;。它正以“輕量化”為矛&#xff0c;刺破傳統語音模型高耗能的壁壘&#xff0c;讓智能語音無處不在。 GitHub&#xff1a;https://github.com/fluxions-ai/vuihuggingface&am…

用aws下載NOAA的MB文件

安裝aws下載某航次MB文件 安裝aws curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install下載對應航次數據 aws s3 cp s3://noaa-wcsd-pds/data/raw/Atlantis/AT26-09 /home/xxx/…

Kubernetes (k8s)、Rancher 和 Podman 的異同點分析

1. Kubernetes (k8s) 類型&#xff1a;容器編排系統。功能&#xff1a; 自動化部署、擴展和管理容器化應用。支持跨多臺主機的容器編排。提供服務發現、負載均衡、滾動更新等功能。 架構&#xff1a;基于 Master-Node 架構&#xff0c;Master 負責調度和管理&#xff0c;Node 運…

71 模塊編程之新增一個字符設備

前言這個 主要是 最開始的時候了解驅動的時候, 看到的一系列的 case, 這里 來大致剖析一下 相關的道理這些模塊 是怎么和內核交互的, 內核的這些業務是怎么實現的 這里主要是一個模塊來注冊了一個字符設備 然后這個字符設備 可讀可寫, 基于的是分配的一段空間 測試用例測試模塊…

小眾創新方向!多傳感器融合與視覺慣性導航,定位精度和效率大幅提升!

多傳感器融合與視覺慣性導航技術&#xff08;VINS&#xff09;取得了顯著進展。近期&#xff0c;研究人員通過優化視覺與慣性傳感器數據的融合算法、引入深度學習技術以及改進系統架構&#xff0c;顯著提升了VINS在復雜環境下的定位精度和魯棒性。基于深度學習的特征提取方法能…

超簡單linux上部署Apache

1.Apache是什么&#xff1f;Apache 是世界上最流行的 ??開源Web服務器軟件??&#xff0c;由 Apache 軟件基金會維護。??主要功能??&#xff1a;接收客戶端&#xff08;如瀏覽器&#xff09;的HTTP請求&#xff0c;返回網頁、圖片等靜態/動態資源。??特點??&#xf…

前端 SSE 實戰應用:用最簡單的方式實現實時推送

前端 SSE 實戰應用&#xff1a;用最簡單的方式實現實時推送 &#x1f4cc; 點贊收藏關注不迷路&#xff01; 在前端項目中&#xff0c;我們常聽到“實時通信”這個需求 —— 聊天、進度、狀態變化、系統消息。 但提到實時&#xff0c;大家首先想到的是 WebSocket&#xff0c;對…

第16章 基于AB實驗的增長實踐——驗證想法:AB實驗實踐

?一、AB實驗全流程框架?實驗分為5個核心環節&#xff1a;實驗假設? → 實驗設計? →實驗運行? → 實驗分析? → 實驗決策??二、各環節核心要點詳解??1. 實驗假設??原則?&#xff1a;目標性、可歸因、可復用&#xff08;前兩者必選&#xff09;?&#xff08;1&…

解決【軟件安裝路徑】失敗的方法

出現問題上圖所示問題為&#xff1a;你的臨時目錄路徑中包含 Unicode 字符&#xff0c;這可能會導致安裝損壞。請參閱故障排除指南以獲取解決方法。出現問題的原因&#xff1a;添加路徑下存在中文&#xff0c;導致系統文件無法識別。解決方法步驟一&#xff1a;創建Temp(臨時文…

FreeRTOS學習筆記——總覽

考慮到RTOS能夠提升單片機開發能力&#xff0c;也是開發復雜任務的必經之路&#xff0c;還是有必要學習的。 FreeRTOS教程多&#xff0c;免費開源&#xff0c;是個不錯的選擇。后續可以考慮繼續學習RT-Thread等。 參考1&#xff1a;FreeRTOS(教程非常詳細&#xff09;——作者&…

Clip微調系列:《coOp: learning to prompt for vision-language models》

論文鏈接&#xff1a;arxiv.org/pdf/2109.01134v1 推薦視頻(clip_coop的代碼邏輯講解&#xff0c;代碼簡單&#xff0c;有助于理解)&#xff1a;CLIP和CoOp工作的簡單Pytorch復現和理解_嗶哩嗶哩_bilibili 其他參考鏈接&#xff1a;CoOp - CLIP 自適應Prompt工程 【一】_coop…

[論文閱讀] 人工智能 + 軟件工程 | 開源軟件中的GenAI自白:開發者如何用、項目如何管、代碼質量受何影響?

開源軟件中的GenAI自白&#xff1a;開發者如何用、項目如何管、代碼質量受何影響&#xff1f; 論文&#xff1a;Self-Admitted GenAI Usage in Open-Source SoftwarearXiv:2507.10422 Self-Admitted GenAI Usage in Open-Source Software Tao Xiao, Youmei Fan, Fabio Calefato…

AI繪畫版權問題全解析:你的作品真的屬于你嗎?

AI繪畫版權問題全解析:你的作品真的屬于你嗎? 關鍵詞:AI繪畫、版權歸屬、生成式AI、訓練數據、獨創性、法律合規、知識產權 摘要:當你用MidJourney生成一張“賽博朋克風格的熊貓”,或用Stable Diffusion畫出“梵高筆觸的星空咖啡館”時,你是否想過:這張圖的版權屬于你、…

深入理解Linux文件I/O:系統調用與標志位應用

目錄 一、引入 二、標志位 1、什么是標志位&#xff1f; 2、標志位傳遞示例 輸出結果分析 關鍵點解釋 三、文件描述符(File Descriptor)&#xff08;先大概了解&#xff09; 四、接口介紹&#xff1a;open()函數 1、命令查看 2、頭文件 3、函數原型 4、參數說明 …

海康線掃相機通過采集卡的取圖設置

目錄 1、掃描高度小于65000行 1.1 軟觸發 1、采集卡設置項 2、相機設置項 1.2 硬觸發 1、采集卡設置項 2、相機設置項 2、掃描高度大于65000行 1.1 軟觸發 1、采集卡設置項 2、相機設置 1.2 硬觸發 1、采集卡設置項 2、相機設置 2.1 幀掃描 2.2 行掃描 3、注意…

InfluxDB 3與Apache Parquet:打造高性能時序數據存儲與分析解決方案

在當今數據驅動的時代&#xff0c;各行業產生的數據量呈爆炸式增長&#xff0c;如何高效存儲和管理海量數據成為企業和開發者面臨的重大挑戰。對于時序數據而言&#xff0c;其具有數據量大、寫入頻繁、查詢模式多樣等特點&#xff0c;對存儲系統的性能和效率提出了更高的要求。…

20250718-4-Kubernetes 應用程序生命周期管理-Pod對象:實現機制_筆記

一、Pod對象&#xfeff;&#xfeff;1. 資源共享實現機制1&#xff09;共享網絡&#xfeff;基本概念實現方式&#xff1a;通過將業務容器網絡加入到負責網絡的容器&#xff08;infra container&#xff09;實現網絡共享核心特點&#xff1a;共享網絡協議棧&#xff08;包括TC…