cesium加载线/面,通过shader自定义材质实现流动效果

定义PolylineTrailLinkMaterialProperty.js并引入

(function () {
  /*
      流动纹理线
      color 颜色
      duration 持续时间 毫秒
      trailImage 贴图地址
  */
  function PolylineTrailLinkMaterialProperty(color, trailImage , duration) {
    this._definitionChanged = new Cesium.Event();
    this._color = undefined;
    this._colorSubscription = undefined;
    this.color = color;
    this.duration = duration;
    this.trailImage  = trailImage ;
    this._time = (new Date()).getTime();
  }
  
  /**
   * 自定义材质
   */
   function _getPolylineShader() {
    var materail =
      "czm_material czm_getMaterial(czm_materialInput materialInput)\n\
      {\n\
            czm_material material = czm_getDefaultMaterial(materialInput);\n\
            vec2 st = materialInput.st;\n\
            vec4 colorImage = texture2D(image, vec2(fract(st.s - time), st.t));\n\
            material.alpha = colorImage.a * color.a;\n\
            material.diffuse = (colorImage.rgb+color.rgb)/2.0;\n\
            return material;\n\
      }";

      return materail
  }
  
  Object.defineProperties(PolylineTrailLinkMaterialProperty.prototype, {
    isConstant: {
      //该属性是否会随时间变化,为true时只会获取一次数值
      get: function () {
        return false;
      }
    },
    definitionChanged: {
      get: function () {
        return this._definitionChanged;
      }
    },
    color: Cesium.createPropertyDescriptor('color')
  });
  
  var MaterialType = 'polylineType' + parseInt(Math.random() * 1000);
  PolylineTrailLinkMaterialProperty.prototype.getType = function (time) {
    return MaterialType;
  }
  
  PolylineTrailLinkMaterialProperty.prototype.getValue = function (time, result) {
    if (!Cesium.defined(result)) {
      result = {};
    }
    result.color = Cesium.Property.getValueOrClonedDefault(this._color, time, Cesium.Color.WHITE, result.color);
    result.image = this.trailImage;
    result.time = (((new Date()).getTime() - this._time) % this.duration) / this.duration;
    return result;
  }
  
  PolylineTrailLinkMaterialProperty.prototype.equals = function (other) {
    return this === other ||
      (other instanceof PolylineTrailLinkMaterialProperty &&
        Cesium.Property.equals(this._color, other._color) &&
        Cesium.Property.equals(this._image, other._image))
  }
  
  Cesium.Material._materialCache.addMaterial(MaterialType, {
    fabric: {
      type: MaterialType,
      uniforms: {
        color: new Cesium.Color(1.0, 0.0, 0.0, 0.5),
        image: Cesium.Material.DefaultImageId,
        time: -20
      },
      source: _getPolylineShader()
    },
    translucent: function (material) {
      return true;
    }
  });
  Cesium.PolylineTrailLinkMaterialProperty = PolylineTrailLinkMaterialProperty;
})();

使用PolylineTrailLinkMaterialProperty 类

let data = [
    [104.04790878295898, 30.665822980309592],
    [104.02791023254393, 30.641600497335878],
    [104.02336120605469, 30.683534290222845]
  ]
function addTrailLink(data ) {
  let datasouce = map_common_addDatasouce('lineNumber');
  pointArr.forEach(item => {
    let coor = Array.prototype.concat.apply(
      [],
      [[item[0], item[1], 0], [item[0], item[1], 10000]]
    );
    datasouce.entities.add({
      polyline: {
        positions: Cesium.Cartesian3.fromDegreesArrayHeights(coor),
        width: 16,
        material: new Cesium.PolylineTrailLinkMaterialProperty(Cesium.Color.CYAN, './images/map/LinkPulse.png', 3000),
      },
    });
  })
  viewer.flyTo(datasouce);
}

图片资源:
在这里插入图片描述
实现效果:
在这里插入图片描述

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Cesium中的流动材质可以通过定义Shader实现。以下是一个自定义流动材质的基本示例: ```javascript var material = new Cesium.Material({ fabric: { type: 'Flow', uniforms: { speed: 0.5, frequency: 25.0, amplitude: 0.5, color: new Cesium.Color(1.0, 0.0, 0.0, 1.0) }, source: "czm_material czm_getMaterial(czm_materialInput materialInput)\n\ {\n\ czm_material material = czm_getDefaultMaterial(materialInput);\n\ vec2 st = materialInput.st;\n\ float time = czm_frameNumber * 0.03;\n\ vec2 uv = st;\n\ uv.y += (time + sin(st.x * frequency) * amplitude) * speed;\n\ vec4 color = texture2D(image, uv);\n\ material.diffuse = color.rgb * color.a * colorMultiplier;\n\ material.alpha = color.a * alphaMultiplier;\n\ return material;\n\ }" } }); ``` 在这个示例中,我们使用了Cesium自带的“Flow”材质类型,并定义了一些uniform变量,例如速度、频率、振幅和颜色。然后,我们定义了一个着色器程序,其中包含一个获取材质的函数。在这个函数中,我们使用输入的纹理坐标来计算新的uv坐标,并从纹理中获取相应的颜色。最后,我们将颜色乘以透明度和颜色系数,并返回材质对象。 你可以根据自己的需要修改uniform变量和着色器程序来创建自定义流动材质。 ### 回答2: Cesium是一个开源的地理可视化引擎,允许用户将地球上的地理数据以3D的形式展现出来。要自定义流动材质,需要使用Cesium材质系统和着色器语言,下实现流动材质的大致步骤: 1. 创建材质:使用Cesium材质系统,可以创建自定义材质对象。通过定义材质的颜色、透明度、光照等属性,可以控制地球上显示的样式。 2. 创建顶点着色器:通过顶点着色器,可以对每个顶点进行自定义操作。在流动材质中,我们可以使用顶点着色器来改变顶点的位置、颜色或其他属性,从而实现流动效果。 3. 创建片元着色器:片元着色器用于定义像素的颜色和透明度。在流动材质中,可以使用片元着色器来计算每个像素的颜色,使其呈现出流动效果。可以使用时间变量和其他参数来控制流动的速度和方向。 4. 将着色器与材质关联:将自定义的顶点着色器和片元着色器与之前创建的材质关联起来。这样,材质就可以使用我们定义的着色器进行渲染。 5. 应用材质:将自定义流动材质应用于地球上的目标区域。可以通过Cesium的实体对象或材质属性来设置目标区域,并将之前创建的材质赋值给它们。 总结一下,要实现自定义流动材质,我们需要使用Cesium材质系统、顶点着色器和片元着色器来改变地球上目标区域的样式,并控制流动效果。同时,可以使用时间变量和其他参数来控制流动的速度和方向。这样,就可以在Cesium实现自定义流动材质。 ### 回答3: Cesium是一个基于Web的3D地球呈现引擎,可以用于创建交互式的地理信息系统。Cesium通过使用材料来控制3D对象的外观和行为。要自定义Cesium流动材质,可以按照以下步骤进行操作。 首先,我们需要定义一个新的材质,并使用Cesium.Material接口来指定材质的属性。其中,Cesium.Color定义了颜色属性,Cesium.TranslucentAppearance定义了透明度属性。通过改变颜色和透明度,可以创建不同的流动效果。 其次,我们需要实现一个定时器来改变材质的属性。可以使用CesiumCesium.Math模块中的sin函数来生成一个周期性变化的数值,并将其用作颜色或透明度的参数。通过改变这个周期性变化的数值,可以调整流动材质的速度和方向。 最后,将定义的材质应用到需要流动效果的3D对象上。可以使用Cesium.Entity和Cesium.Primitive等类来创建3D对象,并将定义的材质赋值给对象的material属性。通过调整对象的位置和姿态,可以自定义流动材质在3D场景中的呈现效果。 总之,要自定义Cesium流动材质,需要定义新的材质并指定其属性,实现一个定时器来控制材质的变化,以及将定义的材质应用到3D对象上。通过这些步骤,可以创建出不同速度和方向的流动效果,使Cesium呈现出更生动的视觉效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值