今回も相変わらずニッチでマニアックなネタなので、iPhoneでObjective-Cでうんぬんかんぬん的な人は軽ぅくスルーして頂いて結構です…
拙作『こなへん』では宇宙空間に浮かぶ地球のデータは、プログラムで生成するようにしていました。球体をプログラムで生成するのはそんなに難しくないです。
じゃあ次はアヒル隊長やはちゅねミクさんを表示しようとしてみて困りました。さすがにアヒルを計算で生成するのはちょっと自分のスキルでは難易度高い…。
じゃあ、モデリングツールを探して、それを使ってみようかしらんと考える訳ですが…
- データ形式はどれがいいの?
- アプリでモデルデータを読み込んで表示するのにどうしたらいいの?
という事で困る訳です。モデルデータの仕様にはいくつかあって、どれも仕様を読み解くのに時間が掛かりそう…。
そしたら…なんと!この問いに答えてくれるライブラリを見つけました。
何と、以下のフォーマットのモデルデータを読み込んで、共通の内部形式にしてくれるという素晴らしいライブラリです。
Collada ( *.dae;*.xml )
Blender ( *.blend )
Biovision BVH ( *.bvh )
3D Studio Max 3DS ( *.3ds )
3D Studio Max ASE ( *.ase )
Wavefront Object ( *.obj )
Stanford Polygon Library ( *.ply )
AutoCAD DXF ( *.dxf )
IFC-STEP, Industry Foundation Classes ( *.ifc )
Neutral File Format ( *.nff )
Sense8 WorldToolkit ( *.nff )
Valve Model ( *.smd,*.vta )
Quake I ( *.mdl )
Quake II ( *.md2 )
Quake III ( *.md3 )
Quake 3 BSP ( *.pk3 )
RtCW ( *.mdc )
Doom 3 ( *.md5mesh;*.md5anim;*.md5camera )
DirectX X ( *.x )
Quick3D ( *.q3o;q3s )
Raw Triangles ( .raw )
AC3D ( *.ac )
Stereolithography ( *.stl )
Autodesk DXF ( *.dxf )
Irrlicht Mesh ( *.irrmesh;*.xml )
Irrlicht Scene ( *.irr;*.xml )
Object File Format ( *.off )
Terragen Terrain ( *.ter )
3D GameStudio Model ( *.mdl )
3D GameStudio Terrain ( *.hmp )
Ogre (*.mesh.xml, *.skeleton.xml, *.material)
Milkshape 3D ( *.ms3d )
LightWave Model ( *.lwo )
LightWave Scene ( *.lws )
Modo Model ( *.lxo )
CharacterStudio Motion ( *.csm )
Stanford Ply ( *.ply )
TrueSpace ( *.cob, *.scn )
XGL ( *.xgl, *.zgl )
なんかめっちゃある…。しかもCとC++の両方で使えるという訳でテンション上がりまくりんぐ。Windows、OSX、LinuxをサポートしてるんだったらきっとiOSでも使えるよね!という事で挑戦してみました。
ポータルサイトからソースをダウンロード…でもいいのですが、githubに最新版が置いてあるのでそっちからダウンロードしましょう。Windowsの人はdllファイルが同梱されているのでそれを使えばいいと思います。OSXの場合Xcodeのプロジェクトが同梱されています。
ちなみに、ビルドするには先日ビルドしたboostが必要となります。PROJECT->assimp->Build Settings->Header Search Pathsで、boostのヘッダファイルの場所を指定しておいてください。
もし自分のプロジェクトでboostを使っていなかったり、今後も使う予定が無ければ、PROJECT->assimp->Build Settings->Preprocessor MacrosにASSIMP_BUILD_BOOST_WORKAROUNDを指定しておけば、assimpに同梱されているboostのライブラリを使ってビルドが行われます。
もし自分のプロジェクトでboostを使っていなかったり、今後も使う予定が無ければ、PROJECT->assimp->Build Settings->Preprocessor MacrosにASSIMP_BUILD_BOOST_WORKAROUNDを指定しておけば、assimpに同梱されているboostのライブラリを使ってビルドが行われます。
さて。OSXはビルドしてできた.aを自分のプロジェクトで使えばいいのですが、iOSの場合は、boostと同じく、実機とシミュレーターで2回ビルドして、2つの.aをlipoで1つにまとめます。ターミナルを立ち上げて、ライブラリが生成された場所をカレントにしたら、
lipo -create Release-iphonesimulator/libassimp.a Release-iphoneos/libassimp.a -output libassimp.a
みたいな感じですね。
さてついでに、簡単なサンプルも用意してみたので、実際に読み込んでみましょう。サンプルではCheetah3Dというモデリングソフトから書き出したColladaファイル(.dae)を読み込んで表示しています。あいかわらずヘッダファイルしかない実装ですいません。
ちなみに「自分は.objしか使わないから、他のは余分…」という場合、ビルド時にプリプロセッサにASSIMP_BUILD_NO_3DS_IMPORTERとかASSIMP_BUILD_NO_Q3BSP_IMPORTERとか指定すれば、使わない読み込み処理をコンパイルしないでライブラリのサイズを小さくする事ができます。詳しくは同梱されているヘルプのExtending the Libraryを読んでみてください。
3Dモデルやアニメーションデータは使うツールによってまちまちで、いちいち仕様を解析して読み込み処理を実装する必要に迫られて凹むのですが、もうこれで悩まされる事も無くなりそうな勢いです。assimpかしこいよassimp。
ではまた次回!