Cesium中導入三維模型方法(dae到glft/bgltf)
Cesium中目前支持gltf和bgltf兩種格式。“gltf是khronos組織(起草OpenGL標准的那家)定義的一種交換格式,用於互聯網或移動設備上展現3d內容,充分支持opengl,webgl,opengles圖形加速標准”[1];bgltfg則是二進制格式的gltf擴展,cesium從1.10后開始支持該格式,其能減少模型數據的大小有利於網絡傳輸,並且提高10%-30%的模型加載速度。
目前gltf和bgltf都可以通過dae格式的三維模型轉換而來。其中gltf的轉換工具可以在https://github.com/KhronosGroup/glTF/wiki/Converter-builds獲取----colladaTogltf.exe,其能完成.dae到.gltf三維模型格式的轉換。而dae轉換到bgltf的工具可以在
https://github.com/virtualcitySYSTEMS/colladaToBglTFConverter中獲取-- colladaToBgltfConverter.jar,該工具是首先將dae通過colladaTogltf.exe轉換為gltf格式,然后在把gltf轉換為bgltf,所以要使用該工具同時需要下載colladaTogltf.exe工具。
1 數據預處理
一般的模型格式,比如obj、3ds、fbx都可以先通過3dmax或者其他的建模工具(blender等)先轉換為dae格式后再使用,但是在轉換處理時要注意:
1. Gltf的紋理貼圖的格式不能是tga,可以在3dmax轉換為dae格式時同時轉換紋理格式為png、bmp或者 jpg格式。我在處理時把max數據轉為了obj,在導出為obj時有如下設置,即可完成紋理格式的轉換(我轉為了png)
2. 注意轉換后的格式模型的幾何數據中引用的紋理路徑。盡量不要出現絕對路徑。其實這個問題在格式轉換時幾乎不會產生,比如我這里使用了obj的紋理路徑在./maps文件夾下。在以后的模型拷貝或者移動的同時把紋理文件夾一起拷貝就不會出問題。
2 數據轉換
2.1 daeTogltf
使用colladaTogltf.exe把dae數據轉為gltf格式。通過cmd進入到colladaTogltf.exe所在的文件夾,使用如下命令即可:
collada2gltf.exe–f daePath -e或者collada2gltf.exe–f daePath -o gltfPath
這里的daePath為dae文件的全路徑,比如C:\Test.dae,有博客說不把dae、gltf、exe文件放一個文件夾下會報錯,但是可能現在的版本已經解決好了這個bug,所以你也可以把三者放同一個文件下,那樣的話這里的daePath就只要提供dae文件的名字即可,比如test.dae,gltf。同樣只要一個文件名即可。
另外這里使用-e命令選項的意思是把轉換后的gltf只輸出為一個文件,其把幾何和紋理數據一起打包在一起;-o命令則一般輸出3個格式.bin、.gltf、.glsl。(Cesium在1.16后提供了紋理和幾何異步加載的機制,這樣就建議不要用-e了)
轉換成功時的命令行會輸出轉換過程中轉換的一些信息,包含了幾何和動畫信息,並且轉換后的gltf會在exe或者指定的文件夾下。如下圖。
2.2 daeTobgltf
對於轉換為bgltf也是同樣的道理。把collada2gltf.exe和colladaToBgltfConverter.jar放到同一個文件夾下,cmd進到該文件夾,通過如下命令格式可以進行轉換。
java -jar colladaToBglTFConverter.jar -ccollada2gltf.exe -i inputPath -o outputPath
這里inputPath只需指明dae格式所在文件夾,outputPath則是輸出格式的文件夾。轉換后的輸出為:
轉換后的數據在指定輸出文件夾下。
3 模型數據加載
對於數據的加載使用,首先把轉換后的數據(如果不是-e命令生成的單獨數據,請把所有轉換出來的文件和紋理文件一起)放到應用需要的布置文件夾,本文中將文件放在了Apps\ModelData文件夾下了。使用的加載代碼為:
var viewer = new Cesium.Viewer('cesiumContainer'); var scene=viewer.scene; var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame( Cesium.Cartesian3.fromDegrees(-75.62898254394531, 40.02804946899414, 6.0)); var model = scene.primitives.add(Cesium.Model.fromGltf({ url : 'ModelData/test.gltf',//如果為bgltf則為.bgltf modelMatrix : modelMatrix, scale : 3.0 })); viewer.camera.flyTo({ destination : Cesium.Cartesian3.fromDegrees(-75.62898254394531, 40.02804946899414, 6.0) });
4 測試效果
測試用Obj數據:
Cesium中加載的效果如下:
注意:本人在測試過程中遇到一個問題,使用的3dmax導出的dae在轉換時始終不能轉換成功,顯示轉換的幾何數量是0,創建的gltf文件沒有數據。問題原因是這里需要區分兩個數據格式:Autodesk Collada和OpenCOLLADA這兩個格式,他們的后綴名都是.dae,一個是Autodesk的數據格式,一個是開放標准的格式,這里我們需要的就是開放標准的格式,遺憾的是Max自帶的是自家公司的dae格式。
針對這樣的問題,1、我直接把max數據轉為了obj,再通過其他軟件(如blender、SketchUp、meshlab等)轉為的dae,這樣就能正常使用了;2、或者在Max中裝一個open collada導出插件,鏈接地址https://github.com/KhronosGroup/OpenCOLLADA/wiki/OpenCOLLADA-Tools,導出時注意不要有中文路徑,不然紋理導出會出問題。這個提示以回答群里(Cesium交流群:115883691)朋友的疑問。有疑問歡迎加Q詳聊:491453302 或者關注我的微博:Web3DGIS 了解個人及團隊等相關研究進展。
版本問題:
因為gltf本來是一個草案,並沒有形成一個公認的標准,其是一個不斷完善的格式描述。從Cesium1.15開始,Cesium開始支持KHR_binary_glTF格式(由CESIUM_binary_glTF格式衍生而來的官方版),並推薦使用glTf1.0版本。到Cesium1.18時CESIUM_binary_glTF格式將會被廢棄,而轉換工具也不會再支持glTF0.8格式的轉換。
參考資料:
[1] http://my.oschina.net/u/1585572/blog/290604
[2] https://github.com/KhronosGroup/glTF/wiki/Converter-builds
[3] https://github.com/virtualcitySYSTEMS/colladaToBglTFConverter