Cesium快速入门到精通系列教程二:添加地形与添加自定义地形、相机控制

article/2025/7/18 15:50:22

一、添加地形与添加自定义地形

在 Cesium 1.93 中添加地形可以通过配置terrainProvider实现。Cesium 支持多种地形数据源,包括 Cesium Ion 提供的全球地形、自定义地形服务以及开源地形数据。下面介绍几种常见的添加地形的方法:

使用 Cesium Ion 全球地形服务

这是最简单的方式,需要一个 Cesium Ion 账户和访问令牌:

// 设置Cesium Ion访问令牌
Cesium.Ion.defaultAccessToken = '你的Cesium Ion令牌';// 初始化Viewer并启用全球地形
const viewer = new Cesium.Viewer('cesiumContainer', {terrainProvider: Cesium.createWorldTerrain({requestVertexNormals: true, // 启用地形光照requestWaterMask: true      // 启用水面效果}),baseLayerPicker: false, // 可选:禁用默认图层选择器
});

添加自定义地形

1、从地理空间数据云下载数据:

数据资源->公开数据->DEM 数字高程数据

2、从cesiumlab下载工具进行数据转换:

安装下载的工具,比如当前版本cesiumlab4_4.0.8.exe;

打开工具,安装以下方式设置提交即可:

 

将以上生成的瓦片本地部署,部署的方式很多种,只要保证能通过url在线访问即可:

在代码中加载:

const viewer = new Cesium.Viewer('cesiumContainer', {terrainProvider: new Cesium.CesiumTerrainProvider({url: 'http://localhost:3000', // 替换为你的服务器地址requestVertexNormals: true, // 请求法线以支持地形光照requestWaterMask: true      // 请求水掩码以支持水面效果})
});
// 配置自定义地形服务
const customTerrainProvider = new Cesium.CesiumTerrainProvider({url: 'http://localhost:3000', // 替换为你的服务器地址requestVertexNormals: true,requestWaterMask: true,isSct: true       // 若为 SuperMap iServer 服务需设为 true [6](@ref)
});// 应用自定义地形
viewer.terrainProvider = customTerrainProvider;

常见问题排查

问题现象解决方案
地形加载失败检查网络连接和 Cesium Ion 令牌
水体效果未显示确认 requestWaterMask: true
地形贴图模糊增大 viewer.scene.maximumScreenSpaceError
内存泄漏限制 viewer.scene.globe.tileCacheSize

二、相机的方向和位置

在Cesium 1.93中,相机的方向和位置控制是三维场景交互的核心。

1、相机坐标系与关键概念

1.1 相机坐标系基础

将相机比喻成直立行走的人,镜头好比人的视野。

  • 位置(Position):相机在三维空间中的笛卡尔坐标(Cartesian3),以地球质心为原点。
  • 方向(Direction):相机的朝向,由视线向量(View Vector)表示,指向场景中的目标点。
  • 上方向(Up Vector):相机的 “上方” 方向,默认与地球表面垂直(Z 轴正方向)
    1. heading​​:绕Y轴旋转(正北为0°,向东为正方向)。
    2. ​​pitch​​:绕X轴旋转(-90°为俯视地面,0°为平视,正值为仰视)。
    3. ​​roll​​:绕Z轴旋转(默认0°,正值为右倾)。
  • 参考系(Reference Frame):相机运动的参考坐标系,通常为ENU(东 - 北 - 上)或ECF(地心地固坐标系)。
const orientation = {heading: Cesium.Math.toRadians(0),   // 正北pitch: Cesium.Math.toRadians(-90),   // 俯视地面roll: 0.0
};

2、相机控制的核心方法

2.1 setView:直接设置视角​​

特点​​:无动画,立即切换到目标位置和方向。

viewer.camera.setView({destination: position,  // 目标位置(Cartesian3)orientation: orientation // 方向参数
});
  const position = Cesium.Cartesian3.fromDegrees(116.3907917, 39.9158389, 500); // 故宫const orientation = {heading: Cesium.Math.toRadians(0),   // 正北pitch: Cesium.Math.toRadians(-90),   // 俯视地面roll: 0.0};viewer.camera.setView({destination: position,orientation});

2.2 flyTo:动画飞行至目标​​

特点​​:支持平滑过渡,可设置飞行时长、视角偏移等。

关键参数​​:

  • duration:动画时间(秒)。
  • pitchAdjustHeight:高度超过此值时自动调整俯仰角。
viewer.camera.flyTo({destination: position,orientation: orientation,duration: 5,  // 5秒动画pitchAdjustHeight: -90  // 强制俯视地面
});

2.3 lookAt:视角锁定目标点​​

特点​​:相机位置固定,始终朝向目标点。

参数​​:target(目标点)和offset(偏移量,支持HeadingPitchRange)。

const center = Cesium.Cartesian3.fromDegrees(116.4, 39.9);
viewer.camera.lookAt(center, new Cesium.HeadingPitchRange(0, -Math.PI/2, 1000));

2.4 viewBoundingSphere:环绕目标区域​​

适用场景​​:室内或小范围模型浏览。

const boundingSphere = new Cesium.BoundingSphere(center, radius);
viewer.camera.viewBoundingSphere(boundingSphere, new Cesium.HeadingPitchRange(0, 0, 0));

2.5 方向控制的进阶应用

2.5.1  ​​局部坐标系转换​​

使用Transforms.eastNorthUpToFixedFrame将局部坐标转换为全局坐标系: 

const localPosition = new Cesium.Cartesian3(10, 20, 0);
const transform = Cesium.Transforms.eastNorthUpToFixedFrame(localPosition);
const globalPosition = Cesium.Matrix4.multiplyByPoint(transform, localPosition);
2.5.2 动态方向控制​​

通过事件监听实时更新相机方向: 

viewer.scene.preRender.addEventListener(() => {const heading = viewer.camera.heading;const pitch = viewer.camera.pitch;console.log(`当前航向:${Cesium.Math.toDegrees(heading).toFixed(2)}°`);
});
2.5.3 实体跟随模式​​

使用trackedEntity让相机自动跟随移动目标: 

viewer.trackedEntity = entity;  // 实体ID或对象
2.5.4 多阶段飞行
viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(116.39, 39.90, 1000000),duration: 3,orientation: { heading: 0, pitch: -Math.PI/2, roll: 0 },complete: () => {// 第一阶段完成后触发第二阶段viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(116.40, 39.91, 500000),duration: 2,easingFunction: Cesium.EasingFunction.CUBIC_IN_OUT});}
});

​效果​​:分阶段飞行,首阶段俯冲至地面,第二阶段缓升至目标点。 

2.6 常见问题与注意事项

  • 坐标系一致性​​

确保位置和方向参数在同一坐标系下(如WGS84)。若使用局部坐标,需通过变换矩阵转换。

  • 俯仰角限制​​

默认俯仰角范围为[-π/2, π/2],超出可能导致视角异常。可通过viewer.camera.pitchLimits调整。

  • ​​性能优化​​

频繁调用flyTo或setView时,建议合并连续操作,避免卡顿。

2.7 完整示例:相机环绕目标点

// 定义目标点(北京天安门)
const target = Cesium.Cartesian3.fromDegrees(116.397, 39.908, 50);// 设置相机初始位置和方向
viewer.camera.setView({destination: Cesium.Cartesian3.fromDegrees(116.397, 39.908, 1000),orientation: {heading: Cesium.Math.toRadians(0),pitch: Cesium.Math.toRadians(-30),roll: 0}
});// 启动环绕动画(每5秒绕目标一圈)
viewer.clock.onTick.addEventListener(() => {const time = Cesium.JulianDate.now(viewer.clock.currentTime);const angle = (time.secondsOfDay * 360) / 5;  // 每5秒旋转360°viewer.camera.setView({destination: Cesium.Cartesian3.fromDegrees(116.397 + 10 * Math.cos(Cesium.Math.toRadians(angle)),39.908 + 10 * Math.sin(Cesium.Math.toRadians(angle)),1000),orientation: {heading: Cesium.Math.toRadians(angle),pitch: Cesium.Math.toRadians(-30),roll: 0}});
});

2.8 相机动画与相机动态交互

 Cesium 1.93 实现镜头飞向故宫的完整示例,包含了基础的场景设置、相机飞行动画以及简单的交互控制。

<template><div id="cesiumContainer"></div><div class="controls"><button id="flyToPalaceBtn">飞向故宫</button><button id="flyToGreatWallBtn">飞向长城</button><button id="resetViewBtn">重置视角</button></div>
</template><script setup>
Cesium.Ion.defaultAccessToken = 'Cesium defaultAccessToken'
import { onMounted } from "vue";
import * as Cesium from "cesium";
import "./Widgets/widgets.css";window.CESIUM_BASE_URL = "/"; // 设置Cesium静态资源路径(public目录)onMounted(() => {// 初始化Viewerconst viewer = new Cesium.Viewer('cesiumContainer', {geocoder: false, //设置搜索框是否可见homeButton: false, // 返回初始位置键是否可见sceneModePicker: false, // 查看器选择模式选择键是否可见baseLayerPicker: false, // 图层选择键是否可见navigationHelpButton: false, // 帮助按钮是否可见animation: false, // 播放控制按钮是否可见timeline: false, // 时间轴是否可见fullscreenButton: false, // 全屏按钮是否可见terrainProvider: Cesium.createWorldTerrain()});// 故宫位置(经纬度和高度)const palacePosition = {destination: Cesium.Cartesian3.fromDegrees(116.3907917, 39.9158389, 500), // 经度、纬度、高度(米)orientation: {heading: Cesium.Math.toRadians(0.0), // 偏航角(向东)pitch: Cesium.Math.toRadians(-30.0), // 俯仰角(向下倾斜)roll: 0.0 // 翻滚角},duration: 5, // 飞行持续时间(秒)maximumHeight: 2000, // 飞行过程中最大高度(米)curveAmount: 0.5 // 飞行曲线弯曲程度(0-1)};// 长城位置(慕田峪段)const greatWallPosition = {destination: Cesium.Cartesian3.fromDegrees(116.6558, 40.4139, 500),orientation: {heading: Cesium.Math.toRadians(90.0),pitch: Cesium.Math.toRadians(-20.0),roll: 0.0},duration: 5,maximumHeight: 3000};// 初始视角const initialView = {destination: Cesium.Cartesian3.fromDegrees(116.3907917, 39.9158389, 15000),orientation: {heading: Cesium.Math.toRadians(0.0),pitch: Cesium.Math.toRadians(-30.0),roll: 0.0}};// 设置初始视角viewer.camera.setView(initialView);// 飞向故宫按钮事件document.getElementById('flyToPalaceBtn').addEventListener('click', function () {viewer.camera.flyTo(palacePosition);});// 飞向长城按钮事件document.getElementById('flyToGreatWallBtn').addEventListener('click', function () {viewer.camera.flyTo(greatWallPosition);});// 重置视角按钮事件document.getElementById('resetViewBtn').addEventListener('click', function () {viewer.camera.setView(initialView);});
})</script><style scoped>
* {margin: 0;padding: 0;
}#cesiumContainer {width: 100wh;height: 100vh;
}.controls {position: absolute;bottom: 20px;left: 50%;transform: translateX(-50%);display: flex;gap: 10px;z-index: 100;
}button {padding: 8px 16px;background-color: #007BFF;color: white;border: none;border-radius: 4px;cursor: pointer;font-size: 14px;
}button:hover {background-color: #0056b3;
}
</style>


http://www.hkcw.cn/article/cwdIxftJMx.shtml

相关文章

3.RV1126-OPENCV 图像叠加

一.功能介绍 图像叠加&#xff1a;就是在一张图片上放上自己想要的图片&#xff0c;如LOGO&#xff0c;时间等。有点像之前提到的OSD原理一样。例如&#xff1a;下图一张图片&#xff0c;在左上角增加其他图片。 二.OPENCV中图像叠加常用的API 1. copyTo方法进行图像叠加 原理…

“苏超”为何能引发全网热潮 足球热浪席卷江苏

“友谊第一,比赛第二”这句话在足球场上经常被提及,但最近江苏省首届城市足球联赛却以一种幽默的方式重新诠释了这一理念。球迷们戏称这场比赛为“苏超”,其中不乏一些有趣的口号,如“友谊第一,比赛第十四”。江苏省首届城市足球联赛由江苏省体育局与各设区市政府联合主办…

金饰价格重回1000元大关 国际金价带动国内上涨

随着国际黄金价格上涨,国内金饰价格重新升至每克千元以上。6月2日,老凤祥金饰品的价格达到1000元/克,这是自5月28日国内金饰价格普遍跌破千元大关后再次回升。同一天,受特朗普关税政策影响,国际金价跳空高开。特朗普宣布从6月4日起将进口钢铁关税提高至50%。贸易局势的变化…

提示词优化过程实例分析——百晓生:《研究和解释者》的plus版优化过程

一、 前序 今天小朋友问我AI agent到底是什么,解释了好半天,小朋友大概也许可能懂了吧!随后就借助百晓生老师的《研究和解释者》的助理提示词模板问了大语言模型,模板内容如下: 你的角色: 你是 百晓生- 世上最好的研究和解释代理 你的工作: 以各种可能的方式以中文解释…

俄空军基地损失有多大 无人机袭击显威力

2025年6月1日,俄乌冲突再度升级。乌克兰对俄罗斯的空军基地实施了无人机攻击,并疑似袭击了北莫尔斯克核动力潜艇舰队基地。当地居民报告称发生了巨大爆炸,现场浓烟滚滚。据《海事安全》网站报道,当天北莫尔斯克市发生爆炸并升起浓烟,这里是北方舰队的母港,也是俄罗斯最具…

南昌两家海湾石油停业 消费者预付资金受困

今天上午,多名消费者反映他们在南昌南斯友好路上的两家“海湾石油”预付充值了大量资金,但现在卡里的钱还没用完,加油站却突然停业了。上午11点左右,记者赶到南斯友好路上的海湾石油加油站(岭口站),发现该店已暂停营业,入口处拉起了警戒线,加油设备也被切断电源。陈女…

专家:乌袭击行动是对俄罗斯的敲打 打击范围扩大

今天,互联网上对乌克兰袭击俄罗斯战略轰炸机一事表现出了极大的关注。许多博主将焦点放在了乌克兰无人机袭击俄罗斯战略轰炸机上,但还有一个更值得关注的细节:乌克兰还对俄罗斯的海军基地进行了打击。有网友分享的视频截图显示,俄罗斯核动力潜艇北莫尔斯克基地发生了强烈爆…

中国如何应对美国断供航空发动机 自主替代显底气

美国最近对华政策再次加码,在两大关键领域收紧限制,试图遏制中国的发展。一方面,美国针对中国大飞机C919的核心发动机实施断供;另一方面,对中国留学生在美国发展的关键通道下手,计划大规模吊销签证。这种做法体现了特朗普团队一贯的行事风格,表面上谈合作,实际上却在背…

美国一收容所11人被刺伤 嫌疑人已被拘捕

据美国媒体报道,当地时间6月1日傍晚,俄勒冈州首府塞勒姆市的一家无家可归者收容所发生持刀伤人事件,至少11人被刺。伤者已被送往医院接受治疗,但具体伤情暂不清楚。一名男性嫌疑人已被拘捕,案件正在进一步调查中。责任编辑:0764

吃不完的粽子能保存多久 冷冻不宜超15天

又到了一年吃粽子的时节,家里的粽子种类繁多。没吃完的粽子多数人会直接冻进冰箱里。那么,粽子到底能储存多久呢?专家表示,吃不完的熟粽子冷冻保存不宜超过15天,而包完的生粽子则不宜冷冻保存。如何判断冷冻十多天的熟粽子是否变质?专家建议,如果拿出来的粽子很黏且有拉…

若李在明胜选朝韩能否重现南北对话 樱花之约的挑战

韩国前总统文在寅在卸任前夕,在青瓦台庭院种下一棵象征“和平与希望”的樱花树,并低声感叹:“南北和解的春天能否延续?”这一幕让无数人动容。三年后的今天,韩国第22届总统大选进入白热化阶段,共同民主党候选人李在明以“重启对话外交”为口号,试图唤回文在寅时代的南北…

陈梦被曝与王楚钦交往?女方妈妈回应 恋情澄清

NBA美女主播美娜在直播中回应了自己和王楚钦的恋情传闻,这使得关于两人恋情的说法被辟谣。此前,网络上流传出一段疑似王楚钦和美娜在地下停车场回家的视频,导致两人的恋爱传闻四起,最终迫使美娜亲自出面澄清。然而,在某论坛上,又有球迷曝光了一段疑似王楚钦和陈梦一起进入…

中纪委:5月97人被查41人被处分 反腐行动持续深入

5月,中央纪委国家监委网站发布通报,97人接受审查调查。其中包括十四届全国政协常委、经济委员会副主任毕井泉,国家国防科技工业局原党组成员、副局长张建华,陕西省政协副主席刘宽忍,四川省政府党组成员、副省长、省公安厅厅长叶寒冰,广西壮族自治区党委副书记、自治区政府…

高芙晋级法网八强 连续五年创佳绩

6月2日,在法国网球公开赛女单第四轮比赛中,2号种子高芙以2-0(6-0、7-5)战胜20号种子亚历山德洛娃,连续五年晋级法网八强。这是她职业生涯第九次跻身大满贯八强。接下来,她将等待凯斯和巴普蒂斯特之间的胜者。通过这场比赛,高芙获得了430分和44万欧元(约合人民币363.12万…

郑钦文再战萨巴伦卡这次有何不同 发球与心态成关键

北京时间6月3日,郑钦文将在法国网球公开赛女单八强战中对阵现任“世界第一”萨巴伦卡。这是两人职业生涯的第八次交手。此前七次相遇,萨巴伦卡获得六连胜;最近一次在罗马1000赛的交锋中,获胜者是郑钦文。不到半个月,两位球员又将在罗兰加洛斯隔网相对。郑钦文在罗马终结对…

当地回应端午划龙舟必须买保险 安全措施引热议

近日,湖南益阳资阳区有网友反映,端午节期间村民划龙舟时,当地政府要求他们购买保险,否则不准下水。当地镇政府工作人员回应称,龙舟赛事买保险是当地的规定。工作人员出示了一份由益阳市安全生产委员会于2024年6月6日下发的文件,其中明确规定:龙舟下水前,各地政府要组织…

幼童掉入高铁站台股道 官方通报 儿童已安全交还家长

6月2日下午,上铁淮南西站发布情况说明:5月31日16时09分许,铁路工作人员在淮南南站3号站台边缘下方发现一名儿童,并迅速将其拉上站台。经了解,这名儿童当天随家长乘坐G7446次列车,在列车停靠淮南南站3号站台期间,他脱离了家长视线自行走出车厢,不慎从列车和站台之间的间…

重庆两岁男童走失两天成功找回 警犬立大功

5月27日13时许,经过42小时持续搜救,重庆市公安局刑侦总队警犬追踪小组成功找到走失的2岁男童兵兵。在这场与时间赛跑的生死救援中,警犬技术再次发挥了关键作用。5月25日20时21分,綦江区公安局接到报警称石角镇下湾村一名2岁的男童兵兵走失。属地警方立即启动应急预案,组织…

2025年进口床垫品牌推荐榜单:精选优质床垫,开启舒适睡眠之旅

在追求高品质睡眠的当下&#xff0c;进口床垫以其卓越的工艺、优质的材料和先进的技术&#xff0c;成为众多消费者提升睡眠体验的首选。为了帮助大家在琳琅满目的进口床垫市场中找到最适合自己的产品&#xff0c;我们精心整理了这份2025年进口床垫品牌推荐榜单。此次推荐涵盖了…

北京继续发布大风蓝色预警信号 风力将再次加大

北京市气象局继续发布大风蓝色预警信号,预计2日20时后风力会明显减小。然而,3日上午风力将再次加大,从9时到20时会有3、4级偏北风,阵风可达6、7级,山区局地阵风甚至可能达到8级以上。请大家注意防范。责任编辑:0764