Cesium教程03_加载b3dm高度

embedded/2024/11/23 7:38:11/

使用 Vue3 和 Cesium 构建三维地球场景并实现高度调整功能

引言

在现代 Web GIS(地理信息系统)开发中,Cesium 是一款功能强大的三维地球可视化工具。本文展示了如何使用 Vue3 与 Cesium 集成,实现一个支持调整高度功能的三维地球场景。

本文将通过以下几个步骤完成:

  1. 初始化 Cesium 场景。
  2. 加载 3D Tiles 模型。
  3. 实现高度动态调整功能。

功能演示

在完成本示例后,用户可以通过一个滑块实时调整 3D Tiles 模型的高度,观察模型在三维场景中的动态变化效果。

代码实现

以下是完整的代码实现,包括 templatescript 和样式部分。

1.关键代码

<template><div><!-- Cesium 容器 --><div ref="cesiumContainer" class="cesium-container"></div><!-- 工具栏 --><div class="toolbar"><!-- 高度调节滑块 --><label for="heightSlider">Adjust Height:</label><inputid="heightSlider"type="range"min="0"max="100"v-model="height"/><span>{{ height }} meters</span></div></div>
</template>
<script>
import { defineComponent, ref, onMounted, watch } from "vue";
import { Viewer, Cartesian3, Cartographic, Matrix4, Cesium3DTileset, Math as CesiumMath, Matrix3, Terrain } from "cesium";
import "cesium/Build/Cesium/Widgets/widgets.css";export default defineComponent({name: "CesiumViewer",setup() {const cesiumContainer = ref(null);const viewer = ref(null);const tileset = ref(null);const height = ref(0);let rootTransform = null;const initCesium = async () => {if (!cesiumContainer.value) {console.error("Cesium container not found!");return;}try {viewer.value = new Viewer(cesiumContainer.value, {terrain: Terrain.fromWorldTerrain(),});tileset.value = await Cesium3DTileset.fromIonAssetId(40866);viewer.value.scene.primitives.add(tileset.value);viewer.value.zoomTo(tileset.value);rootTransform = Matrix4.clone(tileset.value.root.transform);tileset.value.modelMatrix = Matrix4.clone(rootTransform);tileset.value.root.transform = Matrix4.clone(Matrix4.IDENTITY);} catch (error) {console.error("Error initializing Cesium:", error);}};const updateHeight = (newHeight) => {if (!tileset.value) return;const numericHeight = Number(newHeight);if (isNaN(numericHeight)) {console.error("Invalid height value:", newHeight);return;}const boundingSphere = tileset.value.boundingSphere;const cartographic = Cartographic.fromCartesian(boundingSphere.center);const surface = Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);const offset = Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, numericHeight);const translation = Cartesian3.subtract(offset, surface, new Cartesian3());const newModelMatrix = Matrix4.fromTranslation(translation);tileset.value.modelMatrix = Matrix4.multiply(rootTransform, newModelMatrix, new Matrix4());};watch(height, (newHeight) => {updateHeight(newHeight);});onMounted(() => {initCesium();});return {cesiumContainer,height,};},
});
</script>

代码解析

1. 初始化 Cesium 场景

initCesium 方法初始化 Cesium Viewer,并加载全球地形数据。

2. 加载 3D Tiles 模型

通过 Cesium3DTileset.fromIonAssetId 方法加载指定的 3D Tiles 数据,并添加到场景中。

3. 高度调整逻辑

在 updateHeight 方法中,计算模型的新高度并动态更新其变换矩阵(modelMatrix)。

4. 数据绑定

通过 Vue 的 watch 方法监听高度滑块的值,调用 updateHeight 更新模型。
在这里插入图片描述

总结

本文介绍了如何使用 Vue3 与 Cesium 构建一个动态调整模型高度的三维场景。通过 Vue 的响应式机制和 Cesium 强大的三维渲染能力,可以轻松实现复杂的交互功能。

可扩展方向

添加旋转功能:可以扩展滑块,实现对模型的旋转控制。
多模型支持:通过动态加载不同的模型,构建丰富的场景。
高程匹配:集成高程数据,使模型与地形完美匹配。

参考资源

Cesium 官方文档
Vue3 官方文档
Cesium ion 数据库


http://www.ppmy.cn/embedded/139804.html

相关文章

力扣刷题--21.合并两个有序链表

I am the best &#xff01;&#xff01;&#xff01; 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2…

音频档案批量拷贝:专业SD拷贝机解决方案

批量音频档案拷贝最佳方案&#xff1a;解决播放错误与拷贝不完全问题 在现今数字化生产需求越来越高的时代&#xff0c;专业的拷贝机为大量数据复制提供了高效、安全的解决方案&#xff0c;特别是在批量拷贝音频档案至MicroSD卡并应用于播放器时&#xff0c;拷贝机具有无与伦比…

Python + 深度学习从 0 到 1(00 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ 什么是深度学习&#xff1f; 人工智能、机器学习与…

【Python TensorFlow】进阶指南(续篇三)

在前几篇文章中&#xff0c;我们探讨了TensorFlow的高级功能&#xff0c;包括模型优化、分布式训练、模型解释等多个方面。本文将进一步深入探讨一些更具体和实用的主题&#xff0c;如模型持续优化的具体方法、异步训练的实际应用、在线学习的实现细节、模型服务化的最佳实践、…

利用图像识别给CAD图纸找不同

文章目录 论文地址一、背景及意义介绍背景介绍意义介绍 二、概述三、论文思路具体步骤 四、方法介绍基于图像处理的CAD图纸比对算法的方法介绍 五、复现过程&#xff08;1&#xff09;CAD图纸转换为PDF&#xff08;2&#xff09;图纸边缘切割对齐&#xff08;3&#xff09;高斯…

Docker 容器化开发 应用

Docker 常用命令 存储 - 目录挂载 存储 卷映射 自定义网络 Docker Compose语法 Dockerfile - 制作镜像 镜像分层机制 完结

【Android】android compat理解

1&#xff0c;前提 即便是在同一手机上安装的不同apk&#xff0c;其编译的apk不同&#xff0c;也会导致行为上的差异。如SDK34有限制后台启动&#xff0c;但如果安装的apk所依赖的sdk是33&#xff0c;则不会表现出此差异。这是如何实现的呢&#xff1f;其实&#xff0c;本质是…

视频美颜SDK开发详解:构建实时直播美颜平台的全流程

视频美颜SDK作为实现高质量实时美颜效果的关键工具&#xff0c;受到了广泛关注。本篇文章&#xff0c;小编将从技术架构、核心功能实现和开发流程等方面&#xff0c;详细解析如何构建一个实时直播美颜平台。 一、视频美颜SDK的核心架构 视频美颜SDK的架构设计通常围绕以下几个…