Cesium入門10 - 3D Tiles

Cesium入門10 - 3D Tiles

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/

相關文章
相關標籤/搜索