添加 3D Tiles,并调整位置
3D Tiles 是什么
3DTiles数据集是cesium小组AnalyticlGraphics与2016年3月定义的一种数据集,3DTiles数据集以分块、分级渲染,将大数据量三维数据以分块,分层的形式组织起来,可以大量减轻浏览器和GPU的负担是一个优秀的,并且格式公开的数据格式。
3D Tiles将用于流式传输3D内容,包括建筑物,树木,点云和矢量数据。
3D Tiles
3D Tiles将用于流式传输3D内容,包括建筑物,树木,点云和矢量数据。
contextCapture 可以将无人机成果转换成Cesium支持的倾斜摄影成果,当前例子就是使用的这种成果。
数据的加载比较简单
var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
url: url, //数据路径
maximumScreenSpaceError: 2, //最大的屏幕空间误差
maximumNumberOfLoadedTiles: 1000, //最大加载瓦片个数
modelMatrix: m //形状矩阵
}));
但是问题在于生成的数据不一定是落在地面上,有可能是浮在空中的,例如:
这并不是我们想要的,我们希望拍摄的成果能贴到地面上,和地图能很好的融合在一起,类似这样
由于单个瓦片的位置信息是写到了数据中的(.b3dm和对应的json文件中),如果能整体调整加载后的tileset,就会是最好的选择,这里就要提到本文的主角:
modelMatrix
通过查看API文档,我们发现Cesium3DTile里面有一个属性,可以更改位置(当然通过查看源码也可以查这个)
transform : Matrix4 Scene/Cesium3DTile.js 88
The local transform of this tile
说明通过矩阵运算是可以调整整个数据的显示位置的
以下说明矩阵平移的情况:
1. 自己获取偏移量
参考《WebGl编程指南》的第三章第四章
Tx,Ty,Tz就是我们需要设置的 x,y,z方向上的平移距离
由于Cesium的矩阵是列主序的,所以这里写成
//创建平移矩阵方法一
// m = Cesium.Matrix4.fromArray([
// 1.0, 0.0, 0.0, 0.0,
// 0.0, 1.0, 0.0, 0.0,
// 0.0, 0.0, 1.0, 0.0,
// x, y, z, 1.0
// ]);
//创建平移矩阵方法二
var translation=Cesium.Cartesian3.fromArray([x, y, z]);
m= Cesium.Matrix4.fromTranslation(translation);
//生效
tileset._modelMatrix = m;
这里我们只需要不断的修改 x,y,z,就可以调整物体的位置了
获取 x,y,z 之后,在加载3D Tiles 时将modelMatrix 设置成目标 x,y,z值,就完成了
2.计算偏移量
一步到位
//方法二,直接调用函数,调整高度,height表示物体离地面的高度
function changeHeight(height) {
height = Number(height);
if (isNaN(height)) {
return;
}
var cartographic = Cesium.Cartographic.fromCartesian(tileset.boundingSphere.center);
var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude,height);
var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
}
参考代码:lesson02
1.64版本旋转问题请看这里 Cesium实战(十九)解决新版本3DTile旋转缩放问题
你好,我在运行这个例子的时候发现,只有上面悬浮的物体,而底层的城市图却不能显示,请问这是为什么呀?
bing 地图需要key,换个地图服务
这个bing地图的key从哪里添加呢
Cesium.Ion.defaultAccessToken="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMThlZGJlYi04OGJjLTRhZjMtYWU5Yy0zNTE3N2E2MzFiOTgiLCJpZCI6MjU5LCJzY29wZXMiOlsiYXNyIiwiZ2MiXSwiaWF0IjoxNTc1MjkzODg2fQ.9pV-L1TWD9wv-6XKiVXCR1LIGb-RSD-Ezs7JJkL_Lj0";
var viewer = new Cesium.Viewer('cesiumContainer');
楼主bing key会跟机器绑定吗
不会
这个key怎么用的 我的cesium-test页面没有地球
我用的Cesium1.69,是调用Cesium.BingMapsApi.defaultKey = ‘key’,进行设置
你好,这个加上之后页面变成了一片空白是怎么回事呀
报错了吧,调试一下
var viewer = new Cesium.Viewer(‘cesiumContainer’,{
imageryProvider: new Cesium.SingleTileImageryProvider({
url: ‘../img/worldimage.jpg’
}),
baseLayerPicker:false,
});
可能从git上下载的代码依赖的Build版本有问题,给加上 baseLayerPicker:false, 就能显示。或者也可以给项目换一个新版本的Build
我加载smart3D做出来的b3dm格式模型,发现无法调整模型高度
能说详细一点吗?
也没有办法只加载3D Tiles,不加载地球模型?
地球隐藏,
var viewer = new Cesium.Viewer('cesiumContainer', {
globe:false
});
模型是放到里面去了,可是模型会随着旋转而改变位置,是因为模型放到地底下去了吗?这种情况咋解决呀
请问 这个问题 解决了吗
我也遇到这个问题了 ,请问你是怎么解决的 ,求教
http://cesium.xin/wordpress/archives/cesium-3dtiles-rotate-new.html
模型在地下,调整高度能解决
tileset贴地,new Cesium.Viewer(options) options 传入terrainProvider: Cesium.createWorldTerrain() 即可
看不到是否加载了,相机飞到3dtiles位置怎么弄
无人机拍摄的成果转换成glTF么?
请问加载3D tiles模型时可以设置模型的大小吗?想缩小一点或者放大一点
印象中好像是不可以,只可以调位置和旋转,要不你再搜搜~~
http://cesium.xin/wordpress/archives/cesium-3dtiles-rotate-new.html
使用了changeHeight()方法后,后面添加矢量数据并设置ClassificationType属性为CESIUM_3D_TILE发现模型上没有叠加矢量图层,把changeHeight()方法注释掉就可以,可是模型又飘起来了,请教大神怎么破?
修改xyz没反应,一直报这个错,用iis发布的,不知道MIME映射要设置成什么
什么错
方位角能调整吗
1.48到目前版本暂时不能调,修改旋转矩阵,模型会飞走
搞定了,iis要添加b3dm的mime映射
怎么把模型定位到 地图的某个经纬度上
为啥只有底图 上面的模型加载不出来
没明白你说的什么意思?
3Dtiles的数据是否需要GeoServer来进行数据的管理和发布?还是我们可以使用Cesium直接从服务器硬盘上来读取3D Tiles的数据
可以直接读
导入地图后地图模型与其底层城市图上的位置不对照怎么办呢。
调整模型位置?
为什么用fromArray不行啊,模型会斜着走
不知道你说的什么意思
Cesium.knockout.getObservable(viewModel, ‘height’).subscribe(function(height) {
height = Number(height);
if (isNaN(height)) {
return;
}
var m = tileset.modelMatrix;
var translation=Cesium.Cartesian3.fromArray([0, 0, height]);
Cesium.Matrix4.multiplyByTranslation(m,translation,m);
tileset.modelMatrix = m;
});
就是lesson3里的代码,用fromArray([0, 0, height]);模型会斜着走
Cesium.knockout.getObservable(viewModel, ‘height’).subscribe(function(height) {
height = Number(height);
if (isNaN(height)) {
return;
}
var m = tileset.modelMatrix;
var translation=Cesium.Cartesian3.fromArray([0, 0, height]);
Cesium.Matrix4.multiplyByTranslation(m,translation,m);
tileset.modelMatrix = m;
});
就是lesson3里的代码,用fromArray([0, 0, height]);模型会斜着走
楼主xyz是笛卡尔坐标吗
请问如何获取模型的外包盒
lesson02打开一片空白,只有几个button
发布了没有
弄好了
有个问题,flyToBoundingSphere后面添加的HeadingPitchRange可选项不起作用,这是怎么回事
changeHeight函数有问题,height值设成0都飞到天上去了
官方示例
请教一下,我加载官方示例的模型后,只有地图底图,没有加载的建筑物,这是怎么回事啊
怎么加的
博主,请问怎样在3d tile 层上加个特征点或者画个形状呢
rotate方法未定义,是不需要吗?
请教 这些3D tiles 数据使怎样生成的,另外testm3DTiles.json文件是怎么制作的?
一般是用工具转的,contextcapture cesiumlab 之类的,文档格式都是开源的,你也可以自己写代码生成相关文件
你好,为什么不加key只有底层数据,加了key就一片空白
您好,我想请问一下,我加载的3dtiles模型和我部署的离线高程不同步该怎么办呢?就是我在旋转的时候我的影像地图和高程移动了,但是模型不动。而且挺奇怪,如果不部署离线高程那模型是能随着cesium自带的地图和地形一起移动的。
是不是我缺了哪行将两部分同时移动的代码呢?
没明白你说的。。。地图和高程移动了??
您好,我看到沙盒示例里面添加3dtiles的url都是Cesium.IonResource.fromAssetId(),这个应该是内部数据,而且添加进去的建筑物就是每个高度都不同的。
但是我这边自己用一个shp文件转换成3dtiles添加进去,发现所有的建筑都是一样的高度,但是点击之后返回的height属性中的值是正常的,我想问一下如何把模型按照实际高度拉起啊?
shp转3dtile的过程中要处理单个建筑的高度,转换完成了就不能修改高度了
好的,多谢
首先项目的整体情况是:C#中用WebView2控件去绑定一个html页面,这个html基于Cesium去加载3dtile模型,属于一个混合编程。
然后是测试情况:WebView2控件绑定本地html:绘制立方体可以,3Dtile文件不行;C#通过后台代码打开Edge,并指定访问本地的html页面,绘制立方体可以;3Dtile文件不行;VScode通过Live Server插件:绘制立方体可以,3Dtile文件可以。
最后是分析:分析:一开始以为是WebView2的控件渲染性能不够,导致无法加载3Dtile大规模数据:替换原本的1.78G数据为13.8M还是不可以加载;后来通过调用打开Edge去加载,也不行:否定性能因素; 最后分析地址差异:Live Server:http://127.0.0.1:5500/CesiumOpen3Dtiles_1.html;WebView2或者Edge:C:\Users\14564\vscode\Cesium\CesiumOpen3Dtiles_1.html;猜测可能是更IIS服务器部署来发布网站有关:发布网站后:http://localhost:1030/CesiumViewer.html;也无法加载3Dtile,可以加载立方体;那么可能是跟Live Server的加载方式有关。
求助,这咋办啊?
看加载3dtile抱什么错