CESIUM例子学习(七)——Classification Types

本文探讨了在3DTiles上进行线绘制与单体化效果的实现过程,包括解决绘制线失败的问题及如何通过代码实现倾斜摄影模型的单体化效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一个非常有用的例子。主要讲的是在3dtiles倾斜摄影上的绘制与单体化实现。

一、在倾斜摄影上绘制线(失败!)原因找到了,版本问题

该例子的第一个是以三种模式绘制线,即帖地模式、帖3dtiles模式和两同时绘制模式。

1、例子原码:

var polyline = viewer.entities.add({
  polyline: {
    positions: Cesium.Cartesian3.fromDegreesArray([
      -75.60217330403601,
      40.04102882709425,
      -75.59968252414251,
      40.04093615560871,
      -75.598020153828,
      40.04079437042357,
      -75.59674934074435,
      40.040816173283304,
      -75.59630042791713,
      40.03986900370842,
      -75.59563636849978,
      40.03930996506271,
      -75.59492397899098,
      40.03873932846581,
      -75.59457991226778,
      40.038392701955786,
      -75.59424838652453,
      40.03775403572295,
      -75.59387104290336,
      40.03677022167725,
      -75.59355000490342,
      40.03588760913535,
    ]),
    width: 8,
    material: new Cesium.PolylineOutlineMaterialProperty({
      color: Cesium.Color.YELLOW,
      outlineWidth: 2,
      outlineColor: Cesium.Color.BLACK,
    }),
    clampToGround: true,
  },
});

代码中也没有什么特别的,主要是: clampToGround: true。然后就是在下拉菜单中配置了

 polyline.polyline.classificationType =
        Cesium.ClassificationType.CESIUM_3D_TILE;

从而实现了在3dtiles表面绘制线的功能。实现的效果,如下图:

图中可以看到,地面与3dtiles上都绘制了线。

2、加载线的原码

function drawPolyline () {
    let linePoints = [
        110.09626992048491,
        22.604435413684214,
        110.09772947885747,
        22.6044007535433,
        110.10042821679957,
        22.604406197660317,
        110.10077969573116,
        22.60444694171489,
        110.10333075940922,
        22.6045239767194,
        110.104544609548,
        22.604631795978776,
        110.10523390730035,
        22.60469426643001,
        110.10780977717386,
        22.605159958646965
    ]
    var polyline = viewer.entities.add({
        id: "polyline",
        polyline: {
            positions: Cesium.Cartesian3.fromDegreesArray(linePoints),
            width: 8,
            material: new Cesium.PolylineOutlineMaterialProperty({
                color: Cesium.Color.YELLOW,
                outlineWidth: 2,
                outlineColor: Cesium.Color.BLACK,
            }),
            clampToGround: true,
        },
    });
    polyline.polyline.classificationType = Cesium.ClassificationType.BOTH;
}

但是我的代码实现的结果却是无法在3dtiles上绘制线。如下图:

我已经放弃了,因为找了好想了很久都没找到原因,后面找到 原因再来更新。

二、倾斜摄影单体化效果

四年前就接触过倾斜摄影模型,当时各种转换之后,加载到world wind的三维引擎中,没有实现LOD,效果非常不好,单机本地加载都卡,也没有实现单体化。其实现在的cesium,也没有去真正实现单体化,比如:把建筑物从周边环境中单体化出来,从达到的效果来看,cesium应该是可以实现的,但是没必要了。从可视化效果来说,看上去是单体化的就行了。实现代码如下:

function addPolygon () {
    let polygonHierarchy = new Cesium.PolygonHierarchy([
        {
            x: -2024823.5909592435,
            y: 5532370.714988579,
            z: 2436302.25492001
        }, {
            x: -2024826.5283445264,
            y: 5532369.096897423,
            z: 2436303.7183121936
        }, {
            x: -2024819.1251608054,
            y: 5532363.621243293,
            z: 2436322.269562056
        }, {
            x: -2024791.4827142982,
            y: 5532376.632168545,
            z: 2436315.3573567793
        }, {
            x: -2024796.595963898,
            y: 5532380.507406193,
            z: 2436302.7104098746
        }, {
            x: -2024816.0491223074,
            y: 5532372.296575263,
            z: 2436305.244446241
        }, {
            x: -2024818.6768914957,
            y: 5532374.524629378,
            z: 2436299.36777942
        }, {
            x: -2024827.1131517782,
            y: 5532369.755417354,
            z: 2436301.917306005
        }])
    var polygon = viewer.entities.add({
        id: "polygon",

        polygon: {
            hierarchy: polygonHierarchy,
            material: Cesium.Color.RED.withAlpha(0.9),
            classificationType: Cesium.ClassificationType.CESIUM_3D_TILE,
        },
    });
}

看上去没什么特别的。只一句: classificationType: Cesium.ClassificationType.CESIUM_3D_TILE就搞定。但是底层的应该是做了很多计算,也就是要从瓦片中找出在绘制多边形内的构成模型的三角面或者点。效果如下图:

三、倾斜摄影单体化效果纹理

跟上面加载多边形代码一样,只是把material值改成纹理的url即可。即:material = "../images/Cesium_Logo_Color.jpg"。效果如下图:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值