Google

2015年2月19日木曜日

RuntimeSTLLoader ver1.1.0

当商品をバージョンアップしました。
基本的な部分はあまり変化がありませんが、使いやすさと変換機能を搭載しました。
更新内容はこちら。
  1. STL生成先をルートか既存オブジェクトの下から選択可能
  2. デモシーンの大幅変更
  3. お手持ちのSTLをデモシーンで簡単に表示
  4. プロジェクト上のSTLパス抽出機能を追加
  5. Mesh抜き出しとプレハブ化
順を追って説明していきます。


1.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);
 }

呼び出しの引数の最後の部分、parentを指定すべき部分にnullを入れるとシーンルートに生成を行うようにしました。
これはちょっとした使い勝手向上という感じ。


2.デモシーンの大幅変更

デモシーンを色々と強化して当プラグイン自体にも役立つユーティリティとして使って頂く形にしてみました。


デモシーンを起動すると上のような画面になります。
画面上のボタン構成はこうです。
  • 埋め込んだ弊社ロゴSTLを表示するボタン
  • プロジェクト上のSTLパスを記載してもらうエリア
  • (b)のパスからSTLを読み出すボタン
  • 現在表示中のSTLをMeshとプレハブに吐き出すボタン
  • 現在表示中のSTLをクリアするボタン
これらが機能を持っている訳ですが、説明は順繰りで。


3.お手持ちのSTLをデモシーンで簡単に表示
4プロジェクト上のSTLパス抽出機能を追加

この2つはグループです。
デモシーンは今まで同梱されていた弊社ロゴしか表示しませんでした。
(a)のボタンは1.0.0と同一で、予めデモに埋め込んだ弊社ロゴSTLを出すだけの機能で、それを踏襲しています。
なので押せば単純に前回とほぼ同じ結果になるだけです。

ロゴが出るだけ
ですがデモとしてはそれも不便だったので、プロジェクトに別のSTLを追加してパスを指定して簡単に表示するようにしてみました。
これが(b)と(c)のGUIに関係します。

まずはその辺で拾ってきたSTLファイルをこのPluginが入ったプロジェクトにインポートして下さい。
プロジェクトへのインポートは通常通りD&Dで問題ありません。
インポートしたら必ずUnityEditor上でデモシーンを「実行」する必要があります。
そして、実行状態のままで、そのSTLファイルを右クリックして下さい。

するとこんな風に追加されたメニューがでてきます。
この時、間違った選択をしていると正しく動作しません(エラーにはなりませんが)。
そしてこのメニュー項目を選択すれば、デモ画面の(b)、テキストエリアにそのファイルパスが埋め込まれます。

こんな感じに文字列が入ります。
後はそのテキストエリアの下にある(c)ボタンを押すだけ。
要はこの(c)のボタンは、テキストエリアに指定されたプロジェクト上パスから読み出すというボタンになります。

ご存知の方も多いかとは思いますが、このパスはAssetsから始まる形式です。
当然ながら自力で指定してもいいのですが、それを毎回書くのも嫌だろうと勝手に思い込んで付けた訳です。



5.はサンプルとして同梱したテストシーンに追加した便利機能です。
STLからMeshとプレハブを生成するという代物です。
では実演。


このSSのようにSTLを表示した状態で下から2番目のボタン(d)を押すと、、、

こんなメッセージが出て
プロジェクトにMeshとプレハブが生成されます。
エクスプローラーで見るとこんな感じ
プロジェクトのルートに生成するのですが、その際のファイル名はこういう法則です。

  • StlMesh.asset
  • (インスタンス名).prefab

既に同一名のファイルがあると失敗します。
そして、一旦プレハブ化してしまえば、それはそのままシーンに持っていけるようになります。
ある意味このツール要らずになるのですが。

コンバートしたプレハブのプロパティはこんな感じ
FBXに比べれば自由度は減りますが、Maya等の3Dツールが不要な変換機能が追加されたという事になりますでしょうか。


今回のまとめ

要はこのデモシーンを使って、STLファイルをインポート、パス指定、プレハブ化というシーケンスを簡易に行うツールになるという訳です。
別の見方をすれば、わざわざSTLを表示するツールなのに、プレハブにすることでその存在意義が無くなるというバージョンアップでもありますがw

なお、デモシーン自体はUnityEditor上でしか正しく動作しませんのでご注意を。
本体はWebPlayerを除く大抵の環境で動作します。


宜しければ弊社公式サイトも併せて御覧ください。
http://www.angework.co.jp/products/Unity/RuntimeStlLoader.html

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

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