使用 supermap 可以實現網頁對三維場景數據的渲染,但是我們拿到數據時,一般不能直接應用,需要對數據進行數據源處理、三維模型數據轉二維面數據、BIM 簡化、移除重復點、生成場景緩存等操作,對數據進行優化或轉化以便於后續的渲染。
一些相關視頻資料
SuperMap iClient3D for WebGL開發准備:http://support.supermap.com.cn/product/VedioPlay.aspx?id=189
三維性能優化方法與策略:http://support.supermap.com.cn/product/VedioPlay.aspx?id=289
注:以下操作均基於SuperMap iDesktop 9D(.NET)版,不同版本菜單及界面稍有不同。
一、數據源處理
1、點擊菜單欄 【開始】→【打開】→【數據源】→選擇數據源文件(UDB格式)
2、數據集類型轉換:CAD 數據集轉換為簡單數據集或模型數據集,轉換為這2種格式后面才能正常生成場景緩存。如果數據集本身已經是簡單數據集或模型數據集,可跳過這一步。
左鍵選中需要轉換的數據集→點擊菜單欄【數據】→【類型轉換】→選擇【CAD->簡單】或【CAD->模型】

如果選擇轉換為簡單數據源,將彈出以下界面,選擇需要轉換的源數據(包括數據源及數據集),點擊轉換即可。

如果選擇轉換為模型數據集,將彈出以下界面,直接點擊轉換即可(如果這個界面沒有顯示數據,需點擊添加源數據按鈕手動添加數據,因為supermap會默認轉換當前選中的數據集,如果點擊類型轉換前沒有選中數據集將會出現界面無數據的情況)。

轉換成功后的數據集(這個步驟耗時會比較長,需要耐心等,這里我選擇轉換成模型數據集)

二、數據優化(含 BIM 簡化、移除重復點等)
當需要加載的數據非常大時,即使配置的獨顯再好,也難免出現卡頓掉幀現象。為了提高渲染速度,優化渲染幀率,可進行BIM簡化、移除重復點等操作。
1、添加數據集到球面場景中
點擊工作空間管理器中的【場景】→【新建球面場景】→將上一步轉換成功的簡單或模型數據集拖入新建的球面場景中

2、BIM簡化
菜單欄點擊【對象操作】→【BIM模型】→點擊【BIM簡化】

在彈出來的BIM簡化菜單中,可以選擇是對選中對象還是所有對象進行BIM簡化操作,同時根據需求設定簡化率,簡化率越高,簡化后的模型越粗糙,加載速度越快(模型是由許多三角面組成的,三角面數越多,模型越精細,BIM簡化其實是過濾三角面數的一個過程,所以簡化后的模型會比原始模型粗糙,對模型精細度有高要求的建議不要進行這步操作)。

拖動簡化信息下的簡化率后會自動開始BIM簡化,完成后點擊保存。可以查看場景中簡化前及簡化后的幀率信息,可以明顯看到平均幀率提升了,三角面數量也減少了。


幀率信息在場景的左下方可以看到,一般默認都是未開啟的,開啟步驟:場景中右鍵→點擊【屬性】→彈出的場景屬性面板中勾選【幀率信息】

3、移除重復點
重新新建一個球面場景,將上面進行了BIM簡化的數據集拖到新建的球面場景中。
點擊菜單欄【BIM模型】→【移除重復點】

在彈出的移除重復點界面中,可選擇移除的范圍(所有對象或選中對象)和進行參數設置,設置完畢后點擊另存即可。進行移除重復點主要是移除一些重復的模型數據,例如場景中有許多相同的車子模型,他們除了空間位置信息外,其它的模型數據都相同,那么實際上只需要保存一份模型數據,然后在不同位置多次繪制即可。

輸出窗口信息,成功移除重復點134個。

三、三維模型數據轉二維面數據
如果項目中有查看二維平面圖或實現二三維地圖聯動效果的需求,就需要把三維模型數據集轉換為二維面數據,進而轉換為二維平面地圖。如果項目不涉及到二維數據可跳過這一步。
1、生成二維面數據
左鍵選中要轉換的三維模型數據集→點擊菜單欄【數據】→【類型轉換】→【模型->二維面】

在彈出的模型數據->二維面數據菜單中,選擇要轉換的模型數據集,點擊轉換即可,轉換需要比較長的時間,具體視電腦配置及數據集數據大小而定。

生成二維面數據集后,雙擊數據集打開如下

2、編輯二維面數據
默認生成的二維數據集是不允許編輯的,如果要對數據集進行刪除、移動等操作,點擊菜單欄【地圖】→【圖層屬性】

在彈出的圖層屬性界面中,勾選【編輯】,就可以在主窗口中對二維面數據進行刪除、移動等操作了。

3、保存為地圖
二維數據需以地圖形式進行數據發布,直接在主窗口中右鍵→點擊【保存地圖】即可

四、生成場景緩存
當所有的數據處理完畢后,需要對處理好的數據進行生成場景緩存操作,如果不生成場景緩存,對於如此大的數據量,瀏覽器直接加載很容易導致卡頓甚至奔潰,加載速度也不理想。
選中最終處理后的數據集→右鍵→生成場景緩存

在彈出的生成場景緩存界面中,緩存類型選擇OSGB,文件類型選擇S3M,瓦片邊長、LOD層數、LOD層級對應的網格簡化率可以使用默認值,如果項目需要也可以根據需求更改,設置完畢后點擊生成。

參數簡單介紹
1、瓦片邊長:生成場景緩存時要對整個三維場景進行瓦片切分,當瓦片所在的位置出現在視圖內時才對其進行加載,使用這種方法可以加快初始渲染,減少等待時間。瓦片邊長越大,所加載瓦片的數據量越大,但相應也會減少總的網絡請求數,所以瓦片邊長這個參數如果沒有特殊情況最好選擇默認值(supermap會計算出兼容加載速度和網絡請求數量的瓦片邊長做為默認值)
2、LOD層數:LOD(Level-of-Detail)是一種渲染加速技術,當我們將三維場景縮小看時,只會關注到三維模型的輪廓,而對其模型細節的顯示要求不高,當我們放大場景時,才會關注到模型的細節,對模型的精細度有較高要求。基於這種實際需求,supermap提供了LOD層級設置,默認分為5層,其中0層是精細層,LOD層級越大,對模型的精細度要求越低。
3、網格簡化率:網格簡化率是對模型細節按照百分比進行簡化,簡化率越大,模型越粗糙。如果沒有特殊需求,建議按照supermap提供的默認參數設置,需要自己設置的話,建議0層簡化率應低於50%,保證在最精細層模型能達到較好的顯示效果。
生成的場景緩存數據會默認保存到當前工作空間所在的目錄

至此,supermap iDesktop 處理數據和生成場景緩存的所有步驟就結束了,接下來只需要把這些數據發布到服務器即可。生成的數據如何發布詳見寫的另一篇文章:supermap iServer 發布地圖及數據服務
五、前端加載場景緩存
<div id="map3d" style="display: none;"></div> <script type="text/javascript"> function onload(Cesium) { var viewer = new Cesium.Viewer('map3d'); // 生成的 Cesium 實例放在 id 為 map3d 的 div 中 var scene = viewer.scene; try { var promise = scene.open('xxx'); // xxx 為 iserver 中場景緩存的地址(目錄到 realspace 這一級) Cesium.when(promise, function(sceneResult) { scene.camera.setView({ // 設置場景加載完后相機定位的經緯度 destination: Cesium.Cartesian3.fromDegrees( '填寫經度', '填寫緯度', '填寫高度' ), }); } catch (e) { console.log(e); } } </script>
作者:銀月silvermoon
鏈接:https://www.jianshu.com/p/6d2d2bce5ef9
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。