Cesium 自定义Primitive

1、为什么要自定义Primitive

      a、在飞机飞行过程中,如果使用entity同时绘制飞机和线的时候,会发现飞机的飞行位置和线的位置不统一,出现差距,出现脱线。

      b、结合代码分析,cesium的线和飞机模型是分开渲染的,渲染的时段不一致,导致飞机在飞行过程的点位结合不上。

       c、采用同批次渲染就不会发生这个问题

2、如何自定义Primitive

        a、使用es6进行编码

        b、使用class

        c、提供update方法

        d、将自定义的primitive加入到primitivecollection中进行渲染

3、实现代码

        案例以初始实验为主,不以飞机案例来做。

        案例以点和文字加入一个渲染队列进行数据渲染。

        1、首先创建一个类CustomPrimitive

        包括类名、构造函数,以及对应的参数

import { LabelCollection, PointPrimitiveCollection, Cartesian3 } from "cesium";
export default class CustomPrimitive {
  /**
   * 自定义对象
   * @param options
   * @param {Cartesian3} options.position 点位置
   * @param {string} options.text 文本内容
   * @param {number} options.pixelSize 点的像素大小
   */
  constructor(options) {
    this._position = options.position;
    this._label = options.text;
    this._pixelSize = options.pixelSize;
    this._ready = false;
    /**
     * 渲染队列
     * @type {[]}
     * @private
     */
    this._primitiveCollection = [];
  }
}

        2、编写update方法,当数据没有完成注册时,执行注册,初始化实体对象

/**
   * 注册
   * @param frameState
   */
  init(frameState) {}

  /**
   * 更新
   * @param frameState
   */
  update(frameState) {
    if (!this._ready) {
      this._ready = true;
      this.init(frameState);
    }
    this._primitiveCollection.forEach((primitive) => {
      primitive && !primitive.isDestroyed() && primitive.update(frameState);
    });
  }

        3、编写注册对象,包括点集合和文本渲染

   

/**
   * 注册
   * @param frameState
   */
  init(frameState) {
    const points = new PointPrimitiveCollection();
    points.add({
      position: this._position,
      color: Color.fromCssColorString("#ff0000", new Color()),
      disableDepthTestDistance: 5000,
      outlineWidth: 1,
      outlineColor: Color.fromCssColorString("#ffff00", new Color()),
      pixelSize: this._pixelSize,
    });
    this._primitiveCollection.push(points);

    let labels = new LabelCollection();
    labels.add({
      text: this._label,
      position: this._position,
      disableDepthTestDistance: 5000,
      fillColor: Color.fromCssColorString("#ffffff", new Color()),
      font: "32px sans-serif",
      horizontalOrigin: HorizontalOrigin.CENTER,
      verticalOrigin: VerticalOrigin.BOTTOM,
      showBackground: true,
      backgroundColor: Color.fromCssColorString("#0EE3F6C1", new Color()),
      backgroundPadding: Cartesian2.fromArray([12, 7]),
    });
    this._primitiveCollection.push(labels);
  }

        4、渲染代码:将定义的Primitive对象加入到渲染队列

let origin2 = Cartesian3.fromDegrees(106, 26, 1600);
let origin21 = Cartesian3.fromDegrees(106, 26, 40);
viewer.camera.flyTo({
    destination: origin2,
    complete: () => {
      let primitive = new CustomPrimitive({
        position: origin21,
        text: "测试",
        pixelSize: 8,
      });
      viewer.scene.primitives.add(primitive);
    },
});

   4、渲染效果

全部代码

import {
  LabelCollection,
  PointPrimitiveCollection,
  Cartesian3,
  Color,
  Cartesian2,
  HorizontalOrigin,
  VerticalOrigin,
} from "cesium";
export default class CustomPrimitive {
  /**
   * 自定义对象
   * @param options
   * @param {Cartesian3} options.position 点位置
   * @param {string} options.text 文本内容
   * @param {number} options.pixelSize 点的像素大小
   */
  constructor(options) {
    this._position = options.position;
    this._label = options.text;
    this._pixelSize = options.pixelSize;
    this._ready = false;
    /**
     * 渲染队列
     * @type {[]}
     * @private
     */
    this._primitiveCollection = [];
  }

  /**
   * 注册
   * @param frameState
   */
  init(frameState) {
    const points = new PointPrimitiveCollection();
    points.add({
      position: this._position,
      color: Color.fromCssColorString("#ff0000", new Color()),
      disableDepthTestDistance: 5000,
      outlineWidth: 1,
      outlineColor: Color.fromCssColorString("#ffff00", new Color()),
      pixelSize: this._pixelSize,
    });
    this._primitiveCollection.push(points);

    let labels = new LabelCollection();
    labels.add({
      text: this._label,
      position: this._position,
      disableDepthTestDistance: 5000,
      fillColor: Color.fromCssColorString("#ffffff", new Color()),
      font: "32px sans-serif",
      horizontalOrigin: HorizontalOrigin.CENTER,
      verticalOrigin: VerticalOrigin.BOTTOM,
      showBackground: true,
      backgroundColor: Color.fromCssColorString("#0EE3F6C1", new Color()),
      backgroundPadding: Cartesian2.fromArray([12, 7]),
    });
    this._primitiveCollection.push(labels);
  }

  /**
   * 更新
   * @param frameState
   */
  update(frameState) {
    if (!this._ready) {
      this._ready = true;
      this.init(frameState);
    }
    this._primitiveCollection.forEach((primitive) => {
      primitive && !primitive.isDestroyed() && primitive.update(frameState);
    });
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跨境电商与支付介绍

1、跨境电商定义和分类; 2、国际贸易清结算; 3、跨境支付; 1、跨境电商定义和分类 跨境电商业务简单说就是指不同国家地域的主体通过电子商务进行交易的一种业务模式。同传统的电商不同,交易双方属于不同的国家。因此&#xff0…

LaMa Image Inpainting 图像修复 ONNX Runtime Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址:https://github.com/advimman/lama 🦙 LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

C++——友元

目录 友元 友元函数 友元函数使用案例 友元类 友元 友元是C提供的一种突破封装(突破类域)的方式,有时提供了便利。但是友元会增加耦合度,但破坏了封装,所以友元不宜多用。友元分为友元函数和友元类。 友元函数 友元…

SpringBoot 的基础使用与入门(总结众多文章与实践)

一:介绍 1、SpringBoot概念 从最根本上来讲,Spring Boot就是一些库的集合,它能够被任意项目的构建系统所使用。简便起见,该框架也提供了命令行界面,它可以用来运行和测试Boot应用。框架的发布版本,包括集成…

电脑DLL修复工具,一键解决计算机dll丢失

mfc120u.dll 是一个属于 Microsoft Visual Studio 2013 或相关版本的 Microsoft Foundation Classes (MFC) 动态链接库(DLL)文件。MFC 是一个用于简化 Windows 应用程序开发的 C 类库,它封装了许多Windows API 函数,使开发者更容易创建 Windows 应用程序…

C语言 vs Rust应该学习哪个?

C语言 vs Rust应该学习哪个? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!&am…

Github配置ssh key的步骤

1. 检查本地主机是否已经存在ssh key 是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key 如下图所示,则表明已经存在 如果存在,直接跳到第三步 2. 生成ssh key 如果不存在ssh key,使用如下命令生…

奇点云:SAFe框架下,我们对平台软件工程生产线做了4项改造

导读: 客户规模扩大,如何保证大数据软件产品和服务质量始终如一?几乎所有成长中的软件厂商,尤其是需要通过私有化部署交付的厂商,都会面临这个问题。正如《人月神话》中多次表明的,单纯地增加人手、扩大团队…

吴恩达deeplearning.ai:sigmoid函数的替代方案以及激活函数的选择

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 文章目录 引入——改进下需求预测模型ReLU函数(整流线性单元 rectified linear unit)线性激活函数(linear activation function)激活函数的选择实现方式为什么需要激活函数 到现在…

使用SSH推拉Github代码

快速使用 ssh-keygen -t rsa -b 4096 -C "your_emailexample.com 创建ssh密钥(一直回车,不要指定目录,不要设置密码)将生成的 ~/id_ras.pub 中的内容复制到Github对应位置即可 1.SSH简介 SSH(Secure Shell&…

Python实现时间序列分析动态因子模型(DynamicFactor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 动态因子模型(Dynamic Factor Models, DFM)是一种统计学和计量经济学中用于处理…

算法项目外包的收费方式

针对算法研究性项目的收费方式和注意事项,这取决于项目的具体性质、规模和所涉及的技术领域。以下是一些常见的收费方式和需要注意的问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 收…

Spring Exception 常见错误

今天,来学习 Spring 的异常处理机制。Spring 提供了一套健全的异常处理框架,以便我们在开发应用的时候对异常进行处理。但是,我们也会在使用的时候遇到一些麻烦,接下来我将通过两个典型的错误案例,带着你结合源码进行深…

WEB漏洞 SSRF简单入门实践

一、漏洞原理 SSRF 服务端请求伪造 原理:在某些网站中提供了从其他服务器获取数据的功能,攻击者能通过构造恶意的URL参数,恶意利用后可作为代理攻击远程或本地的服务器。 二、SSRF的利用 1.对目标外网、内网进行端口扫描。 2.攻击内网或本地的…

Selenium自动化落地实践

01、自动化测试流程图 02、主要过程描述 1、自动化测试的切入点 开展自动化测试的时间点很关键,需要在系统已经过多版本的系统测试,达到稳定之后。 2、可行性分析 在进行项目自动化测试之前,第一步就是要确认其可行性,是否可以…

物联网与智慧城市的融合:构建智能化、便捷化、绿色化的城市未来

一、引言 随着科技的飞速发展和城市化的不断推进,物联网技术正逐步渗透到城市的各个领域,成为推动智慧城市建设的核心力量。物联网与智慧城市的融合,不仅为城市治理提供了高效、智能的解决方案,也为市民的生活带来了前所未有的便…

canvas坐标系统 webgl坐标系统 uv纹理坐标系统 原点

一、canvas原点在左上角,x轴正方向向右,y轴正方向向下,一个点对应一个像素 二、webgl原点在正中间,x轴正方向向右,y轴正方向向上,数据显示范围在[-1,1]之间,超过此范围不显示数据 三、uv原点在左…

【wpf】关于绑定的一点明悟

背景简介 软件功能为,读取一个文件夹下的所有子文件夹,每个文件夹对自动对应生成 一组 “按键四个勾选” 按键点击触发,可以发送与其对应文件夹中的一些内容。这个绑定的过程我在之前的文章有过详细的介绍,非常的简单。 这里回顾…

白话大模型② | 如何提升AI分析的准确性?

白话大模型系列共六篇文章,将通俗易懂的解读大模型相关的专业术语。本文为第二篇:如何提升AI分析的准确性? 作者:星环科技 人工智能产品部 面对AI分析落地时的数量化、准确性、泛化性等问题,让我们稍微深入了解下当前…

【Linux C | 网络编程】getaddrinfo 函数详解及C语言例子

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…