基于Cesium的实景三维模型动态更新-以3Dtiles为例(二)

基于Cesium的实景三维模型动态更新-以3Dtiles为例(一)_lwx2233的博客-CSDN博客

在上一节中,我们了解了实景三维模型动态更新的本质,这一节我们来讲讲三维模型更新的技术路线

两条,其中一条很抱歉我没有走通,但我也会将我当时的想法写出来。

一.原数据更新法(失败的way)

1.如果我们想要更新一样东西的话,无疑从最原始的地方开始入手——osgb或者3Dtiles

一开始的想法是文件直接替换,但是显然行不通,先来看看osgb的文件格式:

在Data文件夹中,存放有瓦片文件夹,就是我们所熟知的tile,它是以行列号来读取与排序的

每个瓦片文件夹中又存放有不同层级的osgb文件

L后面的数字就代表着层级,如果我们要替换的话,势必是整个文件去替换

那么问题来了,每个无人机架次飞出来的倾斜模型,无法保证在同区域模型的行列号一致

也就是说,在新模型中,相对应的行列号瓦片不一定和旧模型的位于同区域

所以不能对osgb进行替换。

2.回过头我们来看看3dtiles,先看文件格式:

Cesium展现3dtiles是通过读取文件夹中的tileset.json这个文件,下面是它的内容:

3Dtiles是通过不断的读取children来加载瓦片,在children中的uri,对应了文件夹中不同层级的瓦片,也就是我们熟知的b3dm

 所以如果我们对3Dtiles的各个瓦片文件夹进行替换,也同样会遇到像osgb一样的问题

总结来说,从文件直接替换来对实景三维模型进行更新,是不可行的,无法保证同行列号同区域

二.表面更新法(成功的way)

既然在原数据上动手脚不可行,那只能在读取加载完毕后进行替换 

这个原理就比较简单了,我们只需要先加载旧模型,然后将旧模型需要更新的地方进行挖空处理,再将同位置上的新模型放上去,这样就做到了实景三维模型的动态更新。

0.前期准备

利用倾斜摄影三维建模技术所获得的实景三维更新模型,其范围较实际更新区域更大。为了减少服务器加载三维模型的时间,本研究通过对实景三维模型裁剪的方式,减少三维模型加载时对服务器的负载,同时也方便前端对更新模型区域的获取,技术路线如下:

0.1 实景三维更新区域的确定

利用二三位一体化平台,获取实景三维更新模型的范围(通常为矩形),将其填入相对应字段的点要素表格中,以经纬度的方式来记录,字段名如下:

Id

x

y

1

23.13030037

113.6574888

2

23.12670869

113.6574887

3

23.12670869

113.6536053

4

23.13030037

113.653605

0.2生成裁剪面要素

使用Arcgis软件,将点要素表格加载,通过“数据管理工具”中的“点集转线”工具,先将点要素表格转换为线要素,再通过“要素转面”工具,生成实景三维更新模型所需要的裁剪范围面要素。

这里你需要注意他的空间参考!!!!

0.3裁剪实景三维模型

将裁剪面要素导出为shapefile格式,并使用supermap软件中打开,通过“生成倾斜摄影配置文件”功能来加载实景三维模型,源路径为模型的Data文件夹,而元数据则是Data文件夹同目录下的metadata.xml文件。

在“工作空间”的“场景”中,选择新建球面场景,该球体类似于Cesium的三维球体,通过该球体将实景三维模型展现在上面。

在图层中添加生成的倾斜摄影配置文件,三维模型便会呈现在三维球体上。同时将裁剪面要素加载在图层中,将实景三维更新模型与裁剪面要素叠加展示(由于裁剪面要素不存在高度这一属性,所以会被具有高度的实景三维模型所覆盖)。

在同一空间参考下,同时加载裁剪面要素与实景三维模型,通过“三维地理设计——倾斜摄影操作——裁剪”,选择“裁剪多边形”为裁剪面要素polygon,便可以将所需要的三维模型裁剪出来,输出为osgb格式。

好,这样子我们就获得了我们想要的更新区域的实景三维模型(osgb格式)

接下来我们需要将其转换为cesium可以读取的3dtiles格式,敬请期待下一期,如果对流程有什么不懂的地方,欢迎与我交流,谢谢!

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 3dtiles模型动态压平可以通过合理设置Cesium的CameraOptions属性来实现,如设置camera.frustum.far,camera.frustum.near,camera.frustum.fov等属性。 ### 回答2: 在Cesium中,要实现3D Tiles模型动态压平,可以通过以下步骤实现: 1. 首先,加载3D Tiles模型文件。可以使用Cesium的`Cesium3DTileset`对象来加载3D Tiles模型文件,并将其添加到场景中。例如: ```javascript var tileset = new Cesium.Cesium3DTileset({ url: 'path/to/3dtiles/file' }); viewer.scene.primitives.add(tileset); ``` 2. 为了实现动态压平效果,需要使用相机的高度来改变3D Tiles模型的显示程度。可以通过监听相机的高度变化动态调整模型的显示程度。例如: ```javascript viewer.scene.camera.moveEnd.addEventListener(function() { var cameraHeight = viewer.scene.camera.positionCartographic.height; tileset.maximumScreenSpaceError = cameraHeight / 1000; // 调整最大屏幕空间误差参数 }); ``` 将`maximumScreenSpaceError`参数值设置为相机高度的适当比例,可以根据实际需要调整。 3. 接下来,需要在3D Tiles模型加载完成后,使用`readyPromise`来确保模型已经完全加载进来。这样可以避免在模型加载过程中产生抖动或镜像效果。例如: ```javascript tileset.readyPromise.then(function(tileset) { tileset.maximumScreenSpaceError = viewer.scene.camera.positionCartographic.height / 1000; }); ``` 通过以上步骤,就可以实现Cesium3D Tiles模型动态压平效果。根据相机高度的变化模型的显示程度将自动调整,从而实现动态压平的效果。 ### 回答3: 在Cesium中实现3dtiles模型动态压平,需要进行以下步骤: 1. 导入Cesium3dtiles模型:首先,你需要使用Cesium的加载器函数将3dtiles模型导入到Cesium中。加载器函数会加载3dtiles文件并将其在场景中呈现为3D模型。 2. 获取模型的高度信息:在Cesium中,可以使用模型的位置和高度信息来动态压平模型。你可以使用Cesium提供的函数来获取模型的高度信息,例如`model.position`和`model.height`。 3. 实现动态压平:一旦获得了模型的高度信息,你可以使用Cesium的几何操作函数来动态压平模型Cesium中的函数可以用于改变模型的顶点坐标,以实现压平效果。例如,你可以根据模型的高度信息修改顶点的Y坐标,并重新计算法线和纹理坐标。 4. 更新模型:完成对模型动态压平后,你需要使用Cesium提供的API来更新模型。可以使用Cesium更新函数来应用新的顶点坐标、法线和纹理坐标,以确保3D模型在场景中正确显示。 总结:实现Cesium中的动态压平需要导入3dtiles模型、获取模型的高度信息,使用几何操作函数进行动态压平,然后更新模型以显示在场景中。这些步骤将确保3D模型Cesium中进行动态压平。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值