cesium粒子效果——船舰水花效果

news2024/9/20 12:36:38

效果:


实现思路(最后有完整代码):

与上篇文章思路一样 无非就是更换了模型与粒子图片以及粒子的配置,上一篇文章链接:https://blog.csdn.net/m0_63701303/article/details/135551667?spm=1001.2014.3001.5501

1.用clock组件创建时间线

2.时间轴和船的位置信息绑定

3.添加模型让模型按照绑定的位置飞行

4.创建粒子系统--水花效果

粒子所需图片地址链接:链接:https://pan.baidu.com/s/1-9bi9UAyWp9TruX1HL0Krw 
提取码:1234

5.让粒子实时跟随模型移动

直接上代码 详细步骤看上篇文章

<template>
  <div class="btn"></div>
  <div>
    <Map />
  </div>
</template>

<script setup>
import Map from "@/components/map/Map.vue";
import { nextTick, onUnmounted, reactive } from "vue";
const person = reactive({});
nextTick(() => {
  // 创建时间线
  var start = Cesium.JulianDate.fromDate(new Date()); // 设置时间轴当前时间为开始时间
  var start = Cesium.JulianDate.addHours(start, 8, new Cesium.JulianDate()); // 开始时间加8小时改为北京时间
  var stop = Cesium.JulianDate.addSeconds(start, 400, new Cesium.JulianDate()); // 设置结束时间为开始时间加400秒
  // 设置时钟开始时间
  viewer.clock.startTime = start.clone();
  // 设置时钟当前时间
  viewer.clock.currentTime = start.clone();
  // 设置时钟结束时间
  viewer.clock.stopTime = stop.clone();
  // 时间速率,数字越大时间过的越快,设置1好像是和实际时间一样
  viewer.clock.multiplier = 5;
  // 时间轴绑定到viewer上去
  //   viewer.timeline.zoomTo(start, stop);
  // 循环执行,到达终止时间,重新从起点时间开始
  viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
  //   ======================================================
  var data = [
    { long: 121.399999, lat: 32.66277, height: 0, time: 0 },
    { long: 122.507572, lat: 31.570649, height: 0, time: 180 },
    { long: 122.158023, lat: 30.493342, height: 0, time: 400 },
  ];
  let property = computeFlight(data); // 这是通过一个方法把时间轴和船的位置信息绑定了

  //   时间轴和船的位置信息绑定了
  function computeFlight(source) {
    let property = new Cesium.SampledPositionProperty();
    for (let i = 0; i < source.length; i++) {
      let time = Cesium.JulianDate.addSeconds(
        start,
        source[i].time,
        new Cesium.JulianDate()
      );
      let position = Cesium.Cartesian3.fromDegrees(
        source[i].long,
        source[i].lat,
        source[i].height
      );
      // 添加位置,和时间对应
      property.addSample(time, position);
    }
    return property;
  }
  //   添加并移动船
  var entity = viewer.entities.add({
    availability: new Cesium.TimeIntervalCollection([
      new Cesium.TimeInterval({
        start: start,
        stop: stop,
      }),
    ]),
    position: property,
    // 基于位置计算方向角
    orientation: new Cesium.VelocityOrientationProperty(property),
    model: {
      uri: "./model/战舰模型/xyj.gltf", //gltf文件的URL
      scale: 30.05, //放大倍数
      //color: Cesium.Color.fromCssColorString("rgba(0, 253, 239, 0.6)"), // 船模型颜色
      silhouetteColor: Cesium.Color.fromCssColorString("rgba(0, 255, 0, 1)"), // 船模型边框颜色
      silhouetteSize: 1, // 船模型边框宽度
    },
    // path: {
    //   // 船路径
    //   resolution: 1, //
    //   material: new Cesium.PolylineGlowMaterialProperty({
    //     glowPower: 0.1, // 颜色透明度
    //     color: Cesium.Color.fromCssColorString("rgba(0, 253, 239, 0.5)"), // 路线颜色
    //   }),
    //   width: 2, // 路线的显示宽度
    // },
  });
  viewer.trackedEntity = entity; // 视角跟随模型
  // 创建一个例子系统
  let particleSystem = viewer.scene.primitives.add(
    new Cesium.ParticleSystem({
      image: "./imgs/smoke.png", // 波浪图片
      startColor: Cesium.Color.fromCssColorString("rgba(75, 125, 172, 0.6)"), //粒子在其生命初期的颜色
      endColor: Cesium.Color.WHITE.withAlpha(0.0), //粒子在其生命结束的颜色
      startScale: 10.0, //粒子图像的初始比例
      endScale: 150.0, //粒子图像的结束比例
      minimumParticleLife: 1, //粒子生命的可能持续时间的最小范围
      maximumParticleLife: 6, //粒子生命的可能持续时间的最大范围
      speed: 20.0,
      emissionRate: 50.0, //每秒要发射的粒子数
      emitter: new Cesium.CircleEmitter(2), //粒子发射器样式圆形
      //imageSize: new Cesium.Cartesian2(2, 2),//粒子图像尺寸(以像素为单位)的minimumImageSize和maximumImageSize
      minimumImageSize: new Cesium.Cartesian2(0, 0),
      maximumImageSize: new Cesium.Cartesian2(2, 2),
      //主模型参数(位置)
      modelMatrix: computeModelMatrix(entity, Cesium.JulianDate.now()), //从模型转换为世界坐标的4x4转换矩阵
      emitterModelMatrix: computeEmitterModelMatrix(), // 粒子发射器模型矩阵,粒子发射器位置
    })
  );
  // 在粒子系统局部坐标系内转换粒子系统发射器的4x4转换矩阵。
  function computeEmitterModelMatrix() {
    //方向
    let hpr = Cesium.HeadingPitchRoll.fromDegrees(
      80,
      80,
      80,
      new Cesium.HeadingPitchRoll()
    );
    var trs = new Cesium.TranslationRotationScale();
    //以modelMatrix(船)中心为原点的坐标系的xyz轴位置偏移
    trs.translation = Cesium.Cartesian3.fromElements(
      1700,
      0,
      0,
      new Cesium.Cartesian3()
    );
    trs.rotation = Cesium.Quaternion.fromHeadingPitchRoll(
      hpr,
      new Cesium.Quaternion()
    );
    return Cesium.Matrix4.fromTranslationRotationScale(
      trs,
      new Cesium.Matrix4()
    );
  }

  // 计算当前时间点船模型的位置矩阵 //从模型转换为世界坐标的4x4转换矩阵
  function computeModelMatrix(entity, time) {
    // //获取位置
    let position = Cesium.Property.getValueOrUndefined(
      entity.position,
      time,
      new Cesium.Cartesian3()
    );
    if (!Cesium.defined(position)) {
      return undefined;
    }
    //获取方向
    let modelMatrix;
    let orientation = Cesium.Property.getValueOrUndefined(
      entity.orientation,
      time,
      new Cesium.Quaternion()
    );
    if (!Cesium.defined(orientation)) {
      modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(
        position,
        undefined,
        new Cesium.Matrix4()
      );
    } else {
      modelMatrix = Cesium.Matrix4.fromRotationTranslation(
        Cesium.Matrix3.fromQuaternion(orientation, new Cesium.Matrix3()),
        position,
        new Cesium.Matrix4()
      );
    }
    return modelMatrix;
  }
  // 粒子跟随模型
  viewer.scene.preRender.addEventListener((scene, time) => {
    particleSystem.modelMatrix = computeModelMatrix(entity, time); // 粒子系统和模型绑定,让他跟着模型跑
  });
});

onUnmounted(() => {});
</script>
<style scoped lang='less'>
.btn {
  position: absolute;
  left: 300px;
  top: 30px;
  z-index: 999;
}
</style>


 

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

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

相关文章

neo4j 图数据库 py2neo 操作 示例代码

文章目录 摘要前置NodeMatcher & RelationshipMatcher创建节点查询获取节点节点有则查询&#xff0c;无则创建创建关系查询关系关系有则查询&#xff0c;无则创建 Cypher语句创建节点 摘要 利用py2neo包&#xff0c;实现把excel表里面的数据&#xff0c;插入到neo4j 图数据…

React Native 环境安装

Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. 搭建开发环境 React Native 中文网 Homebrew&#xff08;包管理器&#xff09; → rvm&#xff08;ruby版本管理&#xff09; → ruby → cocoapods 安装 Homebrew Homebrew /bin/ba…

java每日一题——ATM系统编写(答案及编程思路)

前言&#xff1a; 基础语句学完&#xff0c;也可以编写一些像样的程序了&#xff0c;现在要做的是多加练习&#xff0c;巩固下知识点&#xff0c;打好基础&#xff0c;daydayup! 题目&#xff1a;模仿银行ATM系统&#xff0c;可以创建用户&#xff0c;存钱&#xff0c;转账&…

分布式搜索引擎--认识

elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 。 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack&#xff08;ELK&#xff09;。被广泛…

极简Oracle 11g Release 2 (11.2.0.1.0)

注意&#xff1a;此法无法安装oracle11g(11.2.0.4)&#xff0c;会报如下错&#xff1a; [FATAL] [INS-10105] The given response file /assets/db_install.rsp is not valid. 一、下载解压ORACLE安装包。 从 oracle 官网 下载所需要的安装包&#xff0c;这里我们以 oracle 11…

【MCAL】MCU模块详解

目录 前言 正文 1. MCU模块介绍 2. MCU依赖的模块 3. MCU模块提供服务 3.1 时钟的初始化 3.2 MCU模式的配置 3.3 MCU软件复位功能 3.4 RAM的初始化 4.MCU重要数据类型 4.1 Mcu_ResetType 4.2 Mcu_ModeType 5. MCU重要API 5.1 Mcu_Init 5.2 Mcu_InitClock 5.3 M…

Open3D 点云等比例缩放(20)

Open3D 点云等比例缩放(20) 一、算法介绍二、算法实现1.代码世人慌慌张张,不过图碎银几两, 偏偏这碎银几两,能解世间万种慌张。 一、算法介绍 实现这样一个功能,沿着中心,按照指定的比例,比如1/2,缩小或者放大点云,保存到新的文件中 二、算法实现 1.代码 import…

Matlab:toposort

语法&#xff1a; n toposort(G) %调用toposort函数&#xff0c;对有向图G进行拓扑排序&#xff0c;并将排序结果存储在变量n中 n toposort(G,Order,algorithm) [n,H] toposort(___) %使用了两个输出参数的形式来调用toposort函数。除了返回排序结果n外&am…

uniapp 编译后文字乱码的解决方案

问题: 新建的页面中编写代码&#xff0c;其中数字和图片都可以正常显示&#xff0c;只有中文编译后展示乱码 页面展示也是乱码 解决方案: 打开HuilderX编辑器的【文件】- 【以指定编码重新打开】- 【选择UTF-8】 然后重新编译就可以啦~ 希望可以帮到你啊~

bootloader学习笔记及SD卡启动盘制作

Bootloader介绍 在操作系统运行之前运行的一小段代码&#xff0c;用于将软硬件环境初始化到一个合适的状态&#xff0c;为操作系统的加载和运行做准备&#xff08;其本身不是操作系统&#xff09; Bootloader基本功能 1、初始化软硬件环境 2、引导加载linux内核 3、给linux…

golang实现rpc方法二:使用jsonrpc库【跨平台】

首先在golang实现rpc方法一net/rpc库中实现了RPC方法&#xff0c;但是那个方法不是跨平台的&#xff0c;没法在其他语言中调用这个实现的RPC方法&#xff0c;接下来我们可以通过jsonroc库实现跨语言的RPC方法。俩种实现方式的代码其实也是差不多的&#xff0c;大差不差&#xf…

变更数据捕获:概述、原因及最佳实践

当今的企业&#xff0c;尤其是那些已将数字化转型置于优先地位的企业&#xff0c;需要接近实时的数据。每周和每月的批处理已不再适用。然而&#xff0c;从多种来源获取实时数据以自动化流程并做出动态优化决策并非易事。 最近&#xff0c;在为客户重新架构遗留系统并将单体架构…

强化学习应用(六):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

大模型实战营Day4 XTuner大模型单卡低成本微调实战

FINETUNE简介 LLM下游应用中&#xff0c;增量预训练和指令跟随是经常会用到的两种微调模式 指令跟随微调 使用场景&#xff1a;让模型学会对话模板&#xff0c;根据人类指令进行对话 训练数据&#xff1a;高质量的对话&#xff0c;问答数据 为什么需要指令微调&#xff1f; 因为…

YZ虚拟资源下载源码-支持对接公众号-对接支付

这款系统内置的模板是电脑系统下载站的类型&#xff0c;当然你也可以用作其他类型&#xff0c;例如软件下载&#xff0c;其他类型的资源下载&#xff0c;知识付费下载等&#xff0c;改下文字内容即可。 支持商城系统&#xff0c;后台可配置支付。青狐修改增加了很多可用性。 …

遭受慢速连接攻击怎么办?怎么预防

慢速连接攻击是一种常见的网络攻击方式&#xff0c;其原理是利用HTTP协议的特性&#xff0c;在建立了与Http服务器的连接后&#xff0c;尽量长时间保持该连接&#xff0c;不释放&#xff0c;达到对Http服务器的攻击。 慢速连接攻击的危害包括以下几个方面&#xff1a; 1.资源…

Python Flask教程

Flask Doc: https://rest-apis-flask.teclado.com/docs/course_intro/what_is_rest_api/Github: https://github.com/tecladocode/rest-apis-flask-python 1. 最简单的应用 最小应用 from flask import Flaskapp Flask(__name__)app.route("/") def hello_world()…

Qt6安装教程

由于QT在5.14版本后不再有离线安装版本&#xff0c;均需要通过在线安装 1.下载exe安装包 打开Open Source Development | Open Source License | Qt&#xff0c;往下拉&#xff0c;找到红框所示的按钮 点进去后点击Download即可 2 安装 下载完成后可得到qt-unified-windows…

AI大模型学习笔记一

一、商业观点&#xff1a;企业借助大模型获得业务增长可能 二、底层原理&#xff1a;transformer 1&#xff09;备注 ①下面每个步骤都是自回归的过程&#xff08;aotu-regressive&#xff09;&#xff1a;已输出内容的每个字作为输入&#xff0c;一起生成下一个字 ②合起来就…

Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?

技术背景 我们在做Windows平台RTMP推送、轻量级RTSP服务录像模块的时候&#xff0c;部分开发者抱怨路径无法设置中文&#xff0c;只能设置为英文。 以C#的接口为例&#xff0c;早期的设计如下&#xff1a; /** 设置本地录像目录, 必须是英文目录&#xff0c;否则会失败*/[DllI…