【Cesium】3Dtiles建筑模型分层渲染的思路

这篇具有很好参考价值的文章主要介绍了【Cesium】3Dtiles建筑模型分层渲染的思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

欢迎查看

真的很久没有更新过博客了,最近入职了新公司,要做一个新的项目,使用到cesium,翻阅外网和国内各大网站,发现资料真的很少。国内很多资料都是翻译外网的,所以,没去过外网的同学,其实去不去也没必要了。而国内的环境真的是一筹莫展:要么就是有经验的人二次封装了js组件出售给人使用;要么就是有经验的人分享如何使用cesium,进阶的很少;要么就是有经验了,有demo,但是要钱,这个倒还好,钱也不算多,还可以进群和大家一起交流。

进群后,发现一个残酷的现实,大家使用cesium都是拿来做gis的,极少像我一样使用来渲染建筑类型。甚至有的,还要搭配three.js一起使用。想了一下,还是贡献一下这段时间探索的经验吧,给有需要的人参考。

分层渲染思路

我自己摸索的就这2种,其中第一种是我自己正在使用的,第二种是看了其他二次封装的商用JS组件后发现的,还没尝试,不过应该也不难。

1. 在建筑模型数据上就已经切割分好层,前端直接拿到渲染就可以了。

我目前就是这样做的,可以使用PrimitiveCollection 或者 scene.primitives.add循环把模型实例加进去。然后,对应的变量名就存在window下(当然存在别的地方也可以,建议是全局变量的形式),用的时候直接根据逻辑提取出来。

核心代码:

// tilesetUrlArr是模型tileset.json的地址集合
for (let i = 0; i < tilesetUrlArr.length; i++) {
   window['tileset' + i] = new Cesium.Cesium3DTileset({ url: tilesetUrlArr[i], tilesOption });
   // ...中间这里可以做很多操作,例如对模型的材质颜色进行修改、相机视角调整、模型偏移、楼层楼栋数据拆分等等
   viewer.scene.primitives.add(window['tileset' + i]);
}

这种方式建模师比较耗时间,当然前端也不容易(难点在于全局变量的使用),不过好处就是

每一个楼层都是单独的模型,可以一次性加载,也可以懒加载/按需加载

2. 一整栋模型里面每个构件赋予楼层属性。

然后,建议在渲染的时候就把符合的楼层属性的组件赋予到对应的楼层变量。控制分层渲染的时候,对这些变量进行处理就行(符合当前楼层的,就控制拥有当前楼层属性的构件显示,其余隐藏)。

大概核心代码:

window.allFeature = []; // 所有的构件信息

// 设置瓦片加载完成监听事件,以获取瓦片内的构件信息
tileset.tileLoad.addEventListener(function(tile) {
    processTileFeatures(tile, (feature) => {  // Tips:这里不采取别的方法绕一圈取得值的话,好像是没办法获得构件属性
        let properties = [];
        const propertyIds = feature.getPropertyIds();    // 点击设备构件后,可以通过GlobalId去设备列表中找到对应的设备
        propertyIds.forEach(item => {
            properties.push({
                'key': item, // 属性名
                'value': feature.getProperty(item) // 属性值
            });
        });
        feature.properties = properties;
        allFeature.push(feature); // TODO 数据太大,真不适合存起来,后续可以考虑怎么优化
    });
});

/**
 * 循环获取tile.content里面的Features(构件)
**/
function processContentFeatures(content, callback) {
    let featuresLength = content.featuresLength;
    for (let i = 0; i < featuresLength; i++) {
        let feature = content.getFeature(i);
        callback(feature);
    }
}
/**
 * 获取tile里面的content
 * Cesium3DTileset 通过 tileLoad、tileUnload等事件获取 Cesium3DTile(也就是tile),
 * 然后,Cesium3DTile通过content(tile.content)获取 Cesium3DTileContent(Cesium3DTileset 中瓦片的内容,也就是Feature)
**/
function processTileFeatures(tile, callback) {
    let content = tile.content;
    let innerContents = content.innerContents;
    if (Cesium.defined(innerContents)) {
        let length = innerContents.length;
        for (let i = 0; i < length; i++) {
            processContentFeatures(innerContents[i], callback);
        }
    } else {
        processContentFeatures(content, callback);
    }
}

// ...之后就对allFeature所有构件信息进行匹对,符合楼层属性的就显示。感觉如果构件多的话,会崩溃,慎用

注意的是:

这种方法的话,模型就只能一次性加载出来。且不适合大模型。

效果类似这种:Mars3D-BIM分层展示文章来源地址https://www.toymoban.com/news/detail-448560.html

到了这里,关于【Cesium】3Dtiles建筑模型分层渲染的思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Cesium:3DTiles三维模型高度调整

            地形遮挡属性          如下两张图所示,输入高度值,根据需要调整模型高度。例如:针对近地面的管线数据,可能有一部分是埋在地下的,那么,如果开启了地形遮挡属性(即:设置为true,默认是false),那么,在进行场景渲染加载模型切片时,就会进行深度测

    2024年02月11日
    浏览(91)
  • Cesium地图上加载3DTiles模型

    1,使用Blender创建模型: 官网下载Blender:https://www.blender.org/,在Github上下载Building Tools插件,通过编辑-偏好设置-插件-安装,导入压缩包使用,这个可以自己创建小房子,文件-导出为obj格式 2,将.obj转成3dtiles格式: 1,第一种方法通过加载本地文件展示: 1,github下载ObjTo3

    2024年02月03日
    浏览(45)
  • 【Cesium】调整3dtiles模型的光照

    最近有个项目需要把掘进车放到巷道里面,加载出来的效果一片漆黑,看不清模型细节。  由于Cesium中材质没有自发光的设置,所以只能设置光源。 在网上查了一些代码,Cesium的光照效果的设置是通过webgl修改白膜的材质来实现的,由于巷道本身有贴图材质,用该方法实现的

    2024年02月11日
    浏览(51)
  • Cesium加载3Dtiles模型-大疆智图

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

    2024年02月11日
    浏览(42)
  • cesium——加载3DTiles,模型的选中,高亮效果

    3DTiles是一种用于组织和传输大规模地理数据的规范,旨在提供一种高效、可扩展的方式来加载和显示复杂的3D模型。它革新了地理数据可视化领域,为创建逼真的三维地图提供了新的可能性。 3DTiles采用了一种层次化的数据结构,将地理信息按照空间范围划分成小块,类似于

    2024年02月07日
    浏览(58)
  • cesium-影像图&地形图&3dtiles模型

    ImageryLayer类: Cesium.ImageryLayer类用于表示Cesium中的影像图层,它就相当于皮毛、衣服,将数据源包裹在内,它需要数据源(imageryProvider)为其提供内在丰富的地理空间信息和属性信息,同时,通过该类还能设置影像图层相关属 性。 常用属性如下: name(名称), alpha(透明度) bri

    2024年02月06日
    浏览(71)
  • 解决cesium中3dtiles模型随视角移动

    我们在使用cesium的时候有时会遇到一个问题就是模型导入之后,模型没有固定住会随着视角的变化而移动,研究发现模型在地底下。我认为是建模的问题有可能是建模软件使用的坐标不是wgs84导致高程不一的原因,但我没试过。 解决方案是:1.打开深度检测 2.手动把模型提上

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

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

    2024年04月23日
    浏览(47)
  • Cesium示例程序学习和讲解(4)-调整3DTiles模型高度

    本节主要讲解的内容? 在三维场景中如何加载3dtiles模型,如何调整模型在场景中的高度 涉及的主要接口有? Cesium3DTileset、HeadingPitchRange、Cartographic、Matrix4 介绍下HeadingPitchRange接口接相关参数介绍? 当使用Cesium框架进行三维场景渲染时,常常需要在场景中创建相机视图。而

    2024年02月10日
    浏览(41)
  • 谷歌地球倾斜模型3Dtiles格式cesium格式一键导入查看

    台湾省倾斜模型ceisum 3Dtiles格式谷歌地球谷歌地 大家好我是谷谷GIS的开发者,为大家分享一下这个台湾省的,倾斜模型3Dtiles,这个模型3Dtiles的话它是基于cesium,3D倾斜模型3Dtiles,它的格式内容的话是模型3Dtiles,众所周知,这cesium是3D地球引擎来说的话,现在目前这个市场占比

    2024年02月11日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包