Cesium加载3D Tiles数据

使用原生Cesium加载3D Tiles数据,并实现对图层的选中、样式的修改、图元的隐藏。

实现代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    <meta name="viewport"
        content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
    <title>3D Tiles</title>
    <link href="../cesium-1.86/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
    <script src="./libs/jquery-2.1.1.min.js"></script>
    <script type="text/javascript" src="../cesium-1.86/Build/Cesium/Cesium.js"></script>
</head>

<body>
    <div id="cesiumContainer"></div>
    <script>

        let Viewer, tileset;
        let selectPickedEntity = null;

        // 切换自己的token
        Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJlYTQ2ZjdjNS1jM2E0LTQ1M2EtOWM0My1mODMzNzY3YjYzY2YiLCJpZCI6MjkzMjcsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1OTE5NDIzNjB9.RzKlVTVDTQ9r7cqCo-PDydgUh8Frgw0Erul_BVxiS9c';

        function onload(Cesium) {

            var obj = [6378137.0, 6378137.0, 6356752.3142451793];
            Cesium.Ellipsoid.WGS84 = Object.freeze(new Cesium.Ellipsoid(obj[0], obj[1], obj[2]));
            Viewer = new Cesium.Viewer('cesiumContainer', {
                infoBox: false,
                animation: false,       //动画
                homeButton: true,       //home键
                geocoder: true,         //地址编码
                baseLayerPicker: false, //图层选择控件
                timeline: false,        //时间轴
                fullscreenButton: true, //全屏显示
                infoBox: true,         //点击要素之后浮窗
                sceneModePicker: true,  //投影方式  三维/二维
                navigationInstructionsInitiallyVisible: false, //导航指令
                navigationHelpButton: false,     //帮助信息
                selectionIndicator: false, // 选择
            });
            //关闭logo
            Viewer._cesiumWidget._creditContainer.style.display = 'none';

            //addImageLayer();
            add3DTiles();

            function addImageLayer() {
                var imageryLayers = Viewer.imageryLayers;
                var subdomains = ['0', '1', '2', '3', '4', '5', '6', '7'];
                var tiandituTk = '天地图官网申请的Token';
                var labelImagery = new Cesium.WebMapTileServiceImageryProvider({
                    //影像底图
                    url: "http://t{s}.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=" + tiandituTk,
                    subdomains: subdomains,
                    layer: "tdtImgLayer",
                    style: "default",
                    format: "image/jpeg",
                    tileMatrixSetID: "GoogleMapsCompatible",//使用谷歌的瓦片切片方式
                    show: true
                })

                imageryLayers.addImageryProvider(labelImagery);
            }

            function add3DTiles() {
                tileset = Viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
                    url: '../3data/tileset.json',
                    shadows: Cesium.ShadowMode.DISABLED,
                    luminanceAtZenith: 1 //Cesium 1.53版本后增加的luminanceAtZenith,用来调节程序纹理的亮度
                }));

                tileset.readyPromise.then(function (layer) {
                    console.log('----->', layer, layer.content);
                    tileset.style = new Cesium.Cesium3DTileStyle({
                        color: {
                            conditions: [
                                // ["true", "color('white')"]
                                ["true", "rgba(255,255,255,1)"]
                            ]
                        },
                    });
                    Viewer.flyTo(tileset);
                    handle();
                }).otherwise(function (error) {
                    throw (error);
                });

                // 设置瓦片加载完成监听事件,获取所有的所有feature数据信息
                tileset.tileLoad.addEventListener(function (tile) {
                    let content = tile.content;
                    console.log(content);
                    let featuresLength = content.featuresLength;
                    console.log("要素数量为:" + featuresLength);
                    console.log("第一个要素为:");
                    let feature = content.getFeature(0);
                    console.log(feature);
                })
            }

            function handle() {
                var handler = new Cesium.ScreenSpaceEventHandler(Viewer.canvas);

                handler.setInputAction(function (movement) {

                    //还原前选择要素的本颜色
                    if (selectPickedEntity) {
                        selectPickedEntity.color = Cesium.Color.WHITE;
                        selectPickedEntity = null;
                    }

                    var pickingEntity = Viewer.scene.pick(movement.position);
                    //判断选择是否为Cesium3DTileFeature
                    if (pickingEntity instanceof Cesium.Cesium3DTileFeature) {
                        selectPickedEntity = pickingEntity;

                        var propertyNames = pickingEntity.getPropertyNames();
                        var length = propertyNames.length;
                        for (var i = 0; i < length; ++i) {
                            var propertyName = propertyNames[i];
                            console.log(propertyName + ': ' + pickingEntity.getProperty(propertyName));
                        }
                        //隐藏选中的要素
                        //pickingEntity.show = false;

                        //将模型变为黄色高亮
                        pickingEntity.color = Cesium.Color.RED;
                    }
                }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
            }
        }

        if (typeof Cesium !== 'undefined') {
            window.startupCalled = true;
            onload(Cesium);
        }
    </script>
</body>

</html>
实现效果

在这里插入图片描述

### 如何在Cesium加载GLTF格式的地下模型 #### 加载GLTF模型的一般方法 为了在Cesium加载GLTF格式的地下模型,首先需要确保所使用的模型是以GLTF或GLB格式存在的。如果不是这两种格式之一,则可能需要用特定工具将其转换为目标格式[^1]。 对于已经处于适当格式中的模型文件,可以通过`Entity`图元下的`ModelGraphics`对象来进行加载操作。这允许开发者指定要显示的具体3D资产路径以及应用必要的变换属性,比如位置、比例和方向等参数[^3]。 #### 设置模型的位置与姿态 当涉及到地下结构时,重要的是正确设定模型的空间定位及其相对于地球表面的姿态。由于这些类型的场景通常位于地面之下,因此坐标系的选择变得尤为关键。应采用适合表示深层地质特征的世界坐标系统,并调整模型的高度值以反映其实际埋藏深度。 此外,在某些情况下,还可能需要考虑地形数据的影响,以便更精确地模拟真实世界条件下的相对位置关系。为此,可以利用Cesium提供的地理空间功能来获取DEM(数字高程模型),并据此微调最终渲染出来的视觉效果[^4]。 #### 示例代码展示 下面给出了一段简单的JavaScript代码片段用于说明如何创建一个指向本地存储的GLTF文件的新实体实例: ```javascript var viewer = new Cesium.Viewer('cesiumContainer'); viewer.entities.add({ position : Cesium.Cartesian3.fromDegrees(longitude, latitude, altitude), // 设定具体经纬度及高度 model : { uri : 'path/to/your/model.gltf', // 替换为您的GLTF/GTLB资源链接 scale : 1.0, minimumPixelSize : 128 } }); viewer.zoomTo(viewer.entities); ``` 此段脚本会将给定坐标的点作为中心视点,并在此处放置由URI定义的3D物体;其中`scale`控制整体大小缩放因子而`minimumPixelSize`则用来保持最小像素尺寸不变从而实现LOD(细节层次)管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值