CesiumJs和SuperMap Desktop結合的三維顯示的優化

        前段時間要做一個三維相關的項目,側重三維場景的展示以及數據查詢,對三維場景中的空間分析並沒有涉及,而且甲方不想花幾十萬買套三維平臺進行二次開發,只能藉助開源的。所有針對需求,篩選了現有的三維引擎或三維平臺,OSG太過底層,babylonjs、threejs適用於數據量小的小場景,webglearth簡單實用,但是demo較少、更新慢,openwebglobe加載不流暢、效果不怎麼好,cesiumjs是以js編寫的webGL三維地圖渲染引擎,有較多的demo,詳細的api文檔,有測試平臺,比較豐富的展示特性和擴展,所以最後就選定cesiumjs了。

          按照網上的環境搭建流程,將cesiumjs的運行環境搭建了起來,通過Sketchup建立了三維模型,並搭建了三維場景。然後就是將三維模型加載到Cesium中, 目前Cesium只支持gltf和bgltf格式,可以通過dae格式轉換過去。將三維模型全加進去後,問題出現了,缺少三維場景顯示的優化算法,三維場景轉不起來。通過查找資料,發現cesiumjs支持3D Tiles數據集,3DTiles數據集以分塊、分級渲染,將大數據量三維數據以分塊,分層的形式組織起來,可以大量減輕瀏覽器和GPU的負擔,將瓦片的位置信息寫到了數據中的.b3dm和對應的json文件中,json文件是3dtiles數據集的元數據, boundingVolume節點是用來表示三維模型的範圍,它是以wgs84直角座標的方式存儲的,它不明文存儲數據的地理位置,但是可以從wgs84直角座標中反解出經緯度座標。refine節點有兩個屬性,add/replace屬性,其意義是在加載這個節點數據時,時在上級數據的基礎上add還是replace。

       怎麼將模型數據轉換成3Dtiles呢?目前 缺少免費好用的生成工具,並沒有形成一個成熟的解決方案,第三方推出的CesiumLab工具提供了生成3Dtiles的功能,但是要用完整功能是需要收費的。那到底有沒有免費、好用的轉換工具呢?

        SuperMap iClient 3D for WebGL 是基於CesiumJS擴展的一套三維引擎API,重要的是 它推出了三維切片緩存(S3M)圖層,支持根節點過濾、裁剪,提高加載性能。還有它加入了剖面分析、視域分析、淹沒分析、通視分析等功能。

       SuperMap iClient 3D for WebGL Api庫是免費的,但是需要SuperMap DeskTop、Iserver的支持,SuperMap DeskTop用於數據轉換、緩存文件生成,Iserver用於發佈三維服務。SuperMap DeskTop因爲只是處理數據,可以申請試用版或下載那啥版(你懂的);因爲不做基於服務端的空間分析,只是用來顯示三維場景,Iserver可以用webserver代替(我是用的Apache)發佈S3M服務。步驟如下:

  1. 建立三維模型,搭建三維場景,將模型轉換爲dae、3ds、obj、fbx常用格式。
  2. 打開SuperMap DeskTop,建立數據源,導入三維模型的數據集。
  3. 在加入的數據集上右鍵點擊,生成場景緩存,設置生成Lod的層級和瓦片大小,成功後會生成Osgb格式的緩存。
  4. 在傾斜攝影模塊中,將OSGB緩存文件轉成s3m格式的文件。s3m文件由scp和s3m實體文件夾組成,scp定義了數據的範圍、緩存格式、緩存實體文件的路徑等。s3m則是分層、分塊的三維緩存文件。

   怎麼將s3m文件加到Cesium中呢?需要去官網下載SuperMap iClient 3D for WebGL Api。通過scene 的“addS3MTilesLayerBySc”方法加載s3m服務,示例如下:

  var promise = scene.addS3MTilesLayerByScp("/Data/model/changjing/changjing.scp", {

                name: changjing

            }); 

    最後將自己的三維場景服務通過上面的方法加載進系統,因爲全部場景不適合公開,截取了部分場景如下(三維場景還在修改)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章