cesium 渐变虚线效果 PolylineDashMaterialProperty

news2024/11/30 8:38:21

cesium中有虚线材质PolylineDashMaterialProperty,可以在这个材质的基础上结合uv设置每个顶点的透明度,就能实现渐变的效果了。

一、原理:在glsl中结合uv设置每个顶点的透明度

vec2 st = materialInput.st;
material.alpha = fragColor.a * (1.0 - st.s);

二、完整代码,扩展PolylineDashMaterialProperty材质

const defaultColor = Cesium.Color.WHITE;
const defaultGapColor = Cesium.Color.TRANSPARENT;
const defaultDashLength = 16.0;
const defaultDashPattern = 255.0;

/**
 * A {@link MaterialProperty} that maps to polyline dash {@link Material} uniforms.
 * @alias GradientPolylineDashMaterial
 * @constructor
 *
 * @param {Object} [options] Object with the following properties:
 * @param {Cesium.Property|Cesium.Color} [options.color=Cesium.Color.WHITE] A Cesium.Property specifying the {@link Cesium.Color} of the line.
 * @param {Cesium.Property|Cesium.Color} [options.gapColor=Cesium.Color.TRANSPARENT] A Cesium.Property specifying the {@link Cesium.Color} of the gaps in the line.
 * @param {Cesium.Property|Number} [options.dashLength=16.0] A numeric Cesium.Property specifying the length of the dash pattern in pixels.
 * @param {Cesium.Property|Number} [options.dashPattern=255.0] A numeric Cesium.Property specifying a 16 bit pattern for the dash
 */
function GradientPolylineDashMaterial(options) {
    options = Cesium.defaultValue(options, Cesium.defaultValue.EMPTY_OBJECT);

    this._definitionChanged = new Cesium.Event();
    this._color = undefined;
    this._colorSubscription = undefined;
    this._gapColor = undefined;
    this._gapColorSubscription = undefined;
    this._dashLength = undefined;
    this._dashLengthSubscription = undefined;
    this._dashPattern = undefined;
    this._dashPatternSubscription = undefined;

    this.color = options.color;
    this.gapColor = options.gapColor;
    this.dashLength = options.dashLength;
    this.dashPattern = options.dashPattern;
}

Object.defineProperties(GradientPolylineDashMaterial.prototype, {
    /**
     * Gets a value indicating if this property is constant.  A property is considered
     * constant if getValue always returns the same result for the current definition.
     * @memberof GradientPolylineDashMaterial.prototype
     * @type {Boolean}
     * @readonly
     */
    isConstant: {
        get: function () {
            return (
                Cesium.Property.isConstant(this._color) &&
                Cesium.Property.isConstant(this._gapColor) &&
                Cesium.Property.isConstant(this._dashLength) &&
                Cesium.Property.isConstant(this._dashPattern)
            );
        },
    },
    /**
     * Gets the event that is raised whenever the definition of this property changes.
     * The definition is considered to have changed if a call to getValue would return
     * a different result for the same time.
     * @memberof GradientPolylineDashMaterial.prototype
     * @type {Event}
     * @readonly
     */
    definitionChanged: {
        get: function () {
            return this._definitionChanged;
        },
    },
    /**
     * Gets or sets the Cesium.Property specifying the {@link Cesium.Color} of the line.
     * @memberof GradientPolylineDashMaterial.prototype
     * @type {Cesium.Property|undefined}
     */
    color: Cesium.createPropertyDescriptor("color"),

    /**
     * Gets or sets the Cesium.Property specifying the {@link Cesium.Color} of the gaps in the line.
     * @memberof GradientPolylineDashMaterial.prototype
     * @type {Cesium.Property|undefined}
     */
    gapColor: Cesium.createPropertyDescriptor("gapColor"),

    /**
     * Gets or sets the numeric Cesium.Property specifying the length of a dash cycle
     * @memberof GradientPolylineDashMaterial.prototype
     * @type {Cesium.Property|undefined}
     */
    dashLength: Cesium.createPropertyDescriptor("dashLength"),

    /**
     * Gets or sets the numeric Cesium.Property specifying a dash pattern
     * @memberof GradientPolylineDashMaterial.prototype
     * @type {Cesium.Property|undefined}
     */
    dashPattern: Cesium.createPropertyDescriptor("dashPattern"),
});

/**
 * Gets the {@link Material} type at the provided time.
 *
 * @param {JulianDate} time The time for which to retrieve the type.
 * @returns {String} The type of material.
 */
GradientPolylineDashMaterial.prototype.getType = function (time) {
    return "GradientPolylineDash";
};

/**
 * Gets the value of the property at the provided time.
 *
 * @param {JulianDate} time The time for which to retrieve the value.
 * @param {Object} [result] The object to store the value into, if omitted, a new instance is created and returned.
 * @returns {Object} The modified result parameter or a new instance if the result parameter was not supplied.
 */
GradientPolylineDashMaterial.prototype.getValue = function (time, result) {
    if (!Cesium.defined(result)) {
        result = {};
    }
    result.color = Cesium.Property.getValueOrClonedDefault(
        this._color,
        time,
        defaultColor,
        result.color
    );
    result.gapColor = Cesium.Property.getValueOrClonedDefault(
        this._gapColor,
        time,
        defaultGapColor,
        result.gapColor
    );
    result.dashLength = Cesium.Property.getValueOrDefault(
        this._dashLength,
        time,
        defaultDashLength,
        result.dashLength
    );
    result.dashPattern = Cesium.Property.getValueOrDefault(
        this._dashPattern,
        time,
        defaultDashPattern,
        result.dashPattern
    );
    return result;
};

/**
 * Compares this property to the provided property and returns
 * <code>true</code> if they are equal, <code>false</code> otherwise.
 *
 * @param {Cesium.Property} [other] The other property.
 * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
 */
GradientPolylineDashMaterial.prototype.equals = function (other) {
    return (
        this === other || //
        (other instanceof GradientPolylineDashMaterial &&
            Cesium.Property.equals(this._color, other._color) &&
            Cesium.Property.equals(this._gapColor, other._gapColor) &&
            Cesium.Property.equals(this._dashLength, other._dashLength) &&
            Cesium.Property.equals(this._dashPattern, other._dashPattern))
    );
};

Cesium.Material._materialCache.addMaterial("GradientPolylineDash", {
    fabric: {
        type: "GradientPolylineDash",
        uniforms: {
            color: defaultColor,
            gapColor: defaultGapColor,
            dashLength: defaultDashLength,
            dashPattern: defaultDashPattern
        },
        source:
            `
                uniform vec4 color;
                uniform vec4 gapColor;
                uniform float dashLength;
                uniform float dashPattern;
                varying float v_polylineAngle;

                const float maskLength = 16.0;

                mat2 rotate(float rad) {
                    float c = cos(rad);
                    float s = sin(rad);
                    return mat2(
                        c, s,
                        -s, c
                    );
                }

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

                    vec2 pos = rotate(v_polylineAngle) * gl_FragCoord.xy;

                    // Get the relative position within the dash from 0 to 1
                    float dashPosition = fract(pos.x / (dashLength * czm_pixelRatio));
                    // Figure out the mask index.
                    float maskIndex = floor(dashPosition * maskLength);
                    // Test the bit mask.
                    float maskTest = floor(dashPattern / pow(2.0, maskIndex));
                    vec4 fragColor = (mod(maskTest, 2.0) < 1.0) ? gapColor : color;
                    if (fragColor.a < 0.005) {   // matches 0/255 and 1/255
                        discard;
                    }

                    fragColor = czm_gammaCorrect(fragColor);
                    material.emission = fragColor.rgb;
                    vec2 st = materialInput.st;
                    material.alpha = fragColor.a * (1.0 - st.s);
                    return material;
                }
                    
                `
    },
    translucent: function translucent() {
        return true;
    }
});

// 写到Cesium对象上,就可以像其他MaterialProperty一样使用了
Cesium.Material.GradientDashPolyline = 'GradientPolylineDash'
Cesium.GradientPolylineDashMaterialProperty = GradientPolylineDashMaterial

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

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

相关文章

【SpringCloud】创建新工程

前言 本文使用的是jdk17&#xff0c;mysql8。 以下用两个服务做演示&#xff1a; 订单服务&#xff1a;提供订单ID&#xff0c;获取订单详细信息。 商品服务&#xff1a;提供商品ID&#xff0c;获取商品详细信息。 对于订单服务和商品服务分别建立数据库&#xff1a; -- 订单服…

Javaweb避坑指北(持续更新)

内容较多可按CtrlF搜索 0.目录 1.获取插入数据后自增长主键的值 2.Controller中返回给ajax请求字符串/json会跳转到xxx.jsp 3.ajax请求获得的json无法解析 4.在Controller中使用ServletFileUpload获取的上传文件为null 5.莫名其妙报service和dao里方法的错误 6.ajax请求拿…

期权费的核心是什么

期权费的核心 在涉足股票期权投资的领域时&#xff0c;投资者们往往会将焦点首先锁定在期权费这一显性成本上。然而&#xff0c;实际操作中&#xff0c;一个更为核心且决定性的考量因素是&#xff0c;目标股票是否具备通过个股期权策略进行买入的潜在价值。特别是&#xff0c;…

NFTScan 正式上线 Sei NFTScan 浏览器和 NFT API 数据服务

2024 年 6 月 12 号&#xff0c;NFTScan 团队正式对外发布了 Sei NFTScan 浏览器&#xff0c;将为 Sei 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商&#xff0c;Sei 是继 Bitcoin、Ethereum、BNBChain、Polyg…

数据安全“大考”,双一流高校们来交卷!

又是一年高考落幕 埋头题山卷海的考生们 终于迎来“大解放”&#xff01; 在数字化浪潮中 众高校面临的重要考试 ——“数据安全大考”还在继续 如何作答&#xff1f; 这些双一流高校交出高分答卷&#xff01; 数据分类分级如何开展落地&#xff1f; 难点分析&#xff1…

python游标卡尺什么梗

python游标卡尺什么梗&#xff1f;下面给大家介绍一下这个梗&#xff1a; 因为 python 是通过缩进来区分代码块的&#xff08;而不是{}或者是其他符号&#xff09;&#xff0c;而不是像其他程序语言&#xff0c;缩进仅仅为了可读性。导致打印出来的 python 代码&#xff08;比…

神经气体生长算法【GNG】

当德国计算神经学家 Bernd Fritzke 在其 1995 年的开创性论文中提出后来被称为神经气体生长&#xff08;GNG&#xff09;的算法时&#xff0c;机器学习还是一个相对较新的领域&#xff0c;并且受到实际神经科学的极大启发。 当时&#xff0c;神经科学正处于一个突破性的时代—…

目标检测:将yolo标注的txt文本转为VOC标注的xml文件

1、准备工作 目标检测数据的标注分为两种格式&#xff1a; xml 解释性标签&#xff0c;左上角右下角的坐标txt 记事本文件&#xff0c;类别x&#xff0c;y中心坐标w&#xff0c;h的相对值 需要准备的数据有&#xff1a; 其中images为图像数据&#xff0c;labels为txt文本信息…

【Python】已解决报错:NameError: name ‘xxx‘ is not defined

【Python】已解决报错&#xff1a;NameError: name ‘xxx‘ is not defined &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大…

C++学习笔记(23)——二叉树进阶

系列文章 http://t.csdnimg.cn/QDR3y 目录 系列文章[TOC](目录) 1. 二叉树的优势2. 二叉搜索树概念3. 二叉搜索树操作1. 二叉搜索树的查找2. 二叉搜索树的插入——地址链接重设3. 二叉搜索树的删除——地址链接重设 4. 二叉搜索树的应用——以key为载体&#xff0c;承载复杂信…

618家用智能投影仪推荐:这个高性价比品牌不容错过

随着科技的不断进步&#xff0c;家庭影院的概念已经从传统的大屏幕电视逐渐转向了更为灵活和便携的家用智能投影仪。随着618电商大促的到来&#xff0c;想要购买投影仪的用户们也开始摩拳擦掌了。本文将从投影仪的基础知识入手&#xff0c;为您推荐几款性价比很高的投影仪&…

QGroupbox,Grid Layout,button 水平延伸 布局

实验 sizePolicy水瓶延伸 拖入一个groupbox控件 在groupbox控件中拖入一个grid layout 控件 然后拖入3个pushButton 使其水平排列&#xff0c; 设置button3的 sizePolicy 水平延展 为1 效果

工程项目管理系统:高效、专业的工程管理软件

在当今快速发展的工程行业&#xff0c;有效的项目管理是确保项目成功的关键。鸿鹄工程项目管理系统&#xff0c;基于Spring Cloud、Spring Boot、Mybatis、Vue和ElementUI技术栈&#xff0c;提供了一个全面、高效的解决方案&#xff0c;以应对复杂的工程项目管理挑战。 项目背景…

精益思维在人工智能中的应用体现

随着AI技术的广泛应用&#xff0c;如何提高其效率、降低成本、优化性能&#xff0c;成为了业界关注的焦点。精益思维作为一种追求卓越、持续改进的管理理念&#xff0c;其在人工智能中的应用正逐渐展现出巨大的潜力。 一、数据精益化管理。数据是AI技术的核心&#xff0c;而数据…

JavaScript知识之函数

javascript函数 在JavaScript基础之上提供了部分函数,同时也可以自定义函数,JavaScript基础详见之前的文章javascript基础知识 自定义函数 //关键字 函数名 参数列表 函数体 function test(a,b,c){alert(a":"b":"c) }function test1(a,b){return a;//不…

一文读懂Samtec分离式线缆组件选型 | 快速攻略

【摘要/前言】 2023年&#xff0c;全球线缆组件市场规模大致在2100多亿美元。汽车和电信行业是线缆组件最大的两个市场&#xff0c;中国和北美是最大的两个制造地区。有趣的是&#xff0c;特定应用&#xff08;即定制&#xff09;和矩形组件是两个最大的产品组。 【Samtec产品…

huggingface_hub LocalEntryNotFoundErroringface

报错详细 LocalEntryNotFoundError: An error happened while trying to locate the file on the Hub and we cannot find the requested files in the local cache. Please check your connection and try again or make sure your Internet connection is on.问题说明 在…

肾合养生秘诀:告别手心热出汗的困扰

如果将我们的身体比作一支精心编排的交响乐团&#xff0c;那么各个器官便是乐团中不可或缺的乐器和乐手&#xff0c;而气血则如同乐团中的乐谱和指挥棒&#xff0c;引领着整个乐团的演奏。当乐谱缺失&#xff0c;指挥棒失灵&#xff0c;或者乐团的协作出现问题&#xff0c;某些…

CAN转PROFINET,轻松实现降本增效!AGV行业必备连接通信方案大揭秘!

随着工厂自动化发展以及柔性制造系统、自动化立体仓库的广泛应用&#xff0c;已作为管理离散型装配、物流、仓储等系统不可或缺的自动化搬运装卸工具&#xff0c;智能化AGV系统可根据ERP订单进行仓库配料、分料、产品装配以及出入库、包装物流等环节。 AGV由导航系统、传感器系…

超声波风速风向传感器

TH-WQX2随着科技的不断发展&#xff0c;气象监测设备也在不断创新和完善。其中&#xff0c;超声波风速风向传感器以其独特的设计优势&#xff0c;在气象监测领域中脱颖而出&#xff0c;成为越来越多用户的首选。本文将详细阐述超声波风速风向传感器的设计优势&#xff0c;以便读…