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

紧接上文,我们需要将osgb格式转换为cesium可以读取的3dtiles格式

打开我们的cesiumlab(Cesium实验室官网),在官网下载并随便注册一个号就可以免费使用了。

选择倾斜模型转V4,界面如下:

数据路径为osgb的Data文件夹,空间参考零点坐标则不需要输入,cesiumlab会从与Data文件夹同路径的metadata.xml文件中读取

其他参数不需要修改,选择输出路径即可,静静等待软件的处理:

数据处理完成后,记得点击三维可视,加载刚才生成的3dtiles瓦片,如果打得开的话,恭喜你成功了!

前期准备到这里结束,接下来就到了本研究最核心的部分(有够拖沓的我)

1.获取模型的范围

1.1获取模型中心点

首先我们要获取模型的中心点数据,先查看3Dtiles的原始数据

有些3Dtiles的格式可能不太一样,如果存在region字段的话是比较好办的,如果没有的话,那么就得利用他的transform字段

transform是一个矩阵,模型的几何中心点坐标储存在其中,但是坐标系为地心坐标系:

地心坐标系的模型中心点是可以直接添加在Cesium上的,但是我们需要的不是中心点,是模型的四至,我们需要模型的平面坐标系的四至。

为什么这么说,我们回过头来看3Dtiles中的boundingVolume,其中它包含了一个box的矩阵:

box是一个4*3的矩阵,第一行[0,1,2]代表了中心点的[x,y,z]偏移量,第二行[3,4,5]代表了四至的[x,0,0]偏移量,第三第四行以此类推。

得到模型的中心点平面坐标后,加减偏移量就可以获得模型的四至,以下是实现的代码(片段):

tilesset.allTilesLoaded.addEventListener(function a() {//单纯的xyzvar x = tilesset.root.transform[12];var y = tilesset.root.transform[13];var z = tilesset.root.transform[14];var box = tilesset.root._header.boundingVolume.box;var centerpoints = [];centerpoints.push(x);centerpoints.push(y);centerpoints.push(z);console.log(centerpoints)//单纯的经纬度var ellipsoid=viewer.scene.globe.ellipsoid;var cartesian3=new Cesium.Cartesian3(x,y,z)var cartographic=ellipsoid.cartesianToCartographic(cartesian3);var lat=Cesium.Math.toDegrees(cartographic.latitude);var lng = Cesium.Math.toDegrees(cartographic.longitude);//获取中心点var alt = cartographic.height;var centerpoint = [];centerpoint.push(lat);centerpoint.push(lng);centerpoint.push(alt);console.log(centerpoint);var k = [1,1,0,1,-1,0,-1,-1,0,-1,1,0];var point1 =[] ,point2 = []for (var i = 0; i < 4; i++) {for (var j = 0; j < 3; j++) {point1[j] = box[0 * 3 + j] + k[i * 3 + j] * box[(j + 1) * 3 + j] - k[i * 3 + j] * 5;   }//内缩边界xyzTransform(centerpoints, centerpoint, point1);}
});
//开启地形检测
viewer.scene.globe.depthTestAgainstTerrain = true;function xyzTransform(xyzbase, centerpoint, box) {var d2r = Math.PI/180.0var sinL0 = Math.sin(d2r*centerpoint[1]), cosL0 = Math.cos(d2r*centerpoint[1]);  // 经度var sinB0 = Math.sin(d2r*centerpoint[0]), cosB0 = Math.cos(d2r*centerpoint[0]);  // 纬度var dxyz =[], xyz = [];var dxyz0 = -sinL0 * box[0] - sinB0 * cosL0 * box[1] + cosB0 * cosL0 * box[2];var dxyz1 = cosL0 * box[0] - sinB0 * sinL0 * box[1] + cosB0 * sinL0 * box[2];var dxyz2 = cosB0 * box[1] + sinB0 * box[2];dxyz.push(dxyz0)dxyz.push(dxyz1)dxyz.push(dxyz2)for (var i = 0; i < 3; i++) {xyz[i] = xyzbase[i] + dxyz[i];}var ellipsoid=viewer.scene.globe.ellipsoid;var cartesian3=new Cesium.Cartesian3(xyz[0],xyz[1],xyz[2])var cartographic=ellipsoid.cartesianToCartographic(cartesian3);var lat= Cesium.Math.toDegrees(cartographic.latitude);var lng = Cesium.Math.toDegrees(cartographic.longitude);var alt = cartographic.height;window.centerpoint1 = [];centerpoint1.push(lat);centerpoint1.push(lng);centerpoint1.push(alt);//三维模型的内缩边界// createPoint(xyz)window.polygon.push(xyz)
}

地心坐标系转换为平面坐标系,网上的公式很多,只要找一下然后自己写一下就好,这里就不介绍原理了。

这里我们便获得了一个polygon,一个面。

在加减模型的四至point1那里,我添加了一个k矩阵的计算在最后面,它的作用是,使得这个面内缩五米(乘5)

point1[j] = box[0 * 3 + j] + k[i * 3 + j] * box[(j + 1) * 3 + j] - k[i * 3 + j] * 5;  

为什么要这么做呢,因为在polygon被作为裁剪面的时候,由于瓦片的特性,瓦片边缘在不同的层级会出现不同的被狗啃的现象

于是乎我们要留一点缓冲地带,这就是为什么要将裁剪范围内缩一点,留一点重叠度,美观一点。

2.模型压平

接下来我们利用得到的这个裁剪面polygon,对模型进行模型处理,这个功能在cesium的沙盒中就可以找到,非常方便,只需要进行参数的替换便可

Cesium Sandcastle

将我们的polygon参数替换到示例中的白框,便完成了模型压平功能。

如果使用案例不可以的话,欢迎私聊我~也有可能单独开一篇来写模型压平。

3.模型更新

这个就更简单了,我们只需要预加载了新模型,然后将其隐藏。

window.tilesset = new Cesium.Cesium3DTileset({url: "http://xx.xx.xxx.xx:xxxx/data/3dtiles/qingxiemodel/tileset.json"//新模型发布的路径
})
// console.log(tilesset)
viewer.scene.primitives.add(tilesset)
window.tilesset.show = false//隐藏新模型

在旧模型被压平之后再将其展示出来就可以了

window.tilesset.show = true;

至此,基本的实景三维模型动态更新流程就结束了,效果如下:

明天开始是番外篇了,会是一些奇奇怪怪的问题总结,如果有疑问,留在评论区或者私信我,感谢您读我的文章以及对我研究的可定~,下期再会

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

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

    基于Cesium的实景三维模型动态更新-以3Dtiles为例(一)_lwx2233的博客-CSDN博客 在上一节中,我们了解了实景三维模型动态更新的本质,这一节我们来讲讲三维模型更新的技术路线 有两条 ...

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

    一.简介 Cesium众所周知,是一个前端的三维框架,本项目利用Cesium平台来实现实景三维模型的动态更新. (不认识Cesium的同学戳这里:cesium中文网 | 学习cesiumjs 的好地方 ...

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

    在进行实景三维模型动态更新的时候,经常会出现一些误差问题,这里将我遇到的问题以及解决方法统一写出来: 1.模型高度问题 在无人机采集数据倾斜建模后,可能会出现新旧模型高度不一致的情况,如下图: 可以通 ...

  4. 基于聚类的推荐算法笔记——以豆瓣电影为例(三)(附源代码)

    基于聚类的推荐算法笔记--以豆瓣电影为例(三)(附源代码) 第一章 聚类算法介绍 基于聚类的推荐算法笔记一 第二章 数据介绍 基于聚类的推荐算法笔记二 第三章 实现推荐算法 基于聚类的推荐算法笔记三 ...

  5. python动态更新窗口上的图片_基于Python实现matplotlib中动态更新图片(交互式绘图)...

    最近在研究动态障碍物避障算法,在Python语言进行算法仿真时需要实时显示障碍物和运动物的当前位置和轨迹,利用Anaconda的Python打包集合,在Spyder中使用Python3.5语言和mat ...

  6. python动态绘图并保留之前绘图_[转]基于Python实现matplotlib中动态更新图片(交互式绘图)...

    最近在研究动态障碍物避障算法,在Python语言进行算法仿真时需要实时显示障碍物和运动物的当前位置和轨迹,利用Anaconda的Python打包集合,在Spyder中使用Python3.5语言和mat ...

  7. seo vue 动态路由_基于vue.jsvue-router的动态更新TDK(SEO优化)

    本文基于工作项目开发,做的整理笔记 前几天帮朋友解决这个问题,顺带学习了一下,做个笔记Mark下. 前提条件: 你已经了解并使用vue,能够搭建应用站点. 编码环境: system:OS X EI C ...

  8. ​ES elasticsearch-analysis-dynamic-synonym​连接数据库动态更新synonym近义词

    前言 在很多搜索场景中,我们希望能够搜索出搜索词相关的目标,同时也希望能搜索出其近义词相关的目标.例如在商品搜索中,搜索"瓠瓜",也希望能够搜索出"西葫芦",但 ...

  9. Centos DNS服务(二)-bind主从配置与基于TSIG加密的动态更新

    DNS的主从配置 DNS从服务器也叫辅服DNS服务器,如果网络上某个节点只有一台DNS服务器的话,首先服务器的抗压能力是有限的,当压力达到一定的程度,服务器就可能会宕机罢工, 其次如果这台服务器出现了 ...

最新文章

  1. css之line-height及图片文字垂直居中
  2. jQuery 7 节点遍历
  3. 通信原理-确知信号的最佳接收
  4. python生成柱状图 不显示_python – Matplotlib图表不显示在PyCharm中
  5. 选择之后触_发宜常梳:4种材质的梳子,我们最常用的梳子却对头发最不好,该如何选择?...
  6. 7.6 yum更换国内源 7.7 yum下载rpm包 7.8/7.9 源码包安装
  7. 鼠标按下改变RelativeLayout背景颜色,松开变回
  8. 记录一次conda环境报错的解决ImportError:: Library not loaded: @rpath/libffi.7.dylib
  9. mysql gps海拔表_GPS海拔表
  10. 实现用户裂变的5大原则
  11. 前台获取信息进行跳转
  12. php栏目一二级排序,灵动标签完美实现当前栏目高亮-支持二级栏目及内容页及栏目排序...
  13. Android TV H5 电视应用
  14. IEDA中maven设置远程仓库地址和maven Could not find artifact 问题解决
  15. 淘宝商品历史价格接口/商品历史价走势接口对接代码分享
  16. 推荐 10 款 C++ 在线编译器
  17. excel表格如何转换成word表格_将excel/word数据复制粘贴到word表格的几种方式
  18. opus 编码和解码完整demo代码,opus和wav互转(js源码)
  19. 讲道理 | 计算正交投影算子
  20. 如何做默认样式重置?RESETTING 和 NORMALIZING 之间有什么区别?

热门文章

  1. 微信信息会经过根服务器么,小心,微信这个功能会把包括你性取向在内的信息暴漏的一览无余!...
  2. java怎么获取手机权限,Android 获取手机全部应用包名以及权限
  3. 网易蜂巢:致力于改变互联网软件生产方式
  4. networkx图中识别关键节点的中心性函数
  5. 软件测试分为几个阶段 各阶段的测试策略和要求
  6. 《ESP32-S2 笔记》 Arduino 上的开发环境搭建
  7. (天高云淡)墨渊第六版引导页源码 彩虹云任务引导页源码
  8. 补充学习——原始套接字中协议结构体
  9. [职场天地] 十年,干货送给后来人
  10. 如何创建幻灯片iPad版网站