首页 > 其他分享 >cesium 3dtile单击选中

cesium 3dtile单击选中

时间:2023-10-24 14:11:59浏览次数:24  
标签:getProperty 单击 3dtile viewer feature Cesium pick cesium id

监听瓦片加载完成事件,将所有3dtile对象按id归纳到map中

    tileset.readyPromise.then(() => {
        console.log('tileset.readyPromise');
        tileset.setObjsColor()
    })

    // allTilesLoaded 会被调用多次  旋转、放大缩小模型时会触发这个事件,不适合用来做一次性的操作
    // tileset.allTilesLoaded.addEventListener(function() {
    //     console.log('All tiles are loaded');
    //     tileset.setObjsColor()
    // });

 将所有3dtile对象按id归纳到map中的方法

    // 初始化一个map
    Cesium.Cesium3DTileset.MyBuildMap = new Map()
    // 虽然定义的是个体方法,调用也是用个体对象调用,但是evaluateColor方法会执行所有Cesium3DTileset对象
    Cesium.Cesium3DTileset.prototype.setObjsColor = function () {
        let currentStyle = this.style && this.style.style || {};
        this.style = new Cesium.Cesium3DTileStyle({
            ...currentStyle,
            color: {
                evaluateColor: function (feature) {
                    if (!Cesium.Cesium3DTileset.MyBuildMap.has(feature.getProperty('id'))) {
                        Cesium.Cesium3DTileset.MyBuildMap.set(feature.getProperty('id'), [])
                    }
                    if (['gdgdfgdfgf', 'vcxvfg', 'dsfdf1'].includes(feature.getProperty('name'))) {
                        // gdgdfgdfgf a1d0c6e83f027327d8461063f4ac58a6 、vcxvfg 地面
                    } else {
                        Cesium.Cesium3DTileset.MyBuildMap.get(feature.getProperty('id')).push(feature)
                    }
                }
            }
        })
    };

 

点击事件

function myClickEvent(viewer, event) {
    // 500 毫秒内直接返回  防止双击触发2次单击事件
    if (window.selTime && window.selTime > new Date().getTime() - 500) { 
        console.log('500 毫秒内直接返回');
        return
    }
    window.selTime = new Date().getTime()

    // 屏幕坐标转为空间坐标
    let cartesian = getCatesian3FromPX(event.position, viewer);
    // 判断是否定义(是否可以获取到空间坐标)
    if (!Cesium.defined(cartesian)) {
        return
    }
    if (!viewer.selectedEntity) {
        return
    }

    viewer.trackedEntity = undefined
    
    let sel = viewer.selectedEntity
    window.sel = sel

    // pick有id字段时,id存放的是模型对象,也就是viewer.selectedEntity
    // pick有_batchId字段时,pick是Cesium3DTileFeature对象,选中的是3dtile对象,primitive字段存放Cesium3DTileset对象,
    //    此时的viewer.selectedEntity拥有_feature字段,存放的是Cesium3DTileFeature
    //    feature.getProperty('id'), feature.getProperty('name') 也就是 viewer.selectedEntity 的 id name 字段
    const pick = viewer.scene.pick(event.position)
    window.pick = pick

    // 射线选中的一堆对象
    var picks = viewer.scene.drillPick(event.position)
    window.picks = picks

    // 上一个对象 取消选中状态
    if (viewer.oldSel && viewer.oldSel.lcxUnActiveFun) {
        viewer.oldSel.lcxUnActiveFun()
    }

    // 模型对象
    if (sel.lcxActiveFun) {
        console.log('model click');
        sel.lcxActiveFun()
        viewer.oldSel = sel
    } 
    
    // 瓦片模型对象   sel是临时的,增加属性并不会被保存  这里使用pick对象
    else if (pick._batchId != undefined) { // pick._batchId 包含 0 值,会被认为是false,用undefined判断
        console.log('3dtile click', pick.getProperty('id'), pick.getProperty('name'), arr);
        let arr = Cesium.Cesium3DTileset.MyBuildMap.get(pick.getProperty('id'))
        arr.forEach(feature => {
            feature.color = Cesium.Color.YELLOWGREEN
        });
        pick.lcxUnActiveFun = function() {
            arr.forEach(feature => {
                feature.color = Cesium.Color.WHITE
            });
        }
        viewer.oldSel = pick
    }
}

 

这里的瓦片点击事件也可以使用瓦片对象调用setObjsColor方法,这样就不用创建MyBuildMap对象,但是每次都要过滤一遍所有瓦片对象,效率不高,而且有时候会出现setObjsColor方法无限循环的情况,导致页面卡住

    // 瓦片模型对象  这个代码 放在else里执行,只会被执行一次   因为第二次判断sel.lcxActiveFun会为true  sel是临时的,增加属性并不会被保存
    else if (pick._batchId != undefined) { // pick._batchId 包含 0 值,会被认为是false,用undefined判断
        console.log('3dtile click', pick.getProperty('id'), pick.getProperty('name'), arr);
        pick.primitive.setObjsColor([pick.getProperty('id')])
        viewer.oldSel = pick
    }
Cesium.Cesium3DTileset.prototype.setObjsColor = function (ids) {
    let currentStyle = this.style && this.style.style || {};
    this.style = new Cesium.Cesium3DTileStyle({
      ...currentStyle,
      color: {
        evaluateColor: function (feature) {
          console.log(feature.myId, feature._batchId, ids.includes(feature._batchId));
          if (ids.includes(feature._batchId)) {
            return Cesium.Color.RED;
          }
        }
      }
    })
  };

 效果

 

 

标签:getProperty,单击,3dtile,viewer,feature,Cesium,pick,cesium,id
From: https://www.cnblogs.com/LcxSummer/p/17784657.html

相关文章

  • cesium对比entity和primitive添加polyline
    primitive方式要复杂一些,但是效率要高一些 primitive方式functioncreatePrimitive(coordinate){letpolyline=newCesium.GroundPolylineGeometry({positions:Cesium.Cartesian3.fromDegreesArray(coordinate.flat()),......
  • 三维模型3DTile格式轻量化压缩处理工具常用几款软件介绍
    三维模型3DTile格式轻量化压缩处理工具常用几款软件介绍   三维模型3DTile格式的轻量化处理旨在减少模型的存储空间和提高渲染性能。以下是一些推荐的工具软件,可以用于实现这个目的:MeshLab:MeshLab是一个开源的三维模型处理软件,它支持多种格式的导入和导出,包括3DTiles。通......
  • cesium 自定义属性方法
    Cesium.Cesium3DTileset.prototype.setObjsColor=function(ids){letcurrentStyle=this.style&&this.style.style||{};this.style=newCesium.Cesium3DTileStyle({...currentStyle,color:{evaluateColor:function(......
  • cesium 3dtils 房屋打组 实现单个房屋选中效果
    效果 scenetree.json记录的是模型的数据,这种element的节点上记录的name就是建模时给建筑物打组时起的名字,后面cesium创建模型时,建筑物上的每个feature都会添加这个name参数,根据这个name参数可以找到这个模型中的所有feature  handler.setInputAction((event)=>......
  • 三维模型3DTile格式轻量化的跨平台兼容性问题分析
    三维模型3DTile格式轻量化的跨平台兼容性问题分析 三维模型3DTile格式是一种开放的、高效的和互操作的空间信息数据格式。然而,它作为一种新兴的技术,其在轻量化与跨平台兼容性方面存在着一些问题。首先,由于3DTile格式主要针对大型三维场景进行设计,其文件数量巨大,数据密度高,导......
  • 三维模型3DTile格式轻量化的纹理压缩和质量关系分析
    三维模型3DTile格式轻量化的纹理压缩和质量关系分析 在三维模型的3DTile格式轻量化处理中,纹理压缩是一个重要环节。但是,纹理压缩和模型质量之间存在明显的关系需要权衡。以下是纹理压缩和模型质量关系的详细分析:1、压缩率与纹理质量:一般来说,高度压缩的纹理可以大大减小文件大......
  • 三维模型3DTile格式轻量化的数据压缩与性能平衡关系分析
    三维模型3DTile格式轻量化的数据压缩与性能平衡关系分析 对于三维模型的3DTile格式轻量化处理,数据压缩和性能之间的平衡关系是一个重要的考虑因素。以下是这两者关系的详细分析:1、数据压缩与加载速度:显然,更高级别的压缩可以创造更小的文件大小,从而加快从服务器到客户端的传输......
  • Cesium加载三维模型rendering.Rendering has stopped
    使用Cesium加载数据量大、精度高的三维模型数据经常在运行一段时间后,会报如下错误:Anerroroccurredwhilerendering.Renderinghasstopped.TypeError:Failedtoexecute'shaderSource'on'WebGLRenderingContext':parameter1isnotoftype'WebGLShader'.这是由于GPU......
  • 三维模型3DTile格式轻量化压缩处理重难点分析
    三维模型3DTile格式轻量化压缩处理重难点分析 在对三维模型3DTile格式进行轻量化压缩处理的过程中,存在一些重要而又困难的问题需要解决。以下是几个主要的重难点:1、压缩率和模型质量之间的平衡:压缩技术的目标是尽可能地减少数据大小,但过度的压缩会降低模型的精度,影响最终的视......
  • 基于vue封装的Tag标签双击编辑单击选中可删除
    ......