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

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

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

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

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

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

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

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


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

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

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

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

三、三維模型數(shù)據(jù)轉(zhuǎn)二維面數(shù)據(jù)
如果項目中有查看二維平面圖或?qū)崿F(xiàn)二三維地圖聯(lián)動效果的需求,就需要把三維模型數(shù)據(jù)集轉(zhuǎn)換為二維面數(shù)據(jù),進而轉(zhuǎn)換為二維平面地圖。如果項目不涉及到二維數(shù)據(jù)可跳過這一步。
1、生成二維面數(shù)據(jù)
左鍵選中要轉(zhuǎn)換的三維模型數(shù)據(jù)集→點擊菜單欄【數(shù)據(jù)】→【類型轉(zhuǎn)換】→【模型->二維面】

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

生成二維面數(shù)據(jù)集后,雙擊數(shù)據(jù)集打開如下

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

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

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

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

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

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

至此,supermap iDesktop 處理數(shù)據(jù)和生成場景緩存的所有步驟就結(jié)束了,接下來只需要把這些數(shù)據(jù)發(fā)布到服務(wù)器即可。生成的數(shù)據(jù)如何發(fā)布詳見寫的另一篇文章:supermap iServer 發(fā)布地圖及數(shù)據(jù)服務(wù)
五、前端加載場景緩存
<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({
? ? ? ? ? ? ? // 設(shè)置場景加載完后相機定位的經(jīng)緯度
? ? ? ? ? ? ? destination: Cesium.Cartesian3.fromDegrees(
? ? ? ? ? ? ? ? '填寫經(jīng)度',? ? ?
? ? ? ? ? ? ? ? '填寫緯度',
? ? ? ? ? ? ? ? '填寫高度'
? ? ? ? ? ? ? ),
? ? ? ? ? ? });
? ? } catch (e) {
? ? ? ? console.log(e);
? ? }
}
</script>