3Dのデータは非常にファイルサイズが大きくなります。
基本的にはポリゴン数(頂点数)が増えれば増えるほど大きくなっていきます。
しかし、特にWebで用いる場合、ファイルサイズが大きいとダウンロードに時間がかかり実用的ではありません。
そこで今回はGoogleが開発しているdracoという3Dデータの圧縮プログラムを用いてファイルサイズを縮小します。
dracoを用いることでファイルサイズを非常に小さくすることができます。
実際にdracoをでOBJファイルを圧縮します。
※後で知ったことなのですが、この方法ではGLTFは圧縮できないようです。
GLTFの圧縮方法については後日記事を書きます。
追記
書きました。
https://codelabo.com/posts/20200830135244
Dracoのダウンロード
https://github.com/google/draco
「↓Code」 -> 「Download Zip」からZipファイルをダウンロードして解凍します。
または、Gitを使ってクローンします。
git clone git@github.com:google/draco.git
CMakeのインストール
Windows用のインストーラをダウンロードします(画像で青くしています。バージョンは変わってるかもしれないので読み替えてください)。
ダウンロードしたインストーラをダブルクリックで実行していきます。
基本的にはNextを押し続けるだけでいいはずですが、Pathの設定をするかどうか聞かれたら、画像の様にPathを通すように設定します。
後はNextを押していればFinishします。
Visual Studioのインストール
やっていなければ以下を参考にインストールしてください。
https://codelabo.com/posts/20200224180513
dracoのソースコードをビルドする
Windowsの下にある虫眼鏡マークの検索ボタンをクリックして、「native」と入力します。
すると「VS2017用 x64 NativeToolsコマンドプロンプト」と表示されるので、それを起動します。バージョンは2015でも何でもいいです。
下記のコマンドを実行します。
dracoをダウンロードしたフォルダにcdコマンドで移動します。
buildフォルダを作成し、その中に入ります。
cmakeコマンドを実行するとdraco.sln(VisualStudioのソリューションプロジェクトファイル)が生成されます。
cd ../../../../../../../
cd draco-master
draco-master>mkdir build
cd build
cmake -G "Visual Studio 2017 Win64" -DCMAKE_C_COMPILER="C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe" -DCMAKE_CXX_COMPILER="C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe" ..
こんな感じでファイルが生成されます。
その中からdraco.slnを探して、ダブルクリックしてVisual Studioで開きます。
ソリューション構成をDebugのままでもいいですし、Releaseに変更してもいいです。
僕はReleaseに変更してます。
ビルドに時間はかかりますが、Releaseにするとdraco圧縮を高速に行えます。
「ビルド」->「ソリューションのビルド」でビルドします。
buildフォルダの中にReleaseフォルダが生成され、さらにその中にdraco_encoder.exe実行ファイルが生成されます(ソリューション構成をDebugのままにしていたらReleaseフォルダでなくDebugフォルダです)。
draco_encoder.exeをコマンドプロンプトから実行してdraco圧縮を行います。
実際にdraco圧縮してみる。
Releaseフォルダに入って、実行ファイルをコマンドプロンプトからたたきます。
cd Release
draco_encoder -i インプットファイルパス -o アウトプットファイルパス
今回はdracoのソースコードについてきたサンプルを圧縮してみます。
CG分野にいたらみんな見たことあるバニーです。
draco_encoder -i ../../testdata/bunny_norm.obj -o bunny.drc
するとこんな出力が出て、圧縮したファイルが作成されます。
Encoder options:
Compression level = 7
Positions: Quantization = 11 bits
Normals: Quantization = 7 bits
Encoded mesh saved to bunny.drc (155 ms to encode).
Encoded size = 65566 bytes
For better compression, increase the compression level up to '-cl 10' .
元のbunny_norm.objは4.7MB、圧縮後は64KBなのでかなり小さくなってます。
-clオプションで圧縮レベルを変更できます。
最大値の10で試してみると60KBになりました。
draco_encoder -i ../../testdata/bunny_norm.obj -o bunny.drc -cl 10
あまり圧縮レベルを上げるとデコードに時間がかかるかもしれないので、上げすぎない方がいいかもしれません。
また、以下のようなエラーが出るかもしれません。
Failed loading the input mesh: Error decoding input..
このエラーは変換前のデータがdracoの対応してないケースで起きるようです。
問題が4角形ポリゴンが含まれていることだとすれば、MeshLabで3角形ポリゴンに変換すれば解決します。
しかし、僕の場合はそうではありませんでした。
僕はGLTF(GLB)ファイルを圧縮しようと思っていたのですが、どうやらGLTFファイルは入力ファイルとして使えないみたいです。
日曜の深夜に痛恨のミス。。。
ってことで、GLTFをdraco圧縮する記事に続きます。