首页 / 浏览问题 / 三维GIS / 问题详情
使用entities、primitives添加的模型点击中变换模型颜色
72EXP 2022年08月19日

使用entities、primitives添加的模型,如何在鼠标右键事件中改变模型颜色??

viewer.scene.primitives.add(
          Cesium.Model.fromGltf({
            id: attat.modelguid,
            url: '/model/' + _that.fileglb + '/' + attat.attachedmodelname + '.glb', // 本地文件
            modelMatrix: towerattamatrix,
            scale: 1, // 放大倍数
          })
        );


  viewer.entities.add({
              guid:crossguid,
              polyline: {
                width: 1,
                material: Cesium.Color.DEEPSKYBLUE,
                show: true,
                positions: Cesium.Cartesian3.fromDegreesArrayHeights(nodePositionArr),
                distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 10000),
                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
              },
            });

使用过这种方法不过没有效果,并且报错属性不存在?

 // 鼠标右键获取属性
    handler.setInputAction(function (click) {
      // 禁止浏览器鼠标右键菜单
      document.oncontextmenu = function () {
        return false;
      };
      const pickModel = Winviewer.scene.pick(click.position);
      _that.position = Winviewer.scene.pickPosition(click.position);
      if (pickModel) {
        // 属性按钮
        var Attribute = document.getElementById('attribute');
        Attribute.style.display = "none";
        // 属性面板
        var viewproperties = document.getElementById('viewproperties');
        viewproperties.style.display = "block";
        _that.addEventPreRender(viewproperties);
        if (pickModel.id.guid) {
          console.log(pickModel,'pickModel')
          //pickModel.id.point.color=new Cesium.Color(1.0, 0.0, 0.0, 1);
          _that.modelguid = pickModel.id.guid;
        } else {
          console.log(pickModel,'pickModel')
          //pickModel.primitive.appearance.material.uniforms.color=Cesium.Color.BLUE
          _that.modelguid = pickModel.id;
        }
      } else {
        // 属性按钮
        var viewproperties = document.getElementById('viewproperties');
        viewproperties.style.display = "none";
      }
    }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);

2 个回答

var gltf = viewer.entities.add({
                    name: "gltf",
                    position: new Cesium.Cartesian3.fromDegrees(116.458110477583400 - 0.002034006, 39.912527169275549 - 0.005072179, 0),
                    model: {
                        uri: url
                    }
                });
                viewer.zoomTo(gltf);
                var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
                
           handler.setInputAction(function (e) {
            //首先移除之前添加的点

            viewer.selectedEntity = gltf;
            gltf.model.color = new Cesium.Color(1.0, 0, 0, 1.0);
            
        }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
330EXP 2022年08月19日
试了下实体没啥问题。 primitives 没试过。如果可以的话希望分享。
这个entities添加模型一次性要添加几百个到一千个模型,没有办法单独拿取到呀??
这个不就是个点击事件么,应该可以吧?
我这样获取过,pickModel.id.point.color=new Cesium.Color(1.0, 0.0, 0.0, 1); 不过获取到的point是undefined

您好,对象选择事件并且修改属性您可以参考该demo。

http://support.supermap.com.cn:8090/iserver/iClient/for3D/webgl/zh/examples/webgl/editor.html#Geometry

当然,因为您的数据是绘制在场景里的实体数据显示属性信息,所以不需要发数据请求去获取属性。

实现点击事件里获取当前选择对象,获取对象后修改,创建显示即可。

希望可以帮助到您。

4,151EXP 2022年08月19日
这个我之前看过没有用呀
按照您的描述来看肯定是没问题的,color属性通过设置colorpicker去修改。

entities添加之后,您这边每次右击模型的事件去触发获取到当前右键的模型的color就行了
我这获取过呀,不过获取到的是空值呀,就是point是空值

pickModel.id.point.color=new Cesium.Color(1.0, 0.0, 0.0, 1);
用selectedEntity. entity.model.color 去获取颜色,并把这个颜色设置为您要改变的颜色。不用去获取id和point
使用selectedEntity这个获取到的是空值
这个得您自己debug找一下原因,方法肯定没问题

您那边自行添加的entity模型,只要是您这个模型处于选中状态,就不会为空

建议从请求,是否可选等方面入手
...