首页 > 其他分享 >Cesium教程08_camera使用

Cesium教程08_camera使用

时间:2024-11-25 13:01:54浏览次数:10  
标签:视角 false 天际线 08 camera toRadians Cesium heading CesiumMath

使用 Vue 和 Cesium 实现城市天际线视角切换

本文将介绍如何使用 Vue 和 Cesium 构建一个展示城市天际线的 3D 场景,并通过按钮切换不同视角,实现场景的动态交互和视角控制。

目录

  1. 项目背景
  2. 功能展示
  3. 代码实现
  4. 代码解析
  5. 总结与扩展方向

项目背景

在 3D 城市规划和可视化中,天际线展示和动态视角切换是重要的功能。Cesium 提供了高效的 3D 渲染能力,结合 Vue 的前端框架,可以快速构建交互性强的城市天际线视图。

功能展示

该示例实现以下功能:

  • 添加一组虚拟建筑物,展示天际线效果。
  • 设置初始视角,俯视建筑物的整体布局。
  • 实现拉远视角以展示天际线全貌。
  • 支持按方向(如朝北、朝东)调整视角。

代码实现

<script>
import { onMounted, ref } from "vue";
import {
  Viewer,
  Cartesian3,
  Math as CesiumMath,
  Color,
  Entity,
} from "cesium";

export default {
  name: "CitySkyline",
  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,
        creditContainer: null, // 隐藏版权信息
      });

      // 添加城市建筑物示例(虚拟数据)
      addCityBuildings();

      // 设置初始视角
      setInitialView();
    });

    const addCityBuildings = () => {
      const buildings = [
        { lon: -74.006, lat: 40.7128, height: 300, color: Color.RED },
        { lon: -74.002, lat: 40.713, height: 200, color: Color.BLUE },
        { lon: -74.01, lat: 40.715, height: 250, color: Color.GREEN },
        { lon: -74.004, lat: 40.71, height: 400, color: Color.YELLOW },
      ];

      buildings.forEach((building) => {
        viewer.entities.add(
          new Entity({
            position: Cartesian3.fromDegrees(
              building.lon,
              building.lat,
              building.height / 2
            ),
            box: {
              dimensions: new Cartesian3(100, 100, building.height),
              material: building.color,
            },
          })
        );
      });
    };

    const setInitialView = () => {
      viewer.camera.setView({
        destination: Cartesian3.fromDegrees(-74.006, 40.7128, 1000), // 高度 1000 米,正上方
        orientation: {
          heading: CesiumMath.toRadians(0), // 朝北
          pitch: CesiumMath.toRadians(-90), // 直接俯视
          roll: 0,
        },
      });
    };

    const flyToSkyline = () => {
      viewer.camera.flyTo({
        destination: Cartesian3.fromDegrees(-74.010, 40.7128, 5000), // 拉远至 5000 米高
        orientation: {
          heading: CesiumMath.toRadians(0),
          pitch: CesiumMath.toRadians(-90), // 更低的俯视角
          roll: 0,
        },
        duration: 3, // 动画时长 3 秒
      });
    };

    const changeView = (direction) => {
      let heading = 0;
      if (direction === "north") heading = CesiumMath.toRadians(0); // 朝北
      if (direction === "east") heading = CesiumMath.toRadians(90); // 朝东

      viewer.camera.flyTo({
        destination: Cartesian3.fromDegrees(-74.018, 40.6800, 5000), // 高度 5000 米
        orientation: {
          heading: heading,
          pitch: CesiumMath.toRadians(-45), // 更低的俯视角
          roll: 0,
        },
        duration: 2,
      });
    };

    return {
      cesiumContainer,
      setInitialView,
      flyToSkyline,
      changeView,
    };
  },
};
</script>

代码解析

动态添加建筑物

通过 viewer.entities.add 方法,使用 Cartesian3 指定建筑物的位置,并通过 box 属性定义其尺寸和材质颜色。虚拟的建筑物模拟了不同高度和颜色的城市建筑群。

视角切换功能

  1. 初始视角:使用 camera.setView 定义从正上方俯视建筑群的视角。

  2. 拉远视角:通过 camera.flyTo 拉远镜头展示建筑群整体轮廓,动画时长可配置。

  3. 方向切换:动态调整 heading 参数切换不同的观察方向(如朝北或朝东)。

在这里插入图片描述

总结与扩展方向

本文通过 Vue 和 Cesium 实现了一个城市天际线视图的基础应用。未来可以扩展以下功能:

  1. 真实建筑物数据接入:使用实际的建筑物数据构建更加真实的场景。
  2. 动态交互:允许用户通过拖拽或点击选择建筑物,查看详细信息。
  3. 性能优化:使用 Tileset 数据进行大规模建筑渲染,提升性能和可扩展性。

以上改进将使该项目更适用于复杂的城市可视化和交互需求。

标签:视角,false,天际线,08,camera,toRadians,Cesium,heading,CesiumMath
From: https://blog.csdn.net/w131552/article/details/144011592

相关文章

  • SY8089 兼容代替 MT3520B 5.5V、2A、2MHz,同步降压转换器
    产品描述SY8089是一种高效的,直流到直流的降压开关调节器,能够提供高达2A的输出电流。该设备的工作电压范围为从2.6V到5.5V的输入电压范围,并提供从0.6V到VIN的输出电压。在2MHz的固定频率下工作,允许使用小的外部组件,如陶瓷输入和输出帽,以及小的电感器,同时仍然提供低输出波纹。这......
  • 栈与队列 408相关
    栈与队列一、栈的全面解析(一)栈的基本概念栈(Stack)作为一种特殊的线性表,其核心特性是遵循后进先出(LastInFirstOut,LIFO)原则。想象一个垂直放置的容器,只能在顶端进行元素的插入与移除操作,这个顶端就是所谓的栈顶(top),而底部则为栈底(bottom)。例如,一摞叠放的餐盘,最后放置上去......
  • 【技术知识】720P、1080I、1080P,分别代表了什么?
    【技术知识】720P、1080I、1080P,分别代表了什么?中国安防协会 2017年06月27日09:02 北京最简单的理解,它们指的是影像的清晰程度。它们至少至包含两层含义:1.其中的数字代表影像的像素分辨率,720意为画面分辨率是1280*720(水平1280个像素,垂直720个像素),1080意为画面分辨......
  • P9008 [入门赛 #9] 大碗宽面
    "我"->朋友->朋友的敌人首先,我们可以知道朋友和敌人的关系可以用图来存储。设\(g\)为朋友关系所存储的图,\(s\)为敌人关系所存储的东西。如果所有人都互相握手,那么数量就是\(\frac{n(n-1)}{2}\)。然后,我们发现\(1\len\le10^6\),所以明显会超int,所以要开longlong。接下......
  • MIT 操作系统6.S081第一章
    1.1进程和内存fork父进程中fork返回子进程的PID子进程中fork返回0exitexit会让当前进程停止执行并释放资源(包括内存和打开的文件)通常:0表示成功1表示失败waitwait系统调用并返回当前进程已退出或杀死的进程PID,并将子进程的状态复制到wait的地址另外:如果子进......
  • 从零开始学习 sg200x 多核开发之 camera-sensor 添加与测试
    sg2002集成了H.264视频压缩编解码器,H.265视频压缩编码器和ISP;支持HDR宽动态、3D降噪、除雾、镜头畸变校正等多种图像增强和矫正算法。sophpi中没有提供相关图像sensor。本次实验是在milkv-duo256m上添加GC2083。GC2083格科微的GC2083是一款1/2.7英寸......
  • P1125 [NOIP2008 提高组] 笨小猴 C语言
    先说思路:创建了一个函数来判断是否是质数,然后将字符串输入,因为题干中说长度小于100,再加上\0,所以要把长度定义为101,之后对每一个字母用双层循环进行遍历,外层用count来计数,若超过maxn则赋新值,minn同样,之后再对maxn-minn得到的数进行判断即可,之后根据题意用if-else语句即可完成......
  • Cesium中级开发教程之十五:键控地球
    教程示例网站:https://thomaz529.github.io/一、原理 关闭默认屏幕控制机制,开启ScreenSpaceEventHandler自定义键盘事件,viewer.clock.onTick.addEventListener监听键盘事件,并控制相机的前进后退的操作。w键是前进,s键是后退,a键是向左,d键是向右,q键是抬起,e键是降低。二、效果......
  • Cesium初级开发教程之五:Entity#Polyline
    一、简介二、效果图 三、代码1、测地线constredLine=viewer.entities.add({name:"红线",polyline:{positions:Cesium.Cartesian3.fromDegreesArray([-75,35,-125,35]),width:5,material:Cesium.Color.RED,clampToGround:true,//......
  • Cesium初级开发教程之五:Entity#cylinder
    一、圆锥constredCone=viewer.entities.add({position:Cesium.Cartesian3.fromDegrees(-105.0,40.0,200000.0),cylinder:{length:400000.0,topRadius:0.0,bottomRadius:200000.0,outline:true,material:Cesium.Color.RED,},})......