Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/javascript
咱们团队有时把Cesium描述成一个真实世界数据的3D游戏引擎。然而,使用真实世界的数据比使用典型的视频游戏数据资料要困可贵多,由于真实数据多是难以置信的高分辨率,而且须要精确的可视化。幸运的是,Cesium 与开源社区合做开发了3D Tiles,这是一个开放的规范,用于传输海量的异构三维地理空间数据集。html
使用概念上相似于Cesium的terrain和imagery的流技术,3D Tiles 使得能够查看本来不能交互式查看的巨大的模型,包括建筑物数据集、CAD(或BIM)模型、点云和摄影测量模型。java
下面是一些展现不一样格式的3D Tiles演示:git
在咱们的应用中,咱们将使用Cesium3DTileset经过展现纽约全部建筑物的全3D模型来为咱们的可视化添加现实主义!这种纽约 tilese托管在Cesium Ion中,咱们可使用IonResource.fromAssetId添加它:github
// Load the NYC buildings tileset var city = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url: Cesium.IonResource.fromAssetId(3839) }));
你可能注意到建筑物没有正确地定位在地平面上。幸运的是,它很容易修复。咱们能够经过修改模型矩阵modelMatrix来调整tileset的位置。ide
咱们能够经过将tileset的边界球转换成地图Cartographic,而后添加指望的偏移量并重置模型矩阵,从地面找到模型modelMatrix的当前偏移量。函数
// Adjust the tileset height so its not floating above terrain var heightOffset = -32; city.readyPromise.then(function(tileset) { // Position tileset var boundingSphere = tileset.boundingSphere; var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center); var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0); var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset); var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3()); tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); });
如今在咱们的场景中有110万个建筑模型流。工具
3D Tiles 还容许咱们使用3D Tiles styling语言 来调整咱们的样式。3D Tiles 样式定义了用于评估颜色(RGB和透明度)的表达式,并显示了Cesium3DTileFeature特征的属性,这是tileset的一部分,例如城市中的单个建筑物。样式一般基于存储在瓦片的批处理表中的特征属性。特征属性能够是高度、名称、坐标、构造日期等任何东西,但被构建到tileset asset 中。样式是用JSON定义的,而表达式是在JavaScript的小子集中编写的,用于样式化。此外,样式语言提供了一组内置函数来支持常见的数学运算。ui
一个Cesium3DTilesetStyle的例子以下:url
var defaultStyle = new Cesium.Cesium3DTileStyle({ color : "color('white')", show : true });
上述代码使咱们NYC的tileset是白色而且老是可见的。为了实际设置tileset的样式,咱们设置city.style:
city.style = defaultStyle;
咱们还能够定义许多咱们喜欢的样式。好比,让建筑变透明:
var transparentStyle = new Cesium.Cesium3DTileStyle({ color : "color('white', 0.3)", show : true });
在咱们的tileset中使用相同的样式来达到每个特征只是皮毛工做。咱们还可使用特定于每一个特征的属性来肯定造型。下面是一个基于建筑物高度的建筑物颜色的例子:
var heightStyle = new Cesium.Cesium3DTileStyle({ color : { conditions : [ ["${height} >= 300", "rgba(45, 0, 75, 0.5)"], ["${height} >= 200", "rgb(102, 71, 151)"], ["${height} >= 100", "rgb(170, 162, 204)"], ["${height} >= 50", "rgb(224, 226, 238)"], ["${height} >= 25", "rgb(252, 230, 200)"], ["${height} >= 10", "rgb(248, 176, 87)"], ["${height} >= 5", "rgb(198, 106, 11)"], ["true", "rgb(127, 59, 8)"] ] } });
为了在样式间交换,咱们能够添加更多的代码来侦听HTML输入:
var tileStyle = document.getElementById('tileStyle'); function set3DTileStyle() { var selectedStyle = tileStyle.options[tileStyle.selectedIndex].value; if (selectedStyle === 'none') { city.style = defaultStyle; } else if (selectedStyle === 'height') { city.style = heightStyle; } else if (selectedStyle === 'transparent') { city.style = transparentStyle; } } tileStyle.addEventListener('change', set3DTileStyle);
更多关于3D Tiles的例子、如何使用及调整样式,请查看the 3D Tiles sandcastle demos。
3D Tiles例子:
若是你有数据,须要帮助将其转换为3D瓦片,请继续关注关于Cesium Ion平台的更新!在这里订阅更新。
Cesium中文网交流QQ群:807482793
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/