当前位置: 首页 > article >正文

Cesium教程06_材质设置

使用 Vue 和 Cesium 实现城市规划场景渲染

本文将介绍如何通过 Vue 和 Cesium 构建一个简易的城市规划场景,并展示多种材质的应用,包括纯色、图像贴图、棋盘格、条纹、网格等。此外,还将实现场景的动态镜头飞行操作,提升用户的交互体验。

目录

  1. 项目背景
  2. 功能演示
  3. 代码实现
    • 模板部分
    • 脚本部分
    • 样式部分
  4. 代码解析
    • 材质应用
    • 镜头飞行功能
  5. 总结与扩展方向

项目背景

在现代城市规划中,数字孪生技术和 3D 可视化成为了重要工具。Cesium 作为一个高效的 3D 地图库,提供了强大的可视化功能。通过集成 Vue,可以快速实现交互式城市规划应用。

功能演示

本文中的示例场景包括以下功能:

  • 显示不同材质(纯色、贴图、棋盘格等)的区域和线条;
  • 动态调整镜头并聚焦到指定区域;
  • 在 Cesium 场景中隐藏不必要的 UI 元素,提升体验。

代码实现

模板部分

import {onMounted, ref} from "vue";
import {
  Viewer,
  Color,
  Cartesian3,
  Rectangle,
  ImageMaterialProperty,
  CheckerboardMaterialProperty,
  StripeMaterialProperty,
  GridMaterialProperty,
  PolylineGlowMaterialProperty,
  PolylineOutlineMaterialProperty,
  Math as CesiumMath,
} from "cesium";

export default {
  name: "CesiumMapView",
  setup() {
    const cesiumContainer = ref(null);
    let viewer = null;

    onMounted(() => {
      // 初始化 Cesium Viewer
      viewer = new Viewer(cesiumContainer.value, {
        geocoder: false,
        homeButton: false,
        sceneModePicker: false,
        baseLayerPicker: false,
        navigationHelpButton: false,
        animation: false,
        timeline: false,
        fullScreenButton: false,
        vrButton: false,
        creditContainer: "credit",
      });

      // 启用帧速显示
      viewer.scene.debugShowFramesPerSecond = true;

      // 添加城市规划案例中的材质应用
      const commercialArea = addCityPlanningEntities(viewer);

      // 镜头推进并聚焦到贴图材质区域
      flyToCommercialArea(viewer, commercialArea);
    });

    const addCityPlanningEntities = (viewer) => {
      // 1. 纯色区域
      viewer.entities.add({
        name: "Residential Area",
        polygon: {
          hierarchy: Cartesian3.fromDegreesArray([
            -75.1, 39.9, -75.0, 39.9, -75.0, 40.0, -75.1, 40.0,
          ]),
          material: Color.BLUE.withAlpha(0.5),
        },
      });

      // 2. 图像材质
      const commercialArea = viewer.entities.add({
        name: "Commercial Area",
        polygon: {
          hierarchy: Cartesian3.fromDegreesArray([
            -75.0, 39.9, -74.9, 39.9, -74.9, 40.0, -75.0, 40.0,
          ]),
          material: new ImageMaterialProperty({
            image: "/path/to/image.png", // 替换为实际图像路径
          }),
        },
      });

      // 添加更多材质...
      return commercialArea;
    };

    const flyToCommercialArea = (viewer, commercialArea) => {
      const rectangle = Rectangle.fromCartesianArray(
        commercialArea.polygon.hierarchy.getValue().positions
      );

      viewer.camera.flyTo({
        destination: rectangle,
        orientation: {
          heading: CesiumMath.toRadians(0),
          pitch: CesiumMath.toRadians(-90),
          roll: 0.0,
        },
        duration: 2.0,
      });
    };

    return { cesiumContainer };
  },
};
</script>

代码解析

材质应用

Cesium 提供多种材质类型,常见的有以下几种:

  1. 纯色材质ColorMaterialProperty):适用于简单填充区域。
  2. 图像材质ImageMaterialProperty):可以在区域内加载自定义纹理。
  3. 棋盘格材质CheckerboardMaterialProperty):为区域填充规则的棋盘格图案。
  4. 条纹材质StripeMaterialProperty):绘制具有交替颜色的条纹图案。
  5. 网格材质GridMaterialProperty):用于生成规则的网格图案。
  6. 发光线条PolylineGlowMaterialProperty):为线条添加发光效果。
  7. 轮廓线条PolylineOutlineMaterialProperty):为线条添加轮廓。

镜头飞行功能

通过 Cesium 的 flyTo 方法,可以动态调整相机视角,带来流畅的视角切换效果。核心参数包括目标区域、朝向(heading)、俯仰角度(pitch)和飞行时间(duration)。
在这里插入图片描述

总结与扩展方向

本文通过 Vue 和 Cesium 实现了一个功能齐全的城市规划场景。未来可以扩展以下功能:

  1. 动态数据加载:结合后端 API,实现动态添加和更新实体。
  2. 交互增强:添加点击事件以显示区域详情。
  3. 材质优化:支持更多复杂的材质效果,例如渐变或动画纹理。

通过上述改进,可以进一步提升应用的实用性和用户体验。


http://www.kler.cn/a/413510.html

相关文章:

  • 使用flink编写WordCount
  • mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复
  • MySQL系列之远程管理(安全)
  • PointNet++论文复现
  • 【ArcGISPro】使用AI提取要素-土地分类(sentinel2)
  • SAAS美容美发系统架构解析
  • Meta 发布Sapiens人类视觉模型,2D 姿势估计、人体分割、深度估计
  • GPT分区、格式化与自动挂载
  • 整车安全需求考量的多维度深度剖析
  • A051-基于Spring Boot的网络海鲜市场系统的设计与实现
  • Leetcode 阶乘后的零
  • Leetcode - 周赛424
  • uniapp开发支付宝小程序自定义tabbar样式异常
  • 详解 PyTorch 中的 Dataset:功能、实现及应用示例
  • 【实用技能】如何以不同方式更改 MySQL 中的表名
  • 【Zookeeper】四,Zookeeper节点类型、通知、仲裁、会话
  • Java常见的锁策略
  • 机器学习深掘临床研究中小分子代谢标志物的探索与应用
  • Python语法基础(三)
  • Flink--API 之Transformation-转换算子的使用解析
  • redis-cluster集群搭建
  • 网络服务与应用
  • PySide6 QSS(Qt Style Sheets) Reference: PySide6 QSS参考指南
  • BERT 详解
  • 如何在CodeIgniter中加载视图
  • 利用Python爬虫获取淘宝商品评论:实战案例分析