Cesium:入门教程(五)之 3D Tiles

3D Tiles

    Cesium 与开源社区合作开发了3D Tiles,用于传输海量的异构三维地理空间数据集。使用概念上类似于Cesium的terrain和imagery的流技术,3D Tiles 使得可以查看原本不能交互式查看的巨大的模型,包括建筑物数据集、CAD(或BIM)模型、点云和摄影测量模型。

格式

用途

异构3D模型(b3dm)

大型异构3D模型,包括三维建筑物、地形等

实例3D模型(i3dm)

3D模型实例,如树、风力发电机等

点云(pnts)

点云

组合数据(cmpt)

以上不同格式的切片组合到一个切片中

  📍 上述的异构3D模型(b3dm)和实例3D模型(i3dm)是基于glTF构建的,点云格式不嵌入glTF中。 

    加载数据(需要到 Cesium ion 添加该数据

var city = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url: Cesium.IonResource.fromAssetId(75343) }));

    注:官方给的例子中 AssetId 为3839 ,但我在 Asset Depot 没找到该数据,所以使用 New York City 3D Buildings(75343)

    注:可以上传自己的数据到Cesium ion,并将其瓦片化为3D Tiles [链接]

Cesium ion 支持转换的数据格式:glTF (.gltf, .glb)、CityGML (.citygml, .xml, .gml)、 KML(.kml, .kmz)、LASer (.las,.laz)、COLLADA(.dae)、wavefront OBJ(.obj)

    你可能注意到建筑物没有正确地定位在地平面上。幸运的是,它很容易修复。我们可以通过修改模型矩阵modelMatrix来调整tileset的位置。我们可以通过将tileset的边界球转换成地图Cartographic,然后添加期望的偏移量并重置模型矩阵,从地面找到模型modelMatrix的当前偏移量。

var heightOffset = -32;
city.readyPromise.then(function(tileset) {
    // Position tileset
    var boundingSphere = tileset.boundingSphere;
    var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
    var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
    var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset);
    var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
});

    漫游到 New York 

    3D Tiles 还允许我们使用 3D Tiles styling 语言 来调整我们的样式

var defaultStyle = new Cesium.Cesium3DTileStyle({
     color :  "color('gray', 0.5)", // 让建筑变透明
     show : true
});

city.style = defaultStyle;

     我们还可以使用特定于每个特征的属性来确定造型。下面是一个基于建筑物高度的建筑物颜色的例子:

var heightStyle = new Cesium.Cesium3DTileStyle({
    color : {
        conditions : [
            ["${Height} >= 300", "rgba(45, 0, 75, 0.5)"],
            ["${Height} >= 200", "rgb(102, 71, 151)"],
            ["${Height} >= 100", "rgb(170, 162, 204)"],
            ["${Height} >= 50", "rgb(224, 226, 238)"],
            ["${Height} >= 25", "rgb(252, 230, 200)"],
            ["${Height} >= 10", "rgb(248, 176, 87)"],
            ["${Height} >= 5", "rgb(198, 106, 11)"],
            ["true", "rgb(127, 59, 8)"]
        ]
    }
});

city.style = heightStyle;

    交互式修改样式

3D Tile Styling
<select id='tileStyle'>
   <option value ="transparent">Transparent</option>
   <option value ="height">Height</option>
</select>
var tileStyle = document.getElementById('tileStyle');
    function set3DTileStyle() {
        var selectedStyle = tileStyle.options[tileStyle.selectedIndex].value;
        if (selectedStyle === 'transparent') {
            city.style = defaultStyle;
        } else if (selectedStyle === 'height') {
            city.style = heightStyle;
        }
    }

tileStyle.addEventListener('change', set3DTileStyle);

    多数情况下3D Tiles数据都是成片区的数据,数据量比较大,所以为了保证性能,使用Primitive方式加载。

系列

    Cesium:入门教程(一)之 Hello World

    Cesium:入门教程(二)之数据源加载

    Cesium:入门教程(三)之视窗配置

    Cesium:入门教程(四)之 Entities

    Cesium:入门教程(五)之 3D Tiles

    Cesium:入门教程(六)之 交互性(Interactivity)

参考

   3d-tiles/specification at main · CesiumGS/3d-tiles · GitHub

   Introducing 3D Tiles – Cesium

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
制作 Cesium 3D Tiles 地形需要准备高程数据和纹理数据,并使用 Cesium 提供的工具进行处理和转换。下面是一个基本的制作流程: 1. 准备高程数据:获取高程数据,可以是 DEM(数字高程模型)文件、LIDAR 数据等。确保数据的分辨率和覆盖范围适合您的需求。 2. 准备纹理数据:获取地表纹理图像,可以是卫星图像、航拍图像等。确保纹理图像和高程数据的对应关系正确。 3. 使用 Cesium 3D Tiles 高程工具:Cesium 提供了 `CesiumTerrainBuilder` 工具,用于将高程数据转换为 3D Tiles 格式。您可以按照 Cesium 官方文档中的说明进行安装和使用。 4. 使用 Cesium 3D Tiles 纹理工具:Cesium 还提供了 `Cesium3DTilesServer` 工具,用于将纹理数据转换为 3D Tiles 格式。同样,您可以按照官方文档中的说明进行安装和使用。 5. 合并高程和纹理数据:将生成的高程 3D Tiles 和纹理 3D Tiles 进行合并,以创建完整的地形数据集。您可以使用 `tileset.json` 配置文件来描述数据集的元数据和属性。 6. 加载和显示地形:使用前面提到的方法,将地形数据集加载到 Cesium Viewer 中,并设置合适的相机视角和其他显示参数。 请注意,制作 Cesium 3D Tiles 地形需要一定的数据处理和计算资源。具体的细节和工具使用方法,请参考 Cesium 官方文档和示例代码。 希望这些信息对您有所帮助!如果您还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值