vue2 使用 cesium 【第二篇-相机视角移动+添加模型】

news2024/11/25 19:36:41

vue2 使用 cesium 【第二篇-相机视角移动+添加模型】

搞了一阵子 cesium,小白入门,这东西很牛逼,但是感觉这东西好费劲啊!网上资料不多,每个人的用法又不一样,操作起来真的是绝绝子。之前写了一篇 vue2 使用 cesium 的博文,没有写完,本来想继续写来着,想了一下还是重新开一篇吧。上一篇说到了事件,今天不想写事件了,先写一点儿别的吧,一些基本的操作。注意:仅供参考,切勿尽心。
其次,这篇博文是基于 vue2 使用 cesium 这篇博文继续的,所以说关于 cesium 怎么放到 vue 项目里面,怎么加载图层啥的去看上一篇博文,起码到我写的时候,这个博文是没有过时的,都是亲测可用的,这几篇博文都是一边写、一边敲、一边截图的。

相机视角移动

这小节说一下相机视角的移动,就比如说我们想让地球加载完之后,自动转到一个位置,我们可以使用 cesium 提供的一个方法,把相机移动到我们需要的地方。

这部分的代码就很简单了,首先贴一下官网相关 API。这个相机移动,是在 viewer 下面的 camera 相机下面,有一个 flyTo (options) 方法。

在这里插入图片描述

我代码写的是比较简单的案例了,如果比较复杂的话根据官方给出的 api 去修改。

首先我们封装一个相机移动的函数,然后在使用的时候直接调用这个封装好的函数就可以了。

  /**
   * 相机视角移动函数 - by wjw
   * @param lon 目标经度
   * @param lat 目标纬度
   * @param height  相机高度
   * @param heading  航向角
   * @param pitch  俯仰角
   * @param roll   距中心的距离,以米为单位
   * @param duration  飞行时间
   */
  flyToTarget(lon, lat, height, heading, pitch, roll, duration) {
    this.viewer.camera.flyTo({
      destination: Cesium.Cartesian3.fromDegrees(lon, lat, height), // 经纬度以及相机离地高度
      orientation: {
        heading: Cesium.Math.toRadians(heading), // 航向角
        pitch: Cesium.Math.toRadians(pitch), // 俯仰角
        roll: roll // 距中心的距离,以米为单位
      },
      duration: duration // 飞行时间
    })
  }

然后使用的话也很简单,直接调用一下子就可以了。

// 比如说两秒之后,视角移动到目标区域
setTimeout(() => {
      // 相机视角移动至目标位置
      this.flyToTarget(117.000923, 36.675807, 12000000, 0, -90, 0, 2)
}, 2000)

这样的话,相机移动视角的基本实现就完成了,看一下效果哈。吐槽一下,CSDN 这个上传 gif 图片很不友好,有些效果截图效果不好,gif 更好,但是图片大小有限制,好多我录好了导入发现太大了不让我上传,气!

在这里插入图片描述

看,我刷新一下页面,地球最开始显示的是北美区域,但是过了一会儿,地球视角旋转到了我们设定的目标区域,嗯,就是这个样子。

添加模型

嗯,添加模型这个东西,每个人的方式都有自己的习惯和方式,我这边就简单的写一下哈。

首先如果想要一个真实的模型加载在蓝星,就需要去找一个模型,如果是正经项目开发,添加模型什么的,肯定会有自己设计制作好的模型文件提供,或者是委托第三方采购,但是如果是自己玩怎么办,没关系宝子们,我推荐一个网站叫做 Sketchfab,这个网站是国外的,里面有很多模型可以免费下载,尽管有些精致的需要付费,但是自己玩的话,这都不重要了。

在这里插入图片描述

比如我们搜索 “卫星” ,英文就是 “satellite”。搜索一下,搜出来的模型,右上角带有下载按钮的,就是可以免费下载的了 :

在这里插入图片描述

点击了右上角的下载按钮,会弹窗选择文件类型,我是选择 gltf 格式的,确定好点击蓝色的下载按钮就可以下载下来了。

在这里插入图片描述

下载下来就是个压缩包,里面是我们的模型文件:

在这里插入图片描述

解压后 是这个样子的:

在这里插入图片描述
我们在项目里面引入的就是这个 gltf 文件,但是其他文件,是 gltf 文中调用的,所以说呢,都得要。但是有的文件哈,只有 gltf 文件,他是没有贴图的,所有的数据都保存在 gltf 中了,没有分开相互引用。所以说呢,都一样。

然后把这个解压后的文件夹,直接放在项目的 public -> static -> models 文件夹中就可以了,当然可以根据需要随便改改名字,这个是没有问题的。

在这里插入图片描述

接下来就是在项目中添加这个模型,让他加载到蓝星上面去。

每个人编码方式不一样哈,我把模型单独写了一个 TModels.js 文件引入的:

/**
 * 普通卫星模型
 * @param id 模型唯一标识ID
 * @param position 位置信息
 * @param orientation 方向信息
 * @param description 模型描述
 * @returns {{orientation, description, model: {minimumPixelSize: number, show: boolean, scale: number, maximumSize: number, uri: string}, id, position}}
 */
export const satelliteModel = function (id, position, orientation, description, modelData) {
  return {
    // 模型id
    id: id,
    // 模型类型
    modelType: 'wx',
    // 模型位置
    position: position,
    // 模型自定义数据
    modelData: modelData,
    // 模型方向
    orientation: orientation,
    // 模型资源
    model: {
      // 模型路径
      uri: '/static/models/weixing/scene.gltf',
      scale: 1000.0, //放大倍数
      // 模型是否可见
      show: true,
      // 模型最小刻度
      minimumPixelSize: 150,
      // 模型最大刻度
      maximumSize: 150,
      // // 模型轮廓颜色
      silhouetteColor: Cesium.Color.WHITE,
      // // 模型轮廓大小,单位px
      silhouetteSize: 0,
    },
    // 添加描述
    description: description
  }
}

就是上边这个样子,然后这是抛出了一个方法,传的参数根据自己项目的实际需要进行修改。一些注释我写的也算可以,应该是可以看懂的,如果需要其他的参数或者是效果,可以去官网查一下手册。

这只是创建模型的方法,通过这个方法可以读取出一个模型出来。接下来就是把这个模型放到蓝星上面。把一个模型放到蓝星上面。

首先需要一个经纬度信息,就是把模型放到哪里;
然后一个高度,就是把模型放着这个位置后,距离海平面多高;
然后方向角相关参数,因为模型是三维的,他在这个位置朝向哪里,中心点旋转多少;

首先引入上一步的模型

import { satelliteModel } from './TModels'

然后编写封装一下模型加载的方法:

  /**
   * 添加卫星模型  - by wjw
   * @param lon 经度
   * @param lat 纬度
   * @param height 高度
   * @param heading 航向角
   * @param pitch 俯仰角
   * @param roll 转向角度
   * @param id 模型唯一标识符
   * @param description 描述
   */
  addModel(id, description, lon, lat, height, heading, pitch, roll) {
  	// 模型位置信息
    let position = Cesium.Cartesian3.fromDegrees(lon, lat, height);
    // 设置模型方向
    let hpRoll = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(heading), Cesium.Math.toRadians(pitch), Cesium.Math.toRadians(roll));
    let orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpRoll);
    // 向蓝星添加模型,返回模型对象
    let model = this.viewer.entities.add(satelliteModel(id, position, orientation, description));
    return model
  }

这样想蓝星添加模型的方法就封装好了,我们传参调用一下就可以了。

this.addModel('wjw-001', '测试模型', 117, 36, 1000000, 0, 0, 0)

然后我们的小卫星就加载到蓝星了。

在这里插入图片描述
好了,这是最简单的加载模型到蓝星的方式,还有其他的方式,如果需要的话可以自己看一下研究一下。

移除模型

上一小节说了一下加载模型,加载上了还需要移除。

大体逻辑哈,我们添加模型的时候不是给模型设置了一个 id 吗?这是唯一的,我们根据这个唯一的标识符 id ,去获取到这个模型对象,如果获取到了,就说明蓝星确实有这个 id 的模型,我们直接删除就可以了,如果没有获取到,那么就说明蓝星上没有这个 id 的模型,那就不用处理了,因为没有就不需要删除。

封装方法:

  /**
   * 根据 ID 查询模型  - by wjw
   * @param id 模型唯一标识符 id
   * @returns {Entity}
   */
  getModelById(id) {
    let model = this.viewer.entities.getById(id)
    return model
  }

  /**
   * 删除模型  - by wjw
   * @param model 模型实体对象
   */
  removeModel(model) {
    this.viewer.entities.remove(model)
  }

说哈,其实可以一个方法写完是吧?但是这里我分了两个,这么做肯定有原因的,每个人业务不一样,所以说呢,封装起来肯定有区别,之前有博客被人骂了,说我封装的不对,那是因为具体的业务需求不一样,我就简单写个 demo,根据自己的实际情况自己封装哈。不喜勿喷!

然后就简单了,调用一下就可以了。

	// 添加卫星
    this.addModel('wjw-001', '测试模型', 117, 36, 1000000, 0, 0, 0)
    // 根据 id 获取模型
    let model = this.getModelById('wjw-001')
    console.log(model)

之前添加了一个 id 是 wjw-001 的模型,我们先获取一下看看:

在这里插入图片描述
控制台打印出来了。

如果查询一个没有的 id 看一下效果:

    // 添加卫星
    this.addModel('wjw-001', '测试模型', 117, 36, 1000000, 0, 0, 0)
    // 根据 id 获取模型
    let model = this.getModelById('wjw-002')
    console.log('获取到的模型对象------->> ', model)

没有 id 是 wjw-002 的模型,查询出来看结果:

在这里插入图片描述

没有,和我们想的逻辑对起来了。

然后删除就可以了:

    // 添加卫星
    this.addModel('wjw-001', '测试模型', 117, 36, 1000000, 0, 0, 0)
    // 根据 id 获取模型
    let model = this.getModelById('wjw-001')
    if (model) {
      setTimeout(() => {
        this.removeModel(model) // 四秒后删除
      }, 4000)
    }

看一下效果:

在这里插入图片描述
好了,就这样。

这篇文章先这样,后边继续。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C#进阶】C# 反射

序号系列文章11【C#基础】C# 预处理器指令12【C#基础】C# 文件与IO13【C#进阶】C# 特性文章目录前言1,反射的概念2,使用反射访问特性3,反射的用途4,反射的优缺点比较4.1 优点:4.2 缺点:5,System…

吲哚菁绿-巯基,ICG-SH,科研级别试剂,吲哚菁绿可用于测定心输出量、肝脏功能、肝血流量,和对于眼科血管造影术。

ICG-THIOL,吲哚菁绿-巯基 中文名称:吲哚菁绿-巯基 英文名称:ICG-THIOL 英文别名:ICG-SH 性状:绿色粉末 溶剂:溶于二氯甲烷等其他常规有机溶剂 稳定性:冷藏保存,避免反复冻融。 存储条件&…

搭建SpringBoot多模块微服务项目脚手架(二)

搭建SpringBoot多模块微服务项目脚手架(二) 文章目录搭建SpringBoot多模块微服务项目脚手架(二)1.概述2.封装 MybatisPlus2.1.封装MybatisPlus1.安装依赖2.安装lombok插件3.配置数据库链接信息2.2.创建公共子模块1.创建公共模块common2.创建common_utils模块3.创建service_base…

【C++知识点】文件操作

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…

【六祎 - 前端】npm是什么?npm是网站、注册表、命令行工具组成;windows安装nvm;使用nvm安装npm;

nvm管理并安装npmnpm中文文档npm是什么?npm 由三个独立的部分组成:快速入门命令行npm用法npm配置查找包(package)windows安装nvm使用nvm安装npmps:切换版本下载npm之后的一些配置(Optional)npm中文文档 →_→点我查看…

Java的stream流

Java 8中引入的新特性,stream流通过与Lambda表达式结合,采用函数式编程,简化数组、集合操作,提高效率。 我们操作一个集合,就把他看作一个流,整个流依次执行,(可以类比为一个管道&a…

企业官网怎么做?

企业官网是企业展示形象和吸引潜在客户的重要渠道之一,因此如何打造一款优秀的企业官网显得尤为重要。本文将从策划、设计、开发和上线等方面,为您介绍企业官网的制作步骤。 一、策划 1.明确目标 企业官网的制作需要明确目标,即确定官网的主…

4. SSM 整合

文章目录1. 引言2. 创建工程3. SSM 整合2. 统一结果封装3. 统一异常处理3.1 异常处理器3.2 项目异常处理方案3.2.1 异常分类3.2.2 异常解决方案3.2.3 异常解决方案的具体实现4. 前后台协议联调4.1 列表功能4.2 添加功能4.3 修改功能4.4 删除功能5. 拦截器5.1 拦截器概念1. 引言…

mysql数据库之innodb存储引擎架构之内存架构

一、逻辑存储结构 mysql5.5版本开始,默认使用innodb存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。 架构图(左侧为内存架构,右侧为磁盘架构) 二、 内存架构。 1、缓冲…

SpringBoot使用Redis实现缓存

目录 实现步骤 1. 在 pom.xml 配置文件中添加如下依赖 2. 在 application.properties 中添加如下配置 3. 新建 RedisConfig.class,继承 CachingConfigurerSupport,添加如下方法 4. 新建 RedisService.class 添加如下方法 注意:cacheKey…

看完书上的栈不过瘾,为什么不动手试试呢?

一.栈的基本概念1.栈的定义栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。其中注意几点:栈顶(Top):线性表…

2023年新三板产品及服务研究报告

第一章 概述 全国中小企业股份转让系统(英语:National Equities Exchange and Quotations,缩写NEEQ),简称股转系统,是第三家全国性证券交易场所,因挂牌企业均为高科技企业而不同于原转让系统内…

软件测试12

一 Linux命令的共通知识点 1.通配符的使用 通配符:又叫文件名替换符号,符号具备特殊含义,例如:文件名:test,通配符可以写成???或者* *:代表可以匹配任意长度的文件名(all所有&am…

xxl-job registry fail

解决方法: 1、检查nacos是否正确,一定要注意格式,一般都是addersses的地址问题,一定的要加/不然找不到,本机就不要使用ip了,用localhost。 xxl: job: admin: addresses: http://localhost:8080/xxl-job-ad…

【java】 java开发中 常遇到的各种难点 思路方案

文章目录逻辑删除如何建立唯一索引唯一索引失效问题加密字段模糊查询问题maven依赖冲突问题(jar包版本冲突问题)sql in条件查询时 将结果按照传入顺序排序作为一个开发人员 总会遇到各种难题 本文列举博主 遇见/想到 的例子 ,也希望同学们可以…

【LVGL移植】STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT ST7735S跑LVGL图形demo

【LVGL移植】STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT ST7735S屏幕跑LVGL图形demo🎬运行LVGL 按键组件demo ✨基于STM32CubeMX配置工程是因为方便移植,只要是STM32芯片,拿到我的这个工程源码就可以根据自己的stm32芯片,自…

操作系统复试

2017软学 给出操作系统的定义,分别从资源管理,任务调度,用户接口等三个方面论述操作系统的职能 操作系统是位于硬件层之上、所有其他系统软件层之下的一个系统软件,使得管理系统中的各种软件和硬件资源得以充分利用,方…

MATLAB——求连续系统的响应

题目: 已知RC一阶高通电路图的系统函数H(s)为 H(s)UR(S)U(S)RRR1SCsRCsRC1H(s)\frac {UR(S)}{U(S)}R\frac {R}{R\frac {1}{SC}}\frac {sRC}{sRC1}H(s)U(S)UR(S)​RRSC1​R​sRC1sRC​ 其中:R200Ω ,C0.47μF 。求其幅度频率响应与相位频率响应…

公网NAT网关与VPC NAT网关介绍与实践

NAT网关介绍 NAT网关是一种网络地址转换服务,提供NAT代理(SNAT和DNAT)能力。 公有云NAT分为公网NAT网关和VPC NAT网关。 1)公网NAT网关:提供公网地址转换服务。 2)VPC NAT网关:提供私网地址转换…

商品获价API调用说明:获取商品历史价格信息 代码分享

接口名称:item_history_price公共参数名称类型必须描述keyString是调用key(获取测试key)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString…