一、引言

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…