3Dモデルを iOS アプリで動かす【その１】3Dモデルのファイルフォーマット

3Dプリンターやら何やらのブームで、最近いろいろと ◯◯ の 3D データ公開！みたいなニュースをよく見かけます。

- [Hondaの歴代コンセプトカーの3Dデータを公開 －3DプリンターでHondaの「ものづくり」を体験－](http://www.honda.co.jp/news/2014/4140128.html)
- [スミソニアン博物館が収蔵品の3Dデータを無料配布](http://akiba-pc.watch.impress.co.jp/docs/column/3dpnews/20131130_625807.html)
- [Perfume official global website](http://wt2.perfume-global.com/)

が、自分は 3D まわりの知識がまったくなく、おもしろそうだけど「おもしろそうだなー」で終わってたので、それでは寂しい、ということで <b>3D モデルデータのファイル形式</b> について調べるところから、 **iOS アプリ内で 3D モデルデータを表示する** ところまでやってみました。


まずは 3D モデルのファイル形式について。


#STLファイル（拡張子 .stl）

ホンダやスミソニアン博物館の3Dデータとかはこれ。 **3Dプリンタの標準データ形式** として使われているようです。 

- [パーソナル3Dプリンタ導入の手引き 第3回](http://pc.watch.impress.co.jp/docs/column/1month-kouza/20140124_632097.html)

> 3Dプリンタは、3Dデータを元に動作し(正確にはGコードなどのツールパスデータを元に動作するのだが、その元となるのが3Dデータである)、物体を造形する装置である。しかし、一口に3Dデータといっても、その形式はさまざまだ。例えば、動画データには、QuickTime形式やAVI形式、MP4形式などさまざまな形式(フォーマット)があり、動画再生ソフトや動画編集ソフトによって対応している形式が異なる。3Dデータも事情は全く同じで、3D CADソフトや3D CGソフトによって対応している形式が異なる。ほとんどの3D CADソフトや3D CGソフトは複数のデータ形式に対応しているが、標準で保存される形式はソフトによって異なる。ソフトによって保存するデータ形式が異なっていては、3Dプリンタ側でその全てに対応するのは困難だ。そこで、3Dプリンタでは通常、STL(STereoLithography)形式と呼ばれる3Dデータ形式が使われている。


**色情報は持っていない** とのこと。

> STL形式は色情報も持たないため、基本的に単色で出力する熱溶解積層方式や光造形方式、粉末焼結方式の3Dプリンタで使われ、フルカラーでの出力が可能な粉末石膏方式の3Dプリンタでは、PLY形式、VRML形式といった色情報を持った3Dデータ形式が利用されている。


###Pleasant3D で見てみる

まずはビューワーアプリで Mac 上で表示してみます。

ググって一番上に出てきた [Pleasant3D](http://www.macupdate.com/app/mac/32803/pleasant3d) というアプリをダウンロード＆インストールし、ホンダのデータを表示してみると、

![honda.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/6560dfc8-04bb-76a6-8f49-dd8bbbb08305.jpeg)

あっさりうまくいきました。


###STL参考記事

- [STLファイルフォーマット](http://www.hiramine.com/programming/3dmodelfileformat/stlfileformat.html)
  - STLファイルフォーマットについての詳しい解説がありました。

> 3D Systems社のSLA CADというソフト用のファイルフォーマットです。
多くの解析ソフトがサポートし、三角形メッシュソリッド表現ファイルフォーマットとして広く使用されています。


- [3Dデータのファイル形式(拡張子)について](http://digifab.jp/3d-printer/8)
  - STLファイルの編集に使えるソフトウェアがいろいろと載っています。


#OBJファイル

Perfume のデータ形式がこれ。また前述したスミソニアン博物館は STL 形式も提供してますが、この OBJ 形式のデータも提供してます。

正式には Wavefront OBJ 形式。

- [3Dファイルフォーマットの種類](http://www.slis.tsukuba.ac.jp/~fujisawa.makoto.fu/cgi-bin/wiki/index.php?3D%A5%D5%A5%A1%A5%A4%A5%EB%A5%D5%A5%A9%A1%BC%A5%DE%A5%C3%A5%C8%A4%CE%BC%EF%CE%E0)


STL との違いとしては、『別に材質ファイル(*.mtl)を用意して，オブジェクトファイル(*.obj)から 読み込むことで表面材質やテクスチャも指定できる』ようです。

- [OBJ形式](http://www.slis.tsukuba.ac.jp/~fujisawa.makoto.fu/cgi-bin/wiki/index.php?OBJ%B7%C1%BC%B0)

```
材質ファイルには，

- 拡散反射成分 : Kd
- 鏡面反射成分 : Ks
- 環境光反射成分 : Ka
- アルファ値(透過率) : d
- 発光色 : Tr
- Shininess : Ni
- 照明モデル(1で鏡面反射無効, 2で有効) : illum
- テクスチャ : map_Kd

を記述できる．
```

###MeshLab で見てみる

[MeshLab](http://meshlab.sourceforge.net/) で見れました。

![mammoth.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/feb013a9-d142-2d06-726b-5e447535a0c4.jpeg)


また、Photoshop でも表示できました。

![mammoth2.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/963a6b65-fd3c-b51d-f241-806ff1d2312a.jpeg)


#MODELファイル

（※先に書いておくと、本項は蛇足です）

iOS Dev Centerの "GLEssentials" というサンプルに入っていたモデルファイルが、 "demon.model" となっていたので、これは何だろうとググってみると CATIA というCADソフトの出力形式らしく、無償のビューワソフトみたいなのもない、とのこと。

そんなプロプライエタリな形式が Apple のサンプルコードで使われるはずがない・・・と思い、サンプル内のコードを読むと、

```
filePathName = [[NSBundle mainBundle] pathForResource:@"demon" ofType:@"model"];
m_characterModel = mdlLoadModel([filePathName cStringUsingEncoding:NSASCIIStringEncoding]);
```

と読み込まれていて、この `mdlLoadModel` という関数が実装されているファイル "modelUtil" を見てみると、ヘッダには

>  Functions for loading a model file for vertex arrays.  The model file 
 format used is a simple "binary blob" invented for the purpose of 
 this sample code.

とあって、結論としては CATIA とは無関係の、このサンプル用ファイルっぽいです。


![demon.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/07abd70b-8d8a-cbfa-2777-c2ddabb1f743.jpeg)

(demon.model)


#3Dデータのダウンロードサイト

###[３Ｄプリンター用のSTLデータをダウンロードできるサイトを探そう！](http://blog.goo.ne.jp/t2com1230/e/865f340acbff6fc895a9393b9c85f471)

- 海外／国内の3Dデータダウンロードサイトのまとめ
- 各リンクにコメントつき
- 2014年3月の記事なので、情報が新しい


###[無料で3Dモデルをダウンロードできる60のサイト](http://createlier.sitemix.jp/blog/free-3d-model-60sites/)

- 海外記事の翻訳記事
- 全部は訳されてなくて、「続きは元記事へ」


#つづきます

[【その２】PowerVR Insider SDK](http://qiita.com/shu223/items/a38b63c84ac3197311ef) に続きます。

iOSアプリに3Dモデルを読み込むための PowerVR Insider SDK について。