Cesium点击改变entity/primitives颜色与恢复原色(三)

打印 上一主题 下一主题

主题 777|帖子 777|积分 2331

2023-01-08
建筑物是primitives,两个娃娃是entity
加载娃娃代码:
  1.       //粉色
  2.     var entity6 = viewer.entities.add({
  3.       id:6,
  4.       position:new Cesium.Cartesian3.fromDegrees(103.8603, 30.7049,490),
  5.       //设置朝向和翻滚角度
  6.       orientation:orientation,
  7.       model:{
  8.         uri:"../../../static/3DModel/higokumaru__honkai_impact_3rd/scene.gltf",
  9.         show:true,
  10.         scale: 5.0 ,
  11.         silhouetteColor : Cesium.Color.YELLOW,
  12.         silhouetteSize : 0,
  13.         colorBlendMode:Cesium.ColorBlendMode.MIX,
  14.         colorBlendAmount: 0
  15.       }
  16.     })
  17.     entityCollection.add(entity6)
  18.     //小恶魔
  19.     var entity7 = viewer.entities.add({
  20.       id:7,
  21.       position:new Cesium.Cartesian3.fromDegrees(103.8611, 30.7055,490),
  22.       //设置朝向和翻滚角度
  23.       orientation:orientation,
  24.       model:{
  25.         uri:"../../../static/3DModel/lilit_endora/scene.gltf",
  26.         show:true,
  27.         scale: 0.1 ,
  28.         silhouetteColor : Cesium.Color.YELLOW,
  29.         silhouetteSize : 0,
  30.         colorBlendMode:Cesium.ColorBlendMode.MIX,
  31.         colorBlendAmount: 0
  32.       }<br><br>
  33.     })
复制代码
 
 
加载建筑物代码:
  1.     var tileset = new Cesium.Cesium3DTileset({
  2.       url: "../../../static/3DModel/sicauOSM/tileset.json",
  3.     });
  4.     viewer.scene.primitives.add(tileset);
  5.     console.log(tileset);
复制代码
 
 

 
 
绑定左键点击事件:
 
  1.     //鼠标单击左键事件
  2.     viewer.screenSpaceEventHandler.setInputAction(function onMouseClick( click ) {
  3.       var nowIsEntity = false;
  4.       //pickedFeature 是 primitive
  5.       var pickedFeature = viewer.scene.pick(click.position);
  6.       //pickedEntity 是 entity
  7.       var pickedEntity = null;
  8.       if(Cesium.defined(pickedFeature)){
  9.         console.log(pickedFeature);
  10.         
  11.         //如果是entity
  12.         if(typeof(pickedFeature.id) !== "undefined"){
  13.           pickedEntity = entityCollection.getById(pickedFeature.id.id);
  14.           pickedEntity.model.color = Cesium.Color.RED;
  15.           pickedEntity.model.colorBlendAmount = 0.5;
  16.           nowIsEntity = true;         
  17.         }
  18.         //如果是primitive
  19.         else if(typeof(pickedFeature.id) == "undefined"){
  20.           that.lastPrimitiveColor = pickedFeature.color;
  21.           console.log(`that.lastPrimitiveColor为:${that.lastPrimitiveColor}`);
  22.           pickedFeature.color = Cesium.Color.RED;
  23.           console.log(pickedFeature.getProperty("name"));
  24.         }
  25.         //第一次点击,则只需要记住当前物体,以便点击其他物体时候恢复改物体颜色
  26.         if(that.pickedEntity === null && nowIsEntity){
  27.             that.pickedEntity = pickedEntity;
  28.             that.lastIsEntity = true;
  29.             return;
  30.         }else if(that.lastFeature === null && !nowIsEntity){
  31.             that.lastFeature = pickedFeature;
  32.             that.lastIsEntity = false;
  33.             return;
  34.         }
  35.         //不是第一次点击,则需将上一次点击的物体恢复原本的颜色
  36.         if(nowIsEntity){
  37.             that.pickedEntity.model.colorBlendAmount = 0;//设置模型颜色与透明度
  38.             that.pickedEntity=pickedEntity;
  39.             that.lastIsEntity = true;
  40.             return;      
  41.         }else if(!nowIsEntity){
  42.             that.lastFeature.color = that.lastPrimitiveColor;
  43.             console.log(`that.lastFeature.tileset.color为:${that.lastFeature.tileset.color}`);
  44.             that.lastFeature=pickedFeature;
  45.             that.lastIsEntity = false;
  46.             return;   
  47.         }
  48.       }
  49.       console.log(pickedFeature);
  50.       console.log(pickedEntity);
  51.       
  52.       
  53.     },Cesium.ScreenSpaceEventType.LEFT_CLICK);
复制代码
 
 恢复entity的颜色使用的方法是将上一个entity的colorBlendAmount改为0
恢复primitives颜色是使用一个全局变量lastPrimitiveColor记住上一个primitives的颜色,
其不能和entity一样使用colorBlendAmount的原因是:选中的建筑物类型是Cesium3DTileFeature,他的colorBlendAmount属性在tileset中,也就是说改变colorBlendAmount之后变化的是所有建筑的colorBlendAmount而不是单个建筑的colorBlendAmount

 
 
 
 这里区别了primitives和entity,两者分别可以有一个被选中,要是想全局只能有一个模型是选中状态的话可以自己改一下代码逻辑。
 
调整建筑的colorBlendMode使颜色更加合理
  1.     //定义用于在目标颜色和图元的源颜色之间混合的不同模式
  2.     //HIGHLIGHT将源颜色乘以目标颜色
  3.     //REPLACE将源颜色替换为目标颜色
  4.     //MIX将源颜色和目标颜色混合在一起。
  5.     tileset.colorBlendMode = Cesium.Cesium3DTileColorBlendMode.MIX;
  6.     tileset.colorBlendAmount = 0.7;
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表