cesium——加载3DTiles,模型的选中,高亮效果

这篇具有很好参考价值的文章主要介绍了cesium——加载3DTiles,模型的选中,高亮效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3DTiles是一种用于组织和传输大规模地理数据的规范,旨在提供一种高效、可扩展的方式来加载和显示复杂的3D模型。它革新了地理数据可视化领域,为创建逼真的三维地图提供了新的可能性。

3DTiles采用了一种层次化的数据结构,将地理信息按照空间范围划分成小块,类似于3D瓦片。每个瓦片包含地理实体的几何形状、纹理贴图和层次结构信息。这种切片和分层的方式使得数据可以根据需要按需加载,从而降低了网络传输和计算资源的需求。

使用3DTiles,开发人员可以加载和呈现各种地理数据,如建筑物、地形、植被和其他点云数据等。它为基于Web的GIS应用提供了更好的性能和交互体验。用户可以在浏览器中平滑地导航和浏览模型,实时更改视图和展示参数。

此外,3DTiles的规范性设计使得它可以与其他GIS和地理数据标准(如地理坐标系、投影等)无缝集成。它的开放性和普及性使得很多GIS软件和服务已经支持3DTiles标准,从而为用户和开发人员提供了丰富的工具和资源。

总之,3DTiles为地理数据的可视化和交互提供了一种全新的方式。其中,加载3DTiles模型并实现选中和高亮效果是常见的需求之一。

因此,本文将介绍如何实现模型的选中和高亮效果。我们将详细讨论Cesium中的picking机制,引导读者根据用户的鼠标点击或触摸事件来选中模型。进一步,我们将讨论如何改变选中模型的外观,例如更改颜色、变更材质等,从而实现高亮效果。

如代码所示,主要通过修改片元着色器或color属性,实现模型的左键选中,右键取消效果,移入高亮效果;

<!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="../../Build/Cesium/Widgets/widgets.css" rel="stylesheet">
    <link href="./css/pretty.css" rel="stylesheet">
    <script src="./js/jquery.min.js"></script>
    <script type="text/javascript" src="../../Build/Cesium/Cesium.js"></script>
</head>

<body>
    <div id="cesiumContainer"></div>
    <script>
        function onload(Cesium) {
            console.log(Cesium.Ellipsoid.WGS84)
            var obj = [6378137.0, 6378137.0, 6356752.3142451793];
            Cesium.Ellipsoid.WGS84 = Object.freeze(new Cesium.Ellipsoid(obj[0], obj[1], obj[2]));
            var viewer = new Cesium.Viewer('cesiumContainer');
            const options = {
                skipLevelOfDetail: true,
                shadows: Cesium.ShadowMode.CAST_ONLY,
                baseScreenSpaceError: 1024,
                skipScreenSpaceErrorFactor: 16,
                skipLevels: 1,
                immediatelyLoadDesiredLevelOfDetail: false,
                loadSiblings: false,
                cullWithChildrenBounds: true,
                dynamicScreenSpaceError: true,
                dynamicScreenSpaceErrorHeightFalloff: 0.5,
                url: './SampleData/line/tileset.json'
            }
            const tileset = new Cesium.Cesium3DTileset(options)
            viewer.terrainProvider.visible = false;
            var ts = viewer.scene.primitives.add(tileset);
            console.log("ts", ts)
            ts.readyPromise.then(function () {
                var boundingSphere = ts.boundingSphere;
                viewer.camera.viewBoundingSphere(boundingSphere, new Cesium.HeadingPitchRange(0.0, -0.5, boundingSphere.radius));
                viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
            }).otherwise(function (error) {
                throw (error);
            });
            var screenSpaceEventHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
            let pickedObjectArr = [], shader = null
            screenSpaceEventHandler.setInputAction(function (e) {
                let pickedObject = viewer.scene.pick(e.position);
                if (pickedObject && pickedObject._content && pickedObject._content._features && pickedObject._content._features.length > 0) {
                    pickedObjectArr.push(pickedObject)
                    let feature = pickedObject._content._features[0]
                    const _model = feature.content._model
                    _model._shouldRegenerateShaders = true
                    console.log(_model._sourcePrograms)
                    console.log(_model._rendererResources.sourceShaders)
                    shader = _model._rendererResources.sourceShaders[1]
                    _model._rendererResources.sourceShaders[1] = _model._rendererResources.sourceShaders[1].replace("gl_FragColor = vec4(color, 1.0);", "gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);");
                    setTimeout(() => {
                        _model._shouldRegenerateShaders = false
                    }, 1000)
                    console.log(_model._rendererResources.sourceShaders[1])
                }

            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
            screenSpaceEventHandler.setInputAction(function (e) {
                while (pickedObjectArr.length > 0) {
                    let element = pickedObjectArr.shift();
                    let feature = element._content._features[0]
                    const _model = feature.content._model
                    _model._shouldRegenerateShaders = true
                    console.log(_model._sourcePrograms)
                    console.log(_model._rendererResources.sourceShaders)
                    _model._rendererResources.sourceShaders[1] = shader
                    console.log(shader)
                }

            }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
            let feature, _feature, tile
            const highlightColor = new Cesium.Color(1.0, 1.0, 0.0, 0.4);
            const oldColor = new Cesium.Color();

            screenSpaceEventHandler.setInputAction(function (e) {
                const picked = viewer.scene.pick(e.endPosition);


                if (picked instanceof Cesium.Cesium3DTileFeature) {
                    // Picked a feature
                    feature = picked;
                    if (feature === _feature && feature !== undefined) {
                        console.log("相同")
                        return
                    }
                    const currentFeature = _feature;
                    if (currentFeature && !currentFeature.content.isDestroyed()) {
                        currentFeature.color = oldColor;
                        // viewer.scene.requestRender();
                    }
                    tile = picked.content.tile;
                    Cesium.Color.clone(feature.color, oldColor);

                    feature.color = highlightColor;
                    // viewer.scene.requestRender();
                    _feature = feature;
                } else {
                    if (feature !== undefined && feature !== null) {
                        console.log("非模型,清除颜色")
                        feature.color = oldColor;
                        // viewer.scene.requestRender();
                        feature = null
                        _feature = null
                    }
                }

            }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
            $('#loadingbar').remove();
        }
        if (typeof Cesium !== 'undefined') {
            window.startupCalled = true;
            onload(Cesium);
        }
    </script>
</body>

</html>

cesium 选中,cesium,3d

 文章来源地址https://www.toymoban.com/news/detail-723879.html

到了这里,关于cesium——加载3DTiles,模型的选中,高亮效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Cesium加载3Dtiles模型-大疆智图

    Cesium加载3Dtiles模型步骤: (一)如果您使用的是大疆智图,则该软件可以直接输出3Dtiles格式(B3DM切片)的数据,如图所示:   (二)如果您使用的是CC(Smart3D),该软件可以输出OSGB格式的数据,我们可以借助: 1.osg2cesiumApp v1.3软件来将我们的OSGB倾斜摄影数据转换成3Dtil

    2024年02月11日
    浏览(43)
  • cesium加载显示点云及倾斜模型(3dtiles)

            在cesium加载并显示点云或者倾斜模型之前,需要将不同格式的数据转为3dtiles,具体参考倾斜、点云转3dtiles(osgb、las转3dtiles)切片         转换完成后就可以写代码将其加载到cesium地球上。         有时候加载完成并不能贴地显示,或者贴地显示的具体位置和底

    2024年04月23日
    浏览(47)
  • Cesium.js加载3dTiles格式倾斜摄模型影悬浮空中的解决办法

    在之前的博文中,已经讲过如何在Cesium中加载3dTiles格式的倾斜摄影模型(Cesium加载3D Tiles模型)。最近发现一个问题,新加载的倾斜摄影模型,都漂浮在空中,无法很好的贴合地面。分析了一些这个问题,可能是由于以下原因造成的: 飞行器的精度 倾斜摄影的参数问题 Ces

    2024年02月12日
    浏览(58)
  • 前端VUE框架通过Cesium加载3dtiles,计算3dtiles的面积

    前端VUE框架通过Cesium加载3dtiles,计算3dtiles的面积完整代码 前端开发中,使用Vue框架可以帮助开发者更高效地开发复杂的Web应用程序,并且越来越多的项目开始集成三维地球数据可视化。Cesium是一个开源的JavaScript库,可以轻松地实现地球数据的可视化,同时支持3D场景的绘制

    2024年02月08日
    浏览(55)
  • Cesium入门之十:Cesium加载3DTiles数据

    3DTiles是一种面向网格化、可展示的大规模三维空间数据格式,专门为流式传输和渲染海量3D地理空间数据而设计的,用于存储和管理基于网格的三维模型数据。其数据结构基于B3DM和PNTS格式,可以支持多个级别的LOD,并使用Tilesets(瓦片集合)来组织和管理数据。3DTiles具有以

    2024年02月12日
    浏览(54)
  • cesium加载3dtiles倾斜摄影数据

    效果如图 倾斜摄影数据的地址:百度网盘 请输入提取码 提取码:ztde 1.配置nginx,代理3dtiles倾斜摄影数据服务 如我的倾斜摄影数据放在D盘的某个文件夹里面,nginx可以这样配置    2.代码里面3dtiles的url指向倾斜摄影服务地址,同时配置一系列的参数 3dtiles的配置参数如下,可

    2024年02月11日
    浏览(50)
  • Cesium 加载3Dtiles数据-最佳方法对比

            Cesium加载空间数据的方法有很多种,网络上关于3Dtiles数据集加载的废话连篇,看着就很无语。这里我本人直抒胸臆,简单介绍一下数据的加载方式。         先打开Cesium的深度检测的开关,也可以不打开。                完成以上步骤后,利用Cesium的readyPromi

    2024年02月11日
    浏览(97)
  • Cesium加载城市白膜数据3DTiles

    首先,城市建筑数据可以去网上扒一些,拿到的都是 shp格式 的文件。 shp文件可以很方便的转为 Geojson文件 ,然后再通过Cesium导入也可以实现效果。效果如下所示: 图中就是用Geojson数据添加到地图中,大约有117000条数据,加载的效果还可以。但是数据量大加载时间会比较长

    2024年02月11日
    浏览(62)
  • 通过mars3d1.8+cesium1.6根据坐标获取对应坐标在3dtiles模型上的高度

    在前端开发中,使用地图和3D模型的需求越来越常见。然而,对于一些开发者来说,如何在3D模型上获取对应坐标的高度可能是一个挑战。在本文中,我们将介绍如何使用mars3d1.8和cesium1.6这两个强大的前端库来实现这一功能。 mars3d是一个基于Cesium的地图开发引擎,可以帮助您

    2024年02月12日
    浏览(40)
  • vue3结合Cesium加载倾斜摄影3dtiles

            这篇文章主要是为了记录加载3dtiles时模型与地形有时候存在一些高度上的差异,为此将解决方法做一个记录,便于其他读者使用。         加载倾斜摄影3dtitle           调整倾斜摄影高度         调用方式:

    2024年02月02日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包