赞
踩
前面我们学习到了绘制基本的形状,但是Cesium还可以加载3D模型,因为像高德地图这种的技术来加载大型复杂的建筑模型性能不加,所有只能想Cesium这种专门做3D地图的技术。接下来就学习一下如何加载模型。
Cesium目前支持两种模型方案,一个是使用3D tiles, 另一个是加载glTF模型,3D tiles是适用于展示大区域面积的建筑模型,而glTF模型是加载单个独立模型。
3DTiles数据集是cesium小组AnalyticlGraphics与2016年3月定义的一种数据集, 3DTiles数据集以分块、分级渲染,将大数据量三维数据以分块,分层的形式组织起来,可以大量减轻浏览器和GPU的负担是一个优秀的,并且格式公开的数据格式。3D Tiles将用于流式传输3D内容,包括建筑物,树木,点云和矢量数据。
这里可以使用官网库中的模型,也是找一个tileset.json的网络地址模型或者本地地址模型。
let viewer = new Cesium.Viewer('cesiumContainer') let tileset; //设置一个变量来存放通过3DTiles创建的模型 try { tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url: 'https://invest.zjw.ningbo.gov.cn/BIM/yzddgj/5/tileset.json' } viewer.scene.globe.depthTestAgainstTerrain = true; tileset.readyPromise.then(function (tileset) { let boundingSphere = tileset.boundingSphere; // 模型的范围 let cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center); // 从笛卡尔位置创建一个新的位置实例(返回的是一个经纬度的) let surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0); // 以经纬度的值来返回Cartesian3(xyz)的位置 ,/ let offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 50); // 以经纬度的值来返回Cartesian3(xyz)的位置 ,//> let translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3()); // 计算两个笛卡尔的分量差异。 tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); viewer.zoomTo(tileset); }); } catch (error) { console.log(`Error loading tileset: ${error}`); }
GLTF代表Graphics Language Transmission Format(图形语言传输格式)。这种跨平台格式已成为Web上的3D对象标准。它由OpenGL和Vulkan背后的3D图形标准组织Khronos所定义,这使得GLTF基本上成为3D模型的JPG格式:Web导出的通用标准。
在下载的Cesium文件里面,可以找到一个models文件,里面都是模型
gltf模型有两种实现代码实现,一是使用前面的entity方式来加载,还有一个是通过CZML方式来加载模型。
一、entity方式
var entity = viewer.entities.add({
id: 'myEntity',
position: position, //模型的位置
orientation: orientation_air,
model: {
uri: require('../../public/models/CesiumAir/Cesium_Air.glb'),
minimumPixelSize: 500,
maximumScale: 10000,
show: true,
},
});
// 让摄像机视口快速定位到模型位置
viewer.trackedEntity = entity;
二、CZML方式
name: '3DModel', version: '1.0', }, { id: 'airplane_model', name: 'airplane', position: { cartographicDegrees: [-77, 37, 10000], }, model: { gltf: require('../../public/models/CesiumAir/Cesium_Air.glb'), scale: 2.0, minimumPixelSize: 128, }, }, ]; //> 添加模型 const dataSourcePromise = viewer.dataSources.add(Cesium.CzmlDataSource.load(czml)); dataSourcePromise .then(function (dataSource) { viewer.trackedEntity = dataSource.entities.getById('airplane_model'); }) .catch(function (error) { console.log(error); });
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。