Cesium实现渐变面

一、效果图

二、实现思路 

        使用着色器,通过纹理坐标和其他参数计算出材质的颜色和透明度。通过给定的颜色、漫反射强度和透明度,计算出最终的反射颜色和透明度,并且根据给定的中心点位置和当前像素的纹理坐标,计算出距离中心的距离用来做透明度的参考值,然后计算得到的颜色加载到对应的材质上。

三、完整代码

<template>
  <div>
    <button @click="handlePolygon()">渐变面</button>
    <CesiumViewer />
  </div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import CesiumViewer from "./components/cesiumViewer.vue";

let viewer;
onMounted(() => {
  viewer = window.cesiumViewer;
});

const updateResolutionScale = (viewer) => {
  //判断是否支持图像渲染像素化处理
  if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) {
    viewer.resolutionScale = window.devicePixelRatio;
  }
};

const PolyGradientMaterial = `uniform vec4 color;
uniform float diffusePower;
uniform float alphaPower;
uniform float globalAlpha;
uniform vec2 center;

czm_material czm_getMaterial(czm_materialInput materialInput) {
  czm_material material = czm_getDefaultMaterial(materialInput);

  float time = czm_frameNumber/600.;
  float per = fract(time);

  vec2 st = materialInput.st;
  float alpha = distance(st, center);

  material.alpha = color.a * alpha * alphaPower * globalAlpha;
  material.diffuse = color.rgb * diffusePower;
  return material;
}`;

let index = 0;
const arrColor = [
  "rgb(18,76,154)",
  "rgb(15,176,255)",
   "#40C4E4",
   "#42B2BE",
   "rgb(51,176,204)",
    "#8CB7E5",
   "rgb(0,244,188)",
  "#139FF0",
];

const getColor = () => {
  return arrColor[++index % arrColor.length];
};

let totalLabel = 0;

const addPolygon = (positions, color, name) => {
  const polygonOptions = {
    extrudedHeight: 1000,
    polygonHierarchy: new Cesium.PolygonHierarchy(positions),
  };

  const geometry = new Cesium.PolygonGeometry(polygonOptions);

  const geometryInstance = new Cesium.GeometryInstance({
    geometry: geometry,
    id: "chinaocean",
  });

  const material = new Cesium.Material({
    fabric: {
      source: PolyGradientMaterial,
      uniforms: {
        color: Cesium.Color.fromCssColorString(color),
        diffusePower: 1.8,
        alphaPower: 1.2,
        center: new Cesium["Cartesian2"](0.5, 0.5),
        globalAlpha: 0x1,
      },
    },
    translucent: true,
  });

  const primitive = new Cesium.Primitive({
    releaseGeometryInstances: false,
    asynchronous: false,
    geometryInstances: [geometryInstance],
    appearance: new Cesium.EllipsoidSurfaceAppearance({
      material: material,
    }),
  });

  // const removeListener = viewer.scene.postRender.addEventListener(() => {
  //   if (!primitive.ready) {
  //     return;
  //   }

  //   totalLabel += 1;
  //   const position = primitive._boundingSpheres[0].center;
  //   viewer.entities.add({
  //     position,
  //     label: {
  //       text: name,
  //       font: "32px 楷体",
  //       fillColor: Cesium.Color.WHITE,
  //       outlineColor: Cesium.Color.BLACK,
  //       style: Cesium.LabelStyle.FILL_AND_OUTLINE,
  //       outlineWidth: 2,
  //       disableDepthTestDistance: 1000000000,
  //       scale: 0.5,
  //       pixelOffset: new Cesium.Cartesian2(0, -10),
  //       backgroundColor: new Cesium.Color.fromCssColorString(
  //         "rgba(0, 0, 0, 0.7)"
  //       ),
  //       backgroundPadding: new Cesium.Cartesian2(10, 10),
  //       verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  //     },
  //   });
  //   removeListener();
  // });

  viewer.scene.primitives.add(primitive);
};

const handlePolygon = () => {
  updateResolutionScale(viewer);
  viewer.scene.skyBox.show = false;
  var mapOptions = {
    scene: {
      center: {
        lat: 30.037072,
        lng:   91.091762,
        alt: 1600000.0,
        heading: 160000.0,
        // 视角
        heading: 355,
        pitch: -88,
      },
    },
  };
  viewer.camera.flyTo({
    orientation: {
      heading: Cesium.Math.toRadians(mapOptions.scene.center.heading),
      pitch: Cesium.Math.toRadians(mapOptions.scene.center.pitch),
    },
    destination: Cesium.Cartesian3.fromDegrees(
      mapOptions.scene.center.lng,
      mapOptions.scene.center.lat,
      mapOptions.scene.center.alt
    ),
    duration: 0,
  });

  Cesium.GeoJsonDataSource.load(
    "https://geo.datav.aliyun.com/areas_v3/bound/540100.json"
  ).then((dataSource) => {
    const entities = dataSource.entities.values;
    // 遍历所有实体
    entities.forEach((entity, index) => {
      if (entity.polygon) {
        const positions = entity.polygon.hierarchy._value.positions;
        addPolygon(positions, getColor(index), entity.name);
      }
    });
  });
};
</script>
<style scoped></style>

*注:<CesiumViewer/>

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

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

相关文章

怎么快速上手虚拟化(容器)技术——以 Docker 为例

Docker 整体介绍 Docker 是一种使用 Go 语言开发的容器工具。所谓容器&#xff0c;实际上是一种虚拟化技术&#xff0c;用于为应用提供虚拟化的运行环境&#xff0c;相较于虚拟机具有轻量级、低延迟的特性。 下面是对上述介绍的说明&#xff1a; 应用程序运行需要一定的依赖…

在 C#和ASP.NET Core中创建 gRPC 客户端和服务器

关于gRPC和Google protobuf gRPC 是一种可以跨语言运行的现代高性能远程过程调用 (RPC) 框架。gRPC 实际上已经成为 RPC 框架的行业标准&#xff0c;Google 内外的组织都在使用它来从微服务到计算的“最后一英里”&#xff08;移动、网络和物联网&#xff09;的强大用例。 gRP…

canvas画图,画矩形可拖拽移动,可拖拽更改尺寸大小

提示&#xff1a;canvas画图&#xff0c;画矩形&#xff0c;圆形&#xff0c;直线&#xff0c;曲线可拖拽移动 文章目录 前言一、画矩形&#xff0c;圆形&#xff0c;直线&#xff0c;曲线可拖拽移动总结 前言 一、画矩形&#xff0c;圆形&#xff0c;直线&#xff0c;曲线可拖…

壁纸小程序Vue3(分类页面和用户页面基础布局)

1.配置tabBar pages.json "tabBar": {"color": "#9799a5","selectedColor": "#28B389","list": [{"text": "推荐","pagePath": "pages/index/index","iconPath&quo…

6.6物联网RK3399项目开发实录-驱动开发之LED灯的使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接&#xff1a;https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f LED 使用 前言 AIO-3399J 开发板上有 2 个 LED 灯&#xff0c;如下表所示&#xff1a; 可通过使用 LED 设备子系统或者直…

EXCEL-VB编程实现自动抓取多工作簿多工作表中的单元格数据

一、VB编程基础 1、 EXCEL文件启动宏设置 文件-选项-信任中心-信任中心设置-宏设置-启用所有宏 汇总文件保存必须以宏启动工作簿格式类型进行保存 2、 VB编程界面与入门 参考收藏 https://blog.csdn.net/O_MMMM_O/article/details/107260402?spm1001.2014.3001.5506 二、…

云计算探索-剖析虚拟化技术

引言 虚拟化技术&#xff0c;作为现代信息技术架构的核心构成元素&#xff0c;以其独特的资源抽象与模拟机制&#xff0c;成功地瓦解了物理硬件与操作系统间的刚性连接&#xff0c;开创了一个资源共享、灵活调配的崭新天地。本文将详细解析虚拟化技术的内涵、发展历程、分类及特…

Android 天气APP(二)获取定位信息

<LinearLayout xmlns:android“http://schemas.android.com/apk/res/android” xmlns:app“http://schemas.android.com/apk/res-auto” xmlns:tools“http://schemas.android.com/tools” android:gravity“center” android:layout_width“match_parent” android:la…

编曲知识16:贴唱混音思路 录音 对轨 降噪

贴唱混音思路 录音 对轨 降噪小鹅通-专注内容付费的技术服务商https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_6607f17ae4b092c1684f438a?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv 混音思路 贴唱混音、分轨混音 贴唱:由翻唱混音发展而来,指仅处理人声和伴奏…

二期 1.1 微服务是什么?微服务与分布式架构的区别是什么?SpringBoot与Spring Cloud的区别是什么?

文章目录 前言一、单体架构二、微服务是什么?三、微服务与分布式的区别四、SpringBoot与Spring Cloud的区别?前言 欢迎大家来到二期Spring Cloud 微服务项目实战,首先我们应了解 单体架构是什么?它有哪些问题? 微服务是什么,与分布式架构的区别,Java中微服务框架Spring…

Spark学习

目录 一&#xff0c;Spark是什么 二&#xff0c;Spark的运行模式 三&#xff0c;Spark运行的角色有四类&#xff1a; 四&#xff0c;用户程序从最开始的提交到最终的计算执行&#xff0c;需要经历以下几个阶段&#xff1a; 五&#xff0c;存在Master单点故障&#xff08;SPO…

SOC内部集成网络MAC外设+ PHY网络芯片方案:PHY芯片基础知识

一. 简介 本文简单了解一下 "SOC内部集成网络MAC外设 PHY网络芯片方案" 这个网络硬件方案中涉及的 PHY网络芯片的基础知识。 二. PHY芯片基础知识 PHY 是 IEEE 802.3 规定的一个标准模块。 1. IEEE规定了PHY芯片的前 16个寄存器功能是一样的 前面说了&#xf…

# 达梦数据库知识点

达梦数据库知识点 测试数据 -- SYSDBA.TABLE_CLASS_TEST definitionCREATE TABLE SYSDBA.TABLE_CLASS_TEST (ID VARCHAR(100) NOT NULL,NAME VARCHAR(100) NULL,CODE VARCHAR(100) NULL,TITLE VARCHAR(100) NULL,CREATETIME TIMESTAMP NULL,COLUMN1 VARCHAR(100) NULL,COLUMN…

人工智能产业应用--具身智能

五、下一个浪潮 (一) 跳出缸中脑——虚实结合 在探索人工智能的边界时&#xff0c;“跳出缸中脑——虚实结合”这一概念提出了一个引人深思的视角&#xff0c;尤其是在具身智能的领域。具身智能是一种思想&#xff0c;强调智能体通过与其环境的直接物理互动来实现智能行为。然…

腾讯云轻量2核2G3M云服务器优惠价格61元一年,限制200GB月流量

腾讯云轻量2核2G3M云服务器优惠价格61元一年&#xff0c;配置为轻量2核2G、3M带宽、200GB月流量、40GB SSD盘&#xff0c;腾讯云优惠活动 yunfuwuqiba.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云轻量2核2G云服务器优惠价格 腾讯云&#xff1a;轻量应用服务器100%CPU性能…

YOLOv9改进策略 :卷积魔改 | 感受野注意力卷积运算(RFAConv)

💡💡💡本文改进内容:感受野注意力卷积运算(RFAConv),解决卷积块注意力模块(CBAM)和协调注意力模块(CA)只关注空间特征,不能完全解决卷积核参数共享的问题 💡💡💡使用方法:代替YOLOv9中的卷积,使得更加关注感受野注意力,提升性能 💡💡💡RFAConv…

Go的数据结构与实现【Binary Search Tree】

介绍 本文用Go将实现二叉搜索树数据结构&#xff0c;以及常见的一些方法 二叉树 二叉树是一种递归数据结构&#xff0c;其中每个节点最多可以有两个子节点。 二叉树的一种常见类型是二叉搜索树&#xff0c;其中每个节点的值都大于或等于左子树中的节点值&#xff0c;并且小…

Chatgpt掘金之旅—有爱AI商业实战篇(二)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、前言&#xff1a; 成为一名商业作者是一个蕴含着无限可能的职业选择。在当下数字化的时代&#xff0c;作家们有着众多的平台可以展示和推广自己的作品。无论您是对写书、文…

阿里云通用算力型u1云服务器配置性能评测及价格参考

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

AI 音乐的 “ChatGPT“ 时刻,SunoV3简介和升级教程

一句话总结 Suno AI音乐平台发布了V3版本&#xff0c;标志着AI音乐创作领域的一个重要进步&#xff0c;类似于ChatGPT在文本生成领域的影响。 关键信息点 Suno AI是专注于生成式AI音乐的平台&#xff0c;最新发布的V3版本在音质、咬字和节奏编排上有显著提升。V3版本的AI音乐…