Cesium-广告牌

news2025/7/14 17:31:54

创作来源

1、道路标识牌

2、视频广告

创作思路

1、创建有颜色柱体

2、创建长方体并带有纹理

3、将视频问题贴到长方体上

实现步骤

1、创建柱体

/**
 * 获取柱状几何对象
 * @param radius
 * @param height
 * @return {Geometry}
 */
export const getCylinderGeometry = (radius, height) => {
  let position = [];
  let normal = [];
  let step = 360;
  for (let i = 0; i < step; i++) {
    let angleR = CesiumMath.toRadians((i * 360) / step);
    position.push(
      new Cartesian3(radius * Math.cos(angleR), radius * Math.sin(angleR), 0)
    );
    position.push(
      new Cartesian3(
        radius * Math.cos(angleR),
        radius * Math.sin(angleR),
        height
      )
    );
    normal.push(new Cartesian3(Math.cos(angleR), Math.sin(angleR), 0));
    normal.push(new Cartesian3(Math.cos(angleR), Math.sin(angleR), 0));
  }
  let positionArray = new Float32Array(position.length * 3);
  let normalArray = new Float32Array(normal.length * 3);
  for (let i = 0; i < position.length; i++) {
    positionArray[i * 3] = position[i].x;
    positionArray[i * 3 + 1] = position[i].y;
    positionArray[i * 3 + 2] = position[i].z;

    normalArray[i * 3] = normal[i].x;
    normalArray[i * 3 + 1] = normal[i].y;
    normalArray[i * 3 + 2] = normal[i].z;
  }
  let indices = new Uint16Array(step * 2 * 3);
  for (let i = 0; i < step; i++) {
    indices[i * 6] = i * 2;
    indices[i * 6 + 1] = i * 2 + 1;
    indices[i * 6 + 2] = i * 2 + 2;
    indices[i * 6 + 3] = i * 2 + 1;
    indices[i * 6 + 4] = i * 2 + 2;
    indices[i * 6 + 5] = i * 2 + 3;
    if (i === step - 1) {
      indices[i * 6 + 2] = 0;
      indices[i * 6 + 4] = 0;
      indices[i * 6 + 5] = 1;
    }
  }
  return new Geometry({
    attributes: {
      position: new GeometryAttribute({
        componentDatatype: ComponentDatatype.FLOAT,
        componentsPerAttribute: 3,
        values: positionArray,
      }),
      normal: new GeometryAttribute({
        componentDatatype: ComponentDatatype.FLOAT,
        componentsPerAttribute: 3,
        values: normalArray,
      }),
    },
    indices: indices,
    primitiveType: PrimitiveType.TRIANGLES,
    boundingSphere: BoundingSphere.fromVertices(positionArray),
  });

2、创建带纹理的立方体

/**
 * 正方体
 * @param lg
 * @param width
 * @param thickness
 * @param baseX
 * @param baseY
 * @param baseZ
 * @return {Geometry}
 */
export const getCuboidGeometry = (
  lg,
  width,
  thickness,
  baseX,
  baseY,
  baseZ
) => {
  let pLow1 = {
    x: baseX,
    y: thickness + baseY,
    z: baseZ,
  };
  let pLow2 = {
    x: baseX + lg,
    y: thickness + baseY,
    z: baseZ,
  };
  let pLow3 = {
    x: baseX + lg,
    y: baseY,
    z: baseZ,
  };
  let pLow4 = {
    x: baseX,
    y: baseY,
    z: baseZ,
  };
  let pTop1 = {
    x: baseX,
    y: thickness + baseY,
    z: baseZ + width,
  };
  let pTop2 = {
    x: baseX + lg,
    y: thickness + baseY,
    z: baseZ + width,
  };
  let pTop3 = {
    x: baseX + lg,
    y: baseY,
    z: baseZ + width,
  };
  let pTop4 = {
    x: baseX,
    y: baseY,
    z: baseZ + width,
  };

  let positions = [];
  let normal = [];
  let st = [];
  //face1,面向
  {
    positions.push(new Cartesian3(pLow1.x, pLow1.y, pLow1.z));
    positions.push(new Cartesian3(pTop1.x, pTop1.y, pTop1.z));
    positions.push(new Cartesian3(pLow2.x, pLow2.y, pLow2.z));
    positions.push(new Cartesian3(pTop2.x, pTop2.y, pTop2.z));

    st.push(new Cartesian2(1, 0));
    st.push(new Cartesian2(1, 1));
    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 1));

    normal.push(new Cartesian3(0, 1.0, 0));
    normal.push(new Cartesian3(0, 1.0, 0));
    normal.push(new Cartesian3(0, 1.0, 0));
    normal.push(new Cartesian3(0, 1.0, 0));
  }
  //face2,侧面
  {
    positions.push(new Cartesian3(pLow2.x, pLow2.y, pLow2.z));
    positions.push(new Cartesian3(pTop2.x, pTop2.y, pTop2.z));
    positions.push(new Cartesian3(pLow3.x, pLow3.y, pLow3.z));
    positions.push(new Cartesian3(pTop3.x, pTop3.y, pTop3.z));

    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));

    normal.push(new Cartesian3(1.0, 0, 0));
    normal.push(new Cartesian3(1.0, 0, 0));
    normal.push(new Cartesian3(1.0, 0, 0));
    normal.push(new Cartesian3(1.0, 0, 0));
  }
  //face3,面向
  {
    positions.push(new Cartesian3(pLow3.x, pLow3.y, pLow3.z));
    positions.push(new Cartesian3(pTop3.x, pTop3.y, pTop3.z));
    positions.push(new Cartesian3(pLow4.x, pLow4.y, pLow4.z));
    positions.push(new Cartesian3(pTop4.x, pTop4.y, pTop4.z));

    st.push(new Cartesian2(1, 0));
    st.push(new Cartesian2(1, 1));
    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 1));

    normal.push(new Cartesian3(0, -1.0, 0));
    normal.push(new Cartesian3(0, -1.0, 0));
    normal.push(new Cartesian3(0, -1.0, 0));
    normal.push(new Cartesian3(0, -1.0, 0));
  }
  //face4,侧面
  {
    positions.push(new Cartesian3(pLow4.x, pLow4.y, pLow4.z));
    positions.push(new Cartesian3(pTop4.x, pTop4.y, pTop4.z));
    positions.push(new Cartesian3(pLow1.x, pLow1.y, pLow1.z));
    positions.push(new Cartesian3(pTop1.x, pTop1.y, pTop1.z));

    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));

    normal.push(new Cartesian3(-1.0, 0, 0));
    normal.push(new Cartesian3(-1.0, 0, 0));
    normal.push(new Cartesian3(-1.0, 0, 0));
    normal.push(new Cartesian3(-1.0, 0, 0));
  }
  //地面,面向
  {
    positions.push(new Cartesian3(pLow1.x, pLow1.y, pLow1.z));
    positions.push(new Cartesian3(pLow4.x, pLow4.y, pLow4.z));
    positions.push(new Cartesian3(pLow2.x, pLow2.y, pLow2.z));
    positions.push(new Cartesian3(pLow3.x, pLow3.y, pLow3.z));

    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));

    normal.push(new Cartesian3(0, 0, -1.0));
    normal.push(new Cartesian3(0, 0, -1.0));
    normal.push(new Cartesian3(0, 0, -1.0));
    normal.push(new Cartesian3(0, 0, -1.0));
  }
  //顶面
  {
    positions.push(new Cartesian3(pTop1.x, pTop1.y, pTop1.z));
    positions.push(new Cartesian3(pTop4.x, pTop4.y, pTop4.z));
    positions.push(new Cartesian3(pTop2.x, pTop2.y, pTop2.z));
    positions.push(new Cartesian3(pTop3.x, pTop3.y, pTop3.z));

    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));
    st.push(new Cartesian2(0, 0));

    normal.push(new Cartesian3(0, 0, 1.0));
    normal.push(new Cartesian3(0, 0, 1.0));
    normal.push(new Cartesian3(0, 0, 1.0));
    normal.push(new Cartesian3(0, 0, 1.0));
  }
  let positionArray = new Float32Array(positions.length * 3);
  let normalArray = new Float32Array(positions.length * 3);
  let stArray = new Float32Array(positions.length * 2);
  for (let i = 0; i < positions.length; i++) {
    positionArray[i * 3] = positions[i].x;
    positionArray[i * 3 + 1] = positions[i].y;
    positionArray[i * 3 + 2] = positions[i].z;

    normalArray[i * 3] = normal[i].x;
    normalArray[i * 3 + 1] = normal[i].y;
    normalArray[i * 3 + 2] = normal[i].z;

    stArray[i * 2] = st[i].x;
    stArray[i * 2 + 1] = st[i].y;
  }
  let indices = new Uint16Array(6 * 6);
  for (let i = 0; i < 6; i++) {
    indices[i * 6] = i * 4;
    indices[i * 6 + 1] = i * 4 + 1;
    indices[i * 6 + 2] = i * 4 + 2;
    indices[i * 6 + 3] = i * 4 + 1;
    indices[i * 6 + 4] = i * 4 + 2;
    indices[i * 6 + 5] = i * 4 + 3;
  }
  return new Geometry({
    attributes: {
      position: new GeometryAttribute({
        componentDatatype: ComponentDatatype.FLOAT,
        componentsPerAttribute: 3,
        values: positionArray,
      }),
      normal: new GeometryAttribute({
        componentDatatype: ComponentDatatype.FLOAT,
        componentsPerAttribute: 3,
        values: normalArray,
      }),
      st: new GeometryAttribute({
        componentDatatype: ComponentDatatype.FLOAT,
        componentsPerAttribute: 2,
        values: stArray,
      }),
    },
    indices: indices,
    primitiveType: PrimitiveType.TRIANGLES,
    boundingSphere: BoundingSphere.fromVertices(positionArray),
  });
};

3、创建纹理

let sampler = new Sampler({
  wrapS: TextureWrap.REPEAT,
  warpT: TextureWrap.REPEAT,
});
let texture = new Texture({
  context: context,
  source: image,
  sampler: sampler,
});
this.texture.push(texture);

4、渲染对象

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

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

相关文章

how to deploy parent pom without module deployment

how to deploy parent pom without module deployment deploy -N -f pom.xml

从1-20之间随机抽取5个数,输出抽取出来的5个数之和与剩余未被抽取的15个数之和

从1-20之间随机抽取5个数&#xff0c;输出抽取出来的5个数之和与剩余未被抽取的15个数之和&#xff0c;每个答案独占一行 代码&#xff1a; #include <cstdio> #include <stdlib.h> int main() {int arr[20] { 0 };printf("抽取的5个随机数是&#xff1a;&…

Unity(第八部)Vector3的三维向量和旋转(坐标和缩放也简单讲了一下)

对了&#xff0c;Unity的生命周期自行百度吧&#xff1b;我这边整理的都不是很满意 Vector 是结构体 Vector2是指里面有两个变量 Vector3是指里面有三个变量 Vector4是指里面有四个变量 Vector3常用的变量就是x y z,所以&#xff0c;它可以代表坐标、旋转、缩放、三维向量 创…

Vue3 学习笔记(Day5)

「写在前面」 本文为尚硅谷禹神 Vue3 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. Vue3 学习笔记&#xff08;Day1&#xff09; 2. Vue3 学习笔记&#xff08;Day2&…

云桥通+IDC数据中心:SDWAN企业组网实现高效连接案例

一、需求和背景 云桥通曾服务的一家大型跨国企业C公司&#xff0c;C公司多个数据中心分布在全球各地。为了实现数据共享和协作&#xff0c;数据中心之间需要建立稳定高效的网络连接。然而&#xff0c;传统的MPLS专线网络存在昂贵的成本和漫长的开通周期&#xff0c;无法满足企…

点云检测网络PointPillar

1. 提出PointPillar的目的 在此之前对于不规则的稀疏的点云的做法普遍分为两派: 一是把点云数据量化到一个个Voxel里&#xff0c;常见的有VoxelNet和SECOND , 但是这种做法比较普遍的问题是由于voxel大部分是空集所以会浪费算力(SECOND利用稀疏卷积解决了它) &#xff0c;但是…

本地大模型运行框架Ollama

什么是 Ollama &#xff1f; Ollama 是一个简明易用的本地大模型运行框架。能在本地启动并运行 Llama 2、Mistral、Gemma 及其他大语言模型。 和老苏之前介绍的 LocalAI 比较类似&#xff0c;但是加载模型更容易&#xff0c;感觉上比较像 docker&#xff0c;也采用了 tags 来区…

Eureka 入门教程

Eureka 介绍 1. 注册中心概述 什么是注册中心&#xff1f; 给客户端提供可供调用的服务列表&#xff0c;客户端在进行远程调用&#xff08;RPC&#xff09;时&#xff0c;根据服务列表选择服务提供方的服务地址进行服务调用 注册中心的核心功能 注册&#xff1a;服务提供者上…

androidjetpack应用指南,超通俗解析

前言 每年的3、4月份是各大企业为明年拓展业务大量吸纳人才的关键时期&#xff0c;招聘需求集中、空缺岗位多&#xff0c;用人单位也习惯在初秋进行大规模招聘。 金九银十&#xff0c;招聘旺季&#xff0c;也是一个求职旺季。 不打无准备的仗&#xff0c;在这种关键时期&…

文件上传之后再次打开,文件依然存在

目录 1.上传说明 2.问题1 3.问题2 4.其他问题 1.上传说明 文件上传使用了单独的组件&#xff0c;使用对话框内嵌套上传组件的方式&#xff0c;在主画面中点击导入按钮&#xff0c;弹出对话框。 2.问题1 问题&#xff1a; ①上传文件后&#xff0c;点击遮罩层取消或者点击…

Maven下载、安装、配置教程

maven是一个项目管理的工具&#xff0c;maven自身是纯java开发的&#xff0c;可以使用maven对java项目进行构建、依赖管理。 通常我们靠手动下载jar包引入项目中是非常浪费时间的&#xff0c;我们可以通过maven工具帮我们导入jar包提高开发效率。 第一步&#xff1a;下载Mave…

【QT+QGIS跨平台编译】之五十五:【QGIS_CORE跨平台编译】—【qgsmeshcalcparser.cpp生成】

文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…

C++设计模式——抽象工厂模式

文章目录 抽象工厂模式的主要组成部分抽象工厂模式的一个典型例子抽象工厂模式用于其他场景抽象工厂模式与其他设计模式结合使用 C 中的抽象工厂模式是一种创建型设计模式&#xff0c;它主要用于处理对象家族的创建&#xff0c;这些对象之间可能存在一定的关联关系或属于相同的…

springboot227旅游管理系统

springboot旅游管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在…

C++ deque详解以及容器适配器

目录 1.容器适配器 2.deque的使用 2.1deque的介绍 2.2deque的缺陷 2.3deque作为stack和queue的可行性 2.4 deque类的使用 2.4.1deque的构造函数 2.4.2deque容量操作 2.4.3deque赋值&#xff0c;插入 1.容器适配器 适配器是一种设计模式&#xff08;设计模式是一套被人…

STL常见容器(stack、queue容器)---C++

STL常见容器目录&#xff1a; 4.stack容器4.1 stack 基本概念4.2 stack 常用接口 5.queue容器5.1 queue常用接口5.2 queue常用接口 4.stack容器 4.1 stack 基本概念 概念&#xff1a; stack是一种先进后出(First In Last Out,FILO)的数据结构&#xff0c;它只有一个出口. 注意…

重推请求之curl和fiddler

在实际的项目中会有出现问题&#xff0c;想重现的场景&#xff0c;比较重新调用一个服务&#xff0c;那么如何进行快速的重推请求呢&#xff0c;记录下来&#xff0c;方便备查。 主要有curl和fiddler两种方式&#xff0c;下面详细说。 方式一、curl 命令 curl 是一个利用URL规…

MySQL:索引有哪些(清晰明了)

一提到索引&#xff0c;可能就会想到B树索引、Hash索引、聚簇索引、主键索引、唯一索引、联合索引等等&#xff0c;但这些名词并不能混为一谈&#xff0c;他们有重复的部分&#xff0c;是从不同方面给索引取的名字。 从数据结构上来讲&#xff1a;B树索引、Hash索引、Full-text…

Spring注解之处理常见的 HTTP 请求

5 种常见的请求类型: GET &#xff1a;请求从服务器获取特定资源。举个例子&#xff1a;GET /users&#xff08;获取所有学生&#xff09;POST &#xff1a;在服务器上创建一个新的资源。举个例子&#xff1a;POST /users&#xff08;创建学生&#xff09;PUT &#xff1a;更新…

总结成果,擘画蓝图 | 易我科技召开2023年度总结暨2024年规划大会

2024年2月1日下午&#xff0c;易我科技举行了2023年度总结暨2024年规划大会。 01 首先&#xff0c;易我科技总经理万建华对2023年度整体工作进行了总结&#xff0c;对取得的经营成果给予了充分肯定。 ▲ 万总公布2023年经营成果 在肯定成绩的同时&#xff0c;也必须正视存在…