Cesium模型處理方法

????????目前有傾斜攝影測量數據和美工制作的3dsMax模型數據,需要對這兩種數據進行處理,以便于在cesium上進行展示,模型處理方法如下:

1.傾斜攝影測量模型生產

????????傾斜攝影測量數據是通過無人機搭載的五鏡頭相機拍攝的某區(qū)域的照片,照片數據共有800張,每張照片均有經緯度坐標,通過ContextCapture軟件進行空三計算后,即可進行三維重建,ContextCapture軟件的使用較簡單,其中需要注意的就是生產的三維模型數據格式選擇cesium b3dm,數據坐標系選擇WGS84,模型生產完成后,通過如下代碼即可加載到cesium上

//加載3d tileset
var tileset = new Cesium.Cesium3DTileset({
  url: "/data/Production_1_4326/Scene/Production_1_4326.json"
});
// earthView.terrainProvider = Cesium.createWorldTerrain();

//傾斜模型與CESIUM DEM高程誤差,需手動調整
var height = -1080;
// var height = -25;

let thisView = earthView;
tileset.readyPromise
  .then(tileset => {
    this.droneModalPrimitive = thisView.scene.primitives.add(tileset);
    thisView.zoomTo(
      tileset,
      new Cesium.HeadingPitchRange(
        0.0,
        -0.5,
        tileset.boundingSphere.radius * 2.0
      )
    );

    //貼地顯示
    var cartographic = Cesium.Cartographic.fromCartesian(
      tileset.boundingSphere.center
    );
    var surface = Cesium.Cartesian3.fromRadians(
      cartographic.longitude,
      cartographic.latitude,
      0.0
    );
    var offset = Cesium.Cartesian3.fromRadians(
      cartographic.longitude,
      cartographic.latitude,
      height
    );
    var translation = Cesium.Cartesian3.subtract(
      offset,
      surface,
      new Cesium.Cartesian3()
    );
    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
  })
  .otherwise(function(error) {
    console.log(error);
  });

2. 3dsMax模型導入

2.1插件安裝

????????首先對美工使用的3dsMax軟件添加一個DAE數據導出插件,插件下載地址見https://github.com/KhronosGroup/OpenCOLLADA/releases,下載指定版本的插件,然后解壓dle文件到3dsMax的plugins目錄,重啟3dsMax,即可完成插件的安裝。

2.2模型導出

????????將模型導出為DAE格式,通過安裝的插件,能夠保證模型材質不丟失

2.3模型切片

????????下載cesiumlab,cesiumlab是一款免費的cesium數據處理工具,使用手機號注冊后即可使用,打開軟件登陸后進入數據處理——人工模型切片工具

微信截圖_20191211092554.png

2.3.1輸入模型地理坐標

????????美工制作好的模型是不具有地理坐標的,點擊人工模型切片工具的右側的添加按鈕,將DAE模型添加到工具中,然后點擊位置按鈕,輸入模型的經緯度坐標數據


微信截圖_20191211092832.png

確定了模型的地理坐標后,即可點擊確定進行模型切片,cesiumlab會將DAE模型文件轉換為b3dm切片數據

2.3模型加載

切片完成后的模型已經轉換成為3dTiles數據格式,加載代碼如下

var tileset = earthView.scene.primitives.add(
  new Cesium.Cesium3DTileset({
    url: modelUrl,
    modelMatrix: Cesium.Matrix4.fromArray([
      1,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      0,
      1
    ])
  })
);
earthView.flyTo(tileset);
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容