Cesium 键盘控制飞行教程
键盘控制飞行 ·controlModel· ▶ 在线运行案例案例合集三维可视化功能案例threehub.cn开源仓库github地址https://github.com/z2586300277/three-cesium-examples400个案例代码:网盘链接你将学到什么Scene / Camera / Renderer 标准渲染管线搭建案例完整源码结构与可复用初始化模板效果说明本案例演示键盘控制飞行效果模型姿态控制对象用于控制模型的偏航角(heading)、俯仰角(pitch)和翻滚角(roll)。建议先打开文首在线案例查看动态画面再对照下方源码逐步理解。核心概念Viewer聚合 Scene、Camera、Clock 与渲染循环是 Cesium 应用入口。阅读下方完整源码时建议从init/load/animate三条主线入手再深入 shader 与工具函数。实现步骤创建 Viewer配置地形/影像若案例需要并设置初始相机在requestAnimationFrame循环中更新状态并 renderCesium 为viewer.render或自动渲染代码要点import * as Cesium from cesium;import { GUI } from dat.gui;// 配置区域 /**模型姿态控制对象用于控制模型的偏航角(heading)、俯仰角(pitch)和翻滚角(roll)type {Cesium.HeadingPitchRoll}*/ let headingPitchRoll new Cesium.HeadingPitchRoll();/**局部变换坐标系生成器用于创建局部坐标系到世界坐标系的变换north表示Y轴指向北west表示X轴指向西type {Function}*/ let fixedFrameTransform Cesium.Transforms.localFrameToFixedFrameGenerator(north, west);/**每次姿态变化角度(4°)将角度转换为弧度用于计算type {Number}*/ let deltaRadians Cesium.Math.toRadians(4);/**速度向量用于存储模型移动的方向和速度type {Cesium.Cartesian3}*/ let Vector new Cesium.Cartesian3();// 状态管理 /**视角控制状态可以是first(第一人称)、god(上帝视角)或none(无控制)type {String}*/ let view first;/**模型实例(用于防止重复添加)type {Object}*/ let firstModel ;/**模型当前位置使用笛卡尔坐标表示type {Cesium.Cartesian3}*/ let position;/**模型运动速度type {Number}*/ let speed 5;/**相机相对模型的位置向量用于确定相机相对于模型的位置type {Array}*/ let xyz [0, 0, 50];/**第一人称视角相机位置 [x, y, z]type {Array}*/ let firstRoamXYZ [0, -50, 10];/**上帝视角相机位置 [x, y, z]type {Array}*/ let godRoamXYZ [0, 0, 50];/**键盘事件处理函数引用用于后续移除事件监听器type {Function}*/ let firstDown;/**场景更新前事件处理函数引用用于后续移除事件监听器type {Function}*/ let preUpdate;// 初始化区域 /**获取用于渲染Cesium场景的容器元素type {HTMLElement}*/ const DOM document.getElementById(box)/**初始化Cesium Viewertype {Cesium.Viewer}*/ const viewer new Cesium.Viewer(DOM, { animation: false, // 是否创建动画小器件左下角仪表 baseLayerPicker: false, // 是否显示图层选择器右上角图层选择按钮 baseLayer: Cesium.ImageryLayer.fromProviderAsync(Cesium.ArcGisMapServerImageryProvider.fromUrl(GLOBAL_CONFIG.getLayerUrl())), fullscreenButton: false, // 是否显示全屏按钮右下角全屏选择按钮 timeline: false, // 是否显示时间轴 infoBox: false, // 是否显示信息框 })// GUI控制 /**显示操作说明*/ function showInstructions() { const instructions 相机姿态控制 W:抬头 S:低头 A:左转 D:右转 Q:逆时针旋转 E:顺时针旋转 速度控制 1:加速 2:减速; alert(instructions); }/**创建GUI控制面板type {dat.GUI}*/ const gui new GUI();/**定义图形绘制操作对象namespace obj*/ const obj { 开始飞行: () { startFirstRoam({ startPosition: [116.3, 39.9, 1000], }); }, 暂停飞行: () { stopFirstRoam(); }, 切换视角: () { // 在第一人称和上帝视角之间切换 if (view god) { changeRoamView(first); } else { changeRoamView(god); } }, 重置: () { quitFirstRoam(); }, 操作说明: () { showInstructions(); } };// 将操作对象添加到GUI控制面板 for (const key in obj) gui.add(obj, key)// 隐藏Cesium Logo viewer._cesiumWidget._creditContainer.style.display none;// 功能操作区域 /**第一视角漫游加载方法description 使用键盘控制第一视角漫游模型姿态W抬头S低头A左转D右转Q逆时针旋转E顺时针旋转1加速2减速param {Object} parameter -第一视角漫游默认配置项param {Array} parameter.startPosition -模型初始坐标位置[经度, 纬度, 高度]param {Number} [parameter.minSize64] -模型的最小显示像素大小param {Number} [parameter.maxSize128] -模型的最大显示像素大小param {Number} [parameter.speed1] -漫游速度return {Cesium.Primitive} -返回飞行对象实体*/ function startFirstRoam(parameter) { // 防止重复添加模型 if (!firstModel) { // 设置模型初始位置将经纬度坐标转换为笛卡尔坐标 position new Cesium.Cartesian3.fromDegrees(...parameter.startPosition);// 相机飞向模型初始位置 viewer.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(...parameter.startPosition), orientation: { heading: Cesium.Math.toRadians(0), // 偏航角正北方向 pitch: Cesium.Math.toRadians(-20), // 俯仰角向下倾斜20度 roll: 0.0, // 翻滚角无翻滚 }, }); // 使用primitive方式加载模型 - 修复 Cesium.Model.fromGltf 错误 // 异步加载GLTF模型文件并应用上面计算的变换矩阵 Cesium.Model.fromGltfAsync({ url: HOST files/model/Cesium_Air.glb, }).then(model { // 将加载完成的模型添加到场景中 firstModel viewer.scene.primitives.add(model);// 设置模型姿态矩阵将姿态控制对象应用到模型上 // headingPitchRollToFixedFrame创建一个从姿态角到世界坐标的变换矩阵 firstModel.modelMatrix Cesium.Transforms.headingPitchRollToFixedFrame( position, // 模型位置 headingPitchRoll, // 姿态控制对象 Cesium.Ellipsoid.WGS84, // 使用WGS84椭球体 fixedFrameTransform // 局部坐标系生成器 ); }); }// 清除已有的事件监听器防止重复注册 if (firstDown) { document.removeEventListener(keydown, firstDown, false); }// 注册键盘事件监听器 document.addEventListener(keydown, firstDown function (e) { switch (e.key.toLowerCase()) { // 姿态控制 case w: // 抬头 - 增加俯仰角 headingPitchRoll.pitch deltaRadians; break; case s: // 低头 - 减少俯仰角 headingPitchRoll.pitch - deltaRadians; break; case a: // 左转 - 减少偏航角 headingPitchRoll.heading - deltaRadians; break; case d: // 右转 - 增加偏航角 headingPitchRoll.heading deltaRadians; break; case q: // 逆时针旋转 - 减少翻滚角 headingPitchRoll.roll - deltaRadians; break; case e: // 顺时针旋转 - 增加翻滚角 headingPitchRoll.roll deltaRadians; break; // 速度控制 case 1: // 加速 speed 10; speed Math.min(speed, 10000); break; case 2: // 减速 speed - 10; speed Math.max(speed, 10); break; } });if (preUpdate) { viewer.scene.preUpdate.removeEventListener(preUpdate); }// 注册场景更新前事件监听器每帧执行一次 viewer.scene.preUpdate.addEventListener(preUpdate () { // 确保模型已加载 if (!firstModel) return;// 根据速度计算下一个位置 // multiplyByScalar将单位向量乘以标量得到实际的移动向量 Vector Cesium.Cartesian3.multiplyByScalar( Cesium.Cartesian3.UNIT_X, // 模型的X轴正方向作为前进方向 speed / 10, // 速度因子 Vector );// 计算模型新位置 // multiplyByPoint将变换矩阵应用于点得到变换后的新位置 position Cesium.Matrix4.multiplyByPoint( firstModel.modelMatrix, // 当前模型的变换矩阵 Vector, // 移动向量 position // 当前位置结果也存储在这里 );// 更新模型姿态与位置 // 重新计算模型的变换矩阵应用新的位置和姿态 Cesium.Transforms.headingPitchRollToFixedFrame( position, // 新位置 headingPitchRoll, // 当前姿态 Cesium.Ellipsoid.WGS84, // 使用WGS84椭球体 fixedFrameTransform, // 局部坐标系生成器 firstModel.modelMatrix // 更新模型的变换矩阵 );// 根据视角状态更新相机位置 // lookAt使相机看向指定目标点并保持相对位置 if (view ! none) { viewer.camera.lookAt(position, new Cesium.Cartesian3(...xyz)); } }); }/**漫游视角切换方法param {String} value -视角模式 (first|god|none)*/ function changeRoamView(value) { view value; switch (value) { case first: xyz firstRoamXYZ; // 第一人称视角 break; case god: xyz godRoamXYZ; // 上帝视角 break; } }/**暂停第一视角漫游事件*/ function stopFirstRoam() { // 移除事件监听器 document.removeEventListener(keydown, firstDown, false); viewer.scene.preUpdate.removeEventListener(preUpdate); viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); }/**销毁第一视角漫游事件*/ function quitFirstRoam() { stopFirstRoam(); // 移除模型 if (firstModel) { viewer.scene.primitives.remove(firstModel); firstModel ; } speed 5; // 重置姿态控制对象 headingPitchRoll new Cesium.HeadingPitchRoll() viewer.camera.flyTo({ duration: 1, destination: Cesium.Cartesian3.fromDegrees(116.3, 39.9, 1000), orientation: { heading: Cesium.Math.toRadians(0), pitch: Cesium.Math.toRadians(-20), roll: 0.0, }, }); }完整源码GitHub小结本文提供键盘控制飞行完整 Cesium.js 源码与在线 Demo建议先运行案例再改 uniform/参数做二次实验更多 Cesium.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库

相关新闻

工作流引擎的性能调优:百万级任务调度的瓶颈分析与优化

工作流引擎的性能调优:百万级任务调度的瓶颈分析与优化

工作流引擎的性能调优:百万级任务调度的瓶颈分析与优化 一、深度引言 工作流引擎的调度能力是衡量其生产可用性的核心指标。一个在100个并发任务下表现良好的引擎,放到10000个并发的生产环境中可能瞬间崩溃。我们团队在实际项目中遇到过一个典型案例&…

2026/7/11 19:00:25阅读更多 →
基于MossFormer2与多模态融合的AI语音清晰化智能解决方案

基于MossFormer2与多模态融合的AI语音清晰化智能解决方案

基于MossFormer2与多模态融合的AI语音清晰化智能解决方案 【免费下载链接】ClearerVoice-Studio An AI-Powered Speech Processing Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Enhancement, Separation, and Target Speaker Extraction, etc. 项目地…

2026/7/11 18:55:25阅读更多 →
IOMMU/SMMU 地址转换全流程:从 IOVA 到 PA 的 3 级页表与 ATS 缓存机制

IOMMU/SMMU 地址转换全流程:从 IOVA 到 PA 的 3 级页表与 ATS 缓存机制

IOMMU/SMMU 地址转换全流程:从 IOVA 到 PA 的 3 级页表与 ATS 缓存机制现代计算系统中,设备直接内存访问(DMA)已成为提升性能的关键技术。然而,随着系统复杂度的增加,如何安全高效地管理设备对内存的访问成…

2026/7/11 18:55:25阅读更多 →
3个实战场景深度解析:GBFR Logs如何重塑你的《碧蓝幻想:Relink》团队优化策略

3个实战场景深度解析:GBFR Logs如何重塑你的《碧蓝幻想:Relink》团队优化策略

3个实战场景深度解析:GBFR Logs如何重塑你的《碧蓝幻想:Relink》团队优化策略 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/…

2026/7/11 20:05:32阅读更多 →
SenseNova-U1-8B信息图生成模型部署与优化指南

SenseNova-U1-8B信息图生成模型部署与优化指南

1. 先搞清楚这个模型到底解决什么实际问题如果你经常需要制作信息图、PPT、海报或者图文教程,但苦于设计排版耗时耗力,SenseNova-U1-8B-Infographic-V2 这个开源模型值得重点关注。它专门针对信息图生成场景做了优化,能帮你把文字描述直接转换…

2026/7/11 20:05:32阅读更多 →
PCIe 3.0/4.0/5.0 Block Alignment 三阶段详解:从 EIEOS 检测到 Locked 状态转换

PCIe 3.0/4.0/5.0 Block Alignment 三阶段详解:从 EIEOS 检测到 Locked 状态转换

PCIe 3.0/4.0/5.0 Block Alignment 三阶段详解:从 EIEOS 检测到 Locked 状态转换在现代高速串行通信协议中,PCIe(Peripheral Component Interconnect Express)作为主流的总线标准,其物理层同步机制对链路稳定性至关重要…

2026/7/11 20:05:32阅读更多 →
FastAPI+Docker构建高并发Embedding/Rerank服务实战

FastAPI+Docker构建高并发Embedding/Rerank服务实战

1. 为什么这个服务架构能真正解决“模型加载地狱”——从开发者的切肤之痛说起 你有没有在凌晨三点改完第7个RAG项目,突然发现:每个项目里都得重复写一遍 from sentence_transformers import SentenceTransformer ,再花40秒把 bge-m3 或 …

2026/7/11 20:05:32阅读更多 →
Anki插件开发必知必会:钩子函数与右键菜单定制

Anki插件开发必知必会:钩子函数与右键菜单定制

🔹 为啥要自定义右键菜单——场景共鸣 🔹 钩子函数到底是个啥——生活化比喻 🔹 菜单定义的核心代码骨架 🔹 实战:给浏览器卡片右键加上“查词典” 🔹 必知必看的注意事项与奇技淫巧 🧩 第一部分…

2026/7/11 20:05:32阅读更多 →
LLM 写对联:格式对了不代表文化对了

LLM 写对联:格式对了不代表文化对了

LLM 写对联:格式对了不代表文化对了 一、大模型写对联格式完美但意境缺失,文化理解不是模式匹配 对联是中华文化里最精炼的文字艺术形式:上下联字数相等、平仄相对、词性对应、意境呼应。大模型写对联时,格式层面可以做得很好——…

2026/7/11 20:00:31阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/11 18:37:06阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/11 15:18:12阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/11 15:11:32阅读更多 →
Premiere Pro 2025安装失败原因与AGSIS验证绕过指南

Premiere Pro 2025安装失败原因与AGSIS验证绕过指南

1. 为什么2025版PR安装比以往更“磨人”?——从弹窗警告到路径陷阱的真实处境 Premiere Pro 2025版不是简单的一次版本迭代,它是一道分水岭。我从去年底开始帮影视工作室、高校剪辑实验室和自由职业者部署2025环境,累计处理了137台设备&#…

2026/7/11 0:03:43阅读更多 →
5款实用macOS系统优化工具:让你的Mac运行更流畅更高效

5款实用macOS系统优化工具:让你的Mac运行更流畅更高效

5款实用macOS系统优化工具:让你的Mac运行更流畅更高效 【免费下载链接】open-source-mac-os-apps 🚀 Awesome list of open source applications for macOS. https://t.me/s/opensourcemacosapps 项目地址: https://gitcode.com/gh_mirrors/op/open-so…

2026/7/11 0:03:43阅读更多 →
5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:03:43阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/11 16:20:28阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/10 22:20:33阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/11 18:12:23阅读更多 →