2013/11/02(土) [n年前の日記]
#1 [unity][blender] blenderとRigifyとUnityとMecanim
blender で、Unity の Mecanim 用データを作ろうとしてアレコレ試してたのだけど上手く行かず。
blender + Rigify で Mecanim というと、Google検索の結果からして、以下のページが多く参照されてるのかなと思うのだけど。
_Unity3D - BlenderでMecanimしようぜ(前編) - Qiita [キータ]
_Unity3D - BlenderでMecanimしようぜ(後編) - Qiita [キータ]
件のページのコメント欄で、blender 2.67 以降は Rigify の構造が変わって記事の通りじゃ上手く行かないよ、という話を見かけたので、試しに blender 2.66.1 で Rigify を使って作業してみたものの。やっぱりタコ人間になってしまう。おかしいなー。
と、悩んでいたのだけど。以下の動画に遭遇して、その通りにやってみたところ上手くいった。ありがたや。しかも、動画内で使ってる blender は 2.68 に見える。古いバージョンの blender を使わなくても作業できるのだなと。
_Blender Rigify into Unity Mecanim - YouTube
肝は、途中でPythonスクリプトを使ってること、なのかなと。スクリプトの処理内容は、動画概要によると…。
更に動画中では、DEF-* ボーン (+ WGT-* オブジェクト)を全消去もしていて。つまりそもそも、DEF-* ボーンに仕事をさせたら上手く行かんのだなと今頃ようやく認識。Unity用のデータを作る際は、ORG-* ボーンに仕事をさせる。DEF-* ボーンは最初から捨てる、と。もちろん、blender だけで動画を作る、といった作業であれば、そういうことはしなくてもいいんだけど。
忘れそうなので、手順をメモ。
動画の概要文で紹介されているスクリプトの入手先URLも一応メモ。
_Rigify_script.py - Google ドライブ
これでなんとか、モデルデータを Unity に持っていくことができた…。
- Rigifyを使うと、ボーン数が若干多いため、Unity上ではタコ人間・ゴム人間になってしまう。
- 自分でアーマチュアを追加して作っていくと、モーションをつけた時に何故か空中にキャラが浮いてしまう。
blender + Rigify で Mecanim というと、Google検索の結果からして、以下のページが多く参照されてるのかなと思うのだけど。
_Unity3D - BlenderでMecanimしようぜ(前編) - Qiita [キータ]
_Unity3D - BlenderでMecanimしようぜ(後編) - Qiita [キータ]
件のページのコメント欄で、blender 2.67 以降は Rigify の構造が変わって記事の通りじゃ上手く行かないよ、という話を見かけたので、試しに blender 2.66.1 で Rigify を使って作業してみたものの。やっぱりタコ人間になってしまう。おかしいなー。
と、悩んでいたのだけど。以下の動画に遭遇して、その通りにやってみたところ上手くいった。ありがたや。しかも、動画内で使ってる blender は 2.68 に見える。古いバージョンの blender を使わなくても作業できるのだなと。
_Blender Rigify into Unity Mecanim - YouTube
肝は、途中でPythonスクリプトを使ってること、なのかなと。スクリプトの処理内容は、動画概要によると…。
- DEF-* とついてる全てのボーンの deformation を無効にして。
- ORG-* とついてるボーンをdeformation有効にしている。
更に動画中では、DEF-* ボーン (+ WGT-* オブジェクト)を全消去もしていて。つまりそもそも、DEF-* ボーンに仕事をさせたら上手く行かんのだなと今頃ようやく認識。Unity用のデータを作る際は、ORG-* ボーンに仕事をさせる。DEF-* ボーンは最初から捨てる、と。もちろん、blender だけで動画を作る、といった作業であれば、そういうことはしなくてもいいんだけど。
忘れそうなので、手順をメモ。
- Rigify用のアーマチュアを追加。Shift+A → アーマチュア → Human(Meta-Rig)、を選択。
- アーマチュアの位置合わせをする。アーマチュアを選択した状態でTABキー。それぞれを選択してGキーで移動。
- Rigを自動生成する。アーマチュアを選択した状態で、プロパティウインドウ → オブジェクトデータタブ → Generateボタンをクリック。自動生成されたら、元のアーマチュアは削除していい。
- ボーンのdeformation設定を変更する。テキストエディターに切り替え。テキスト → テキストブロックを開く → Rigify_script.py を開いて、実行ボタンをクリック。
- 頂点ウェイトを設定する。3Dビューに戻して、モデル → Rigの順で複数選択(Shift+右クリック)。Ctrl+P → 「自動のウェイトで」。
- 必要であれば、頂点ウェイトを調整する。ボーンは非表示になっているので、オブジェクトデータタブ → スケルトン → レイヤーの、一番最後をShift+左クリック。ORG-* とついたボーンが表示されるようになる。モデルを選択して、ウェイトモードにして(Ctrl+TAB)、ボーンを右クリックすれば、各頂点のウェイトが確認できる。
- DEF-* とついてるボーンを削除する。レイヤーの一番最後から3つ目に DEF-* ボーンがまとめられているので、表示して、選択して、削除(Xキー)。
- WGT-* とついてるオブジェクトを削除する。アウトライナーウインドウで、検索欄に WGT[Enter]を入力。WGT-*とついているオブジェクトがリストアップされるので、Aキーを何度か押して全選択後、「Scene」だけクリックして選択を外し、右クリックメニュー → 削除。
- Unityでしか使わないデータなら、Lamp や Camera も削除しちゃってOK。
- FBXとしてエクスポート。
動画の概要文で紹介されているスクリプトの入手先URLも一応メモ。
_Rigify_script.py - Google ドライブ
これでなんとか、モデルデータを Unity に持っていくことができた…。
◎ Mecanim利用時のモーションについて。 :
モーションは、Legacy アニメーションと同じノリで作れば、Unityに持っていけるみたい。
ただ、Mecanim 用のモーションは、移動量もモーションの中に入れておかないといけないみたいで…。自分、今まで、その場から動かない走りモーション等を作っていたのだけど。Mecanim のソレは、動いてるなら動いた分、実際に移動してないとよろしくないようで。
もっとも、その場から動かないモーション ―― 「不動」のアニメーションも、スクリプトで移動させればいいらしい。Unity公式サイトの、 _マニュアルでのルートモーションのスクリプティング というページで説明されてた。
Mecanim のソレは、Animator Controller なるものを使って制御してやらないといかんらしくて。待ちモーション、歩きモーション、走りモーション等、色んなモーションがあるだろうけど。「そのモーションはどのモーションに変わっていく可能性があるのか?」を図解っぽい形で設定していくのだとか。
_アニメータコンポーネントとアニメータコントローラ
_アニメーション ステートマシン
何が何やらさっぱりだったけど、以下のページでなんとなく作業の流れが分かったような気になったり。ありがたや。
_【Unity4】【mecanim】メカニムを使ってみた・その2
「矢印みたいなのはどうやって引くんだろう?」と思ったけど、ボックス? ステート? を右クリックして Make Transition を選べばよかったのですな…。ていうか公式サイトのマニュアルにはそのへんの記述が無いように見えてハマったのだけど。自分、見落としてるのだろうか…。Mecanim関係は「動画を見ろ」で済まされてる場合が多い印象で。何度も一時停止して何をやってるのか確認しないといかんからツライんだよなあ…。YouTubeはコマ送り再生すらできないし…。
とりあえず、各ステート?に対して、一定時間で別のモーションに切り替わる設定を ―― 切り替わる条件を「EXIT TIME」にして秒数を指定して、待ち → 走り → 待ち → 走り、をするところまではできたけど。さて、これをスクリプトで制御するにはどうしたら…。
ただ、Mecanim 用のモーションは、移動量もモーションの中に入れておかないといけないみたいで…。自分、今まで、その場から動かない走りモーション等を作っていたのだけど。Mecanim のソレは、動いてるなら動いた分、実際に移動してないとよろしくないようで。
もっとも、その場から動かないモーション ―― 「不動」のアニメーションも、スクリプトで移動させればいいらしい。Unity公式サイトの、 _マニュアルでのルートモーションのスクリプティング というページで説明されてた。
Mecanim のソレは、Animator Controller なるものを使って制御してやらないといかんらしくて。待ちモーション、歩きモーション、走りモーション等、色んなモーションがあるだろうけど。「そのモーションはどのモーションに変わっていく可能性があるのか?」を図解っぽい形で設定していくのだとか。
_アニメータコンポーネントとアニメータコントローラ
_アニメーション ステートマシン
何が何やらさっぱりだったけど、以下のページでなんとなく作業の流れが分かったような気になったり。ありがたや。
_【Unity4】【mecanim】メカニムを使ってみた・その2
「矢印みたいなのはどうやって引くんだろう?」と思ったけど、ボックス? ステート? を右クリックして Make Transition を選べばよかったのですな…。ていうか公式サイトのマニュアルにはそのへんの記述が無いように見えてハマったのだけど。自分、見落としてるのだろうか…。Mecanim関係は「動画を見ろ」で済まされてる場合が多い印象で。何度も一時停止して何をやってるのか確認しないといかんからツライんだよなあ…。YouTubeはコマ送り再生すらできないし…。
とりあえず、各ステート?に対して、一定時間で別のモーションに切り替わる設定を ―― 切り替わる条件を「EXIT TIME」にして秒数を指定して、待ち → 走り → 待ち → 走り、をするところまではできたけど。さて、これをスクリプトで制御するにはどうしたら…。
◎ 余談。 :
しかしコレ、なんだかスクリプトを書くどころじゃないなあ…。以前、ホームページビルダーを触った時に、「HTMLタグを覚える作業が、ツールの使い方を覚える作業になってしまって、覚えなきゃいけないことの分量がむしろ増えちゃってないか?」と思ったものだけど。なんだかソレに近い状態になっているような…。とはいえ、「たった数日で Unity 並みの画面が出るエンジンを書けるんですか?」と問われたら「ソレは無理」と答えるわけで。まだ、このぐらいなら全然マシなほうかも、と自分に言い聞かせながら触っているのでした。
この記事へのツッコミ
[ ツッコミを読む(2) | ツッコむ ]
以上、1 日分です。
rigify で使用したモデルを Unity で取り込む方法を探し求めてこのページにきましたが、
ここの方法でもできませんでした。
Mesh か Armature、どちらか単体で FBX に出力すればインポートできますが、
関連付けて FBX に出力した場合、インポートした瞬間 Unity がクラッシュしてしまいます。
>Blender2.67ですと、rigifyのボーン構造が変わったようで
pythonを実行するとエラーになる・・・