cesium3Dtitle 调整位置

添加 3D Tiles,并调整位置

3D Tiles 是什么

3DTiles数据集是cesium小组AnalyticlGraphics与2016年3月定义的一种数据集,3DTiles数据集以分块、分级渲染,将大数据量三维数据以分块,分层的形式组织起来,可以大量减轻浏览器和GPU的负担是一个优秀的,并且格式公开的数据格式。

3D Tiles将用于流式传输3D内容,包括建筑物,树木,点云和矢量数据。

参考 官网 3dtiles 介绍

3D Tiles

3D Tiles将用于流式传输3D内容,包括建筑物,树木,点云和矢量数据。

contextCapture 可以将无人机成果转换成Cesium支持的倾斜摄影成果,当前例子就是使用的这种成果。

数据的加载比较简单

var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
    url: url,  //数据路径  
    maximumScreenSpaceError: 2,        //最大的屏幕空间误差
    maximumNumberOfLoadedTiles: 1000,  //最大加载瓦片个数
    modelMatrix: m //形状矩阵
}));

但是问题在于生成的数据不一定是落在地面上,有可能是浮在空中的,例如:

3dtiles-in-sky

这并不是我们想要的,我们希望拍摄的成果能贴到地面上,和地图能很好的融合在一起,类似这样

3dtiles-on-ground
由于单个瓦片的位置信息是写到了数据中的(.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. 计算偏移量

官方示例 3D Tiles Adjust Height

一步到位

//方法二,直接调用函数,调整高度,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

旋转参考

Cesium.knockout.getObservable(viewModel, 'rotatex').subscribe(function(rotatex) {
    var mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(rotatex));
    tileset.modelMatrix = Cesium.Matrix4.fromRotationTranslation(mx);
});
Cesium中的3D Tiles是一种用于高效地存储、传输和渲染大规模3D模型数据的格式。在3D Tiles中,地球表面的三维模型被分割成一系列小块,每个小块都是一个独立的3D Tile,并且可以根据需要进行加载和卸载。Cesium提供了一系列API,用于在Web上动态加载、渲染和交互3D Tiles数据。 在Cesium中使用3D Tiles进行压平的过程与普通的3D Tiles加载过程类似。首先,需要使用Cesium的`Cesium3DTileset`对象加载3D Tiles数据。然后,可以通过设置`Cesium3DTileset`对象的`maximumScreenSpaceError`属性和`maximumMemoryUsage`属性来控制3D Tiles数据的加载和卸载。最后,可以将`Cesium3DTileset`对象添加到Cesium的场景中进行渲染。 下面是一个简单的示例代码,用于加载和渲染3D Tiles数据,并将其压平在Web墨卡托投影上: ```javascript var viewer = new Cesium.Viewer('cesiumContainer'); // 加载3D Tiles数据 var tileset = new Cesium.Cesium3DTileset({ url : './data/3dtiles/tileset.json' }); viewer.scene.primitives.add(tileset); // 设置Web墨卡托投影 viewer.scene.globe.projection = new Cesium.WebMercatorProjection(); // 控制3D Tiles数据的加载和卸载 tileset.maximumScreenSpaceError = 16; tileset.maximumMemoryUsage = 512; // 监听场景渲染事件,用于更新3D Tiles数据的位置 viewer.scene.postRender.addEventListener(function() { var ellipsoid = viewer.scene.globe.ellipsoid; var center = ellipsoid.cartesianToCartographic(tileset.boundingSphere.center); center.height = 0.0; tileset.cartographicCenter = ellipsoid.cartographicToCartesian(center); }); ``` 在这个示例代码中,我们首先创建了一个`Cesium.Viewer`对象来初始化Cesium的环境,并使用`Cesium.Cesium3DTileset`对象加载了3D Tiles数据。然后,我们将场景的投影方式设置为Web墨卡托投影,并设置了3D Tiles数据的最大屏幕空间误差和最大内存使用量。最后,我们监听场景渲染事件,并在每次场景渲染时更新3D Tiles数据的位置,以保证它们始终在地球表面上。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值