Google

2015年2月3日火曜日

RuntimeStlLoaderの使い方

先日発売した「Runtime STL Loader」ですが、技術寄りの商品なので解説します。
言うまでもなく、実行時にSTLファイルをロードする商品なんですけど、もうちょっと詳しく。

元々作ったきっかけはUnityにSTLを読み込む機能がなかったことでした。
というか3Dプリンタ関係の仕事上必要ではあったのですが、そこまで難しいフォーマットではないし、AssetStoreにもなかったんで作ってしまえばいいかと考えた次第。
で、UnityEditor上で実行前に読み込むという要求がなかったので、実行時にロードするようにしたわけです。

つまり、実行時に関数を呼び出して使って頂くことになります。
さて、実演の前に準備しておくものがこちら。(パッケージには全て同梱してあります)
  1. STLファイル(テキスト・バイナリ問わず)
  2. STLのひな形となるプレハブ
  3. STLインスタンスの親となるGameObjectインスタンス
1.は当然必須ですが、製品パッケージにはサンプルとして弊社ロゴのSTLファイルが同梱されています。
別に大した価値はありませんが、再配布ができないSTLが多いので自作物を入れてみました。

このSTLファイルは実行時にUnityが読み込める場所にあることが前提です。
例えばiOSの場合、審査に引っかからない場所(Documents/)等に配置しなければなりません。
他OSも同様で、STLファイルは起動時に存在してもダウンロードしても関係なくロード可能です。(※現時点ではWebPlayerにだけ対応していません)
Unity側からコールする関係上、ディレクトリ指定は環境別にpersistentDataPath等で正しく指定してください。

続いて2.は動的にGameObjectを生成するための、ほとんど空っぽのプレハブです。
パッケージには同梱されていますが、簡単に自分で作ることもできます。

STL用プレハブの手動作成方法:
  • まずEmptyのGameObjectを生成します(MenuのGameObject→Create Empty)
  • Mesh FilterコンポーネントをAddします(Mesh指定は空っぽでOK)
  • Mesh RendererコンポーネントをAddします
  • お手持ちのMaterialコンポーネントをAddします(シェーダや色はお好みで)
    • 無ければProjectウィンドウのCreateからMaterialで作成して下さい
これでSTL表示用プレハブとして使えます。
ちなみに同梱済のMaterialはDeffuseでカラーはホワイトにしてあります。
将来的にはこの手順も自動化してもいいんですが、大した作業ではないので現時点ではサンプルを添付する形にさせて頂きました。

最後に3.ですが、STLインスタンスの親となるGameObjectインスタンスを何かしら準備してください。用途に応じてですがなんでも結構です。
これはUnityがポリゴン頂点数65k以上に対応していない仕様をどうにかするためのものでして、オーバーする場合は複数のGameObjectに分割して生成するようにしているのが要因です。
なので、1個かどうかに関係なく親を指定してもらい、その下に連ねるという形です。

これらが準備できたら以下のコードをMonoBehaviour派生クラスに書き込んでシーン上に作った管理用GameObject等にアタッチします。
publicメンバのm_stl_prefabに先程のSTLプレハブをアタッチするのをお忘れなく。

 public GameObject m_stl_base_prefab;
 void Start() {
  // RuntimeStlLoaderインスタンスの呼び出し
  RuntimeStlLoader loader = RuntimeStlLoader.getInstance();
  // STL生成
  GameObject obj = 
   loader.loadStlToScene(
     loader.getPlatformPath() + "RuntimeStlLoader/Stl/" + "angework_logo.stl",
     m_stl_base_prefab,
     gameObject);
 }

上記の例ですと、親GameObjectは呼び出している自分自身として生成します。
ディレクトリはパッケージに同梱したサンプルという事になります。

戻りは保存してもしなくてもOKですが、成功すればSTLのメッシュが埋め込まれたGameObjectインスタンスが返ってきます。(失敗時はnullが戻ります)
また、成功すればシーン上にSTLのMeshが表示されます。

こんな感じで表示されます

なお、この製品の用途ですが、STL表示以外の重要な用途も紹介させて頂きます。
  1. STLのMeshを抜き出す
  2. プレハブ化する
  3. リダクションを諦めたSTLを表示する
a.ですが、Meshを抜き出すことで別のGameObjectへ紐付けて生成させることが可能になる、という点がポイントです。
現在手動でやる必要がありますが、次回以降で1タッチ生成ぐらいの手間省きは考えてます。

b.も同様ですが、こちらの場合はプレハブ化してしまうためBlender等で変換をいちいち行う必要すらなくなります。
これもスクリプトを毎回書かなくてよいように、自動化する予定です。

c.はBlender等を使って変換しようにも、リダクションすら有効に機能しないようなモデルを表示するために使えるというメリットです。
限界突破した場合はオブジェクトを分割して作るので、基本クラッシュせずに表示が可能になります。(負荷問題やUVはまた別)

Runtime STL Loader
公式リンク:
http://angework.com/products/Unity/RuntimeStlLoader.html
AssetStore:
https://www.assetstore.unity3d.com/jp/#!/content/28511

再度の手前味噌記事で失礼いたしました。

0 件のコメント:

コメントを投稿