Blender! Collada! vvvv!

Pocket

ついにBlenderで自作したアーマチュア(ボーン)アニメーション付きのモデルをvvvvに入れて自由に動かすことに成功しました!!!!

以前もBlenderからvvvvへモデルをインポートする投稿をしましたが今回はそのグレードアップ版です。
行く手を阻む幾多の謎挙動に何度諦めかけたことか!
しかし! いや、上手くいかないはずは無い! という半ば根拠のないBlenderとvvvvへの信仰心だけを心の支えに突き進み、
ようやく光を見出しました! これで誰でも(無料で)快適3DCGライフ!
よくこのブラックボックスを使いこなしたなと久しぶりに自分で自分を褒めたい気分です!笑
もう…Collada系のノードへの愚痴しか湧きません…。
(が、文句言うなら自分でモデルローダー書けよってね。うん、気が向いたらね!)

今回はvvvvでSkeletonを使えるようになることが目的なのでテクスチャについては触れません。
テクスチャを扱う場合もまた色々なトラップがあるのだろうか。。。
それについては次の機会とします。

さて、前置きはこれくらいにして手順を見ていきましょう。
vvvvのバージョンは45beta34.1 x86。
Blenderのバージョンは2.74です。

完成版のパッチはこちらからダウンロードできます。

ざっと要約すると以下の項目を全て正しく行わなければなりません!

  1. 全てのオブジェクト/アーマチュアのスケールを揃える
  2. 全てのオブジェクト/アーマチュアのOriginを揃える
  3. メッシュは1つ以上かつ4つ以内のアーマチュアにウェイトを設定する
  4. VertexGroupはアーマチュアと同じ名前で同じ数かつ同じ順番にする
  5. キーフレームを作成し終わったら1フレーム目でポーズの初期化を行う
  6. Colladaをエクスポートするときは必ずタイムラインの1フレームで行う
  7. エクスポート時のオプションをvvvv用に設定する
  8. ColladaFileノードの座標系をBlenderに合わせて設定する
  9. Mesh、Skeleton、Skinning、GetJointTransformを正しく設定する
  10. RendererのDepthBufferを正しく設定する
  11. Colladaファイルのリロードに注意する

以下詳しく説明していきます。
今回は女の子のモデルを使って解説します。(おや? このモデルはどこかで…)
いくつかのオブジェクトと数十個のアーマチュアから構成されています。

画像1

画像1 モデル

1. 全てのオブジェクト/アーマチュアのスケールを揃える

これは単純なんですが、モデリングをしているとついついスケールがばらばらのオブジェクトを作ってしまいます。。。

具体的にどういうことかというと、
画像2、画像3の様に全てのオブジェクト/アーマチュアにおいてスケールを同じ値に揃えるということです。

画像2 ボディのスケール

画像2 ボディのスケール


画像3 服のスケール

画像3 服のスケール

ボディも服も他のオブジェクトもアーマチュアも全てです。
Object Modeでオブジェクトのスケールを変更してしまうとこれらの値が変わってしまいます。
モデリングをしているとついついこの操作をやってしまう。。。
Edit Modeでスケールを変更するのは問題ありません。
おそらくスケールは揃ってさえいれば1でなくても良いかもしれませんが、
わかりやすく1にしています。(1以外は試していません。)

2. 全てのオブジェクト/アーマチュアのOriginを揃える

もう1つモデリングしているうちについつい不揃いになってしまうのがオブジェクトのOriginです。
このOriginも全てのオブジェクト/アーマチュアについて同じ位置に揃えます。
再度、画像2と画像3を見てみると、オレンジ色の点が服のオブジェクトでもボディのオブジェクトでも原点に位置しています。この様にします。
これもたぶん揃っていればどこでもいいのかもしれませんが、わかりやすく原点(0, 0, 0)にしています。
(これも原点以外試していません。)

3. メッシュは1つ以上かつ4つ以内のアーマチュアにウェイトを設定する

はい。出ました。この辺りから仕様を解明する難易度が上がってきます。。。
上の1、2が★☆☆☆☆ならこれは★★★☆☆といったところか。。。

これはColladaフォーマットの仕様なのかもしれません。(ちゃんと調べてはないです。)
Blenderでも頂点辺りのウェイト設定数を制限する機能があるので、
きちんとしたモデリングスキルがある人にとっては当たりまえの仕様なのかもしれません。

Blenderでウェイト設定するときに、
「With Automatic Weights」で行うと1つの頂点が異なる4つ以上のアーマチュア対してウェイトが設定されてしまうケースもあるので注意です。
そして一旦自動でウェイト設定されてしまうとどの頂点が4つ以上のアーマチュアにウェイト設定されているのかがわからなくなってしまいます。
そういう場合はWeight ToolsのLimit Total機能などを使って何とかしましょう。

Renderer(TTY)でログを出していると、
モデルファイルをColladaFileに設定した瞬間「1つの頂点はボーン4つ以上にウェイト設定するなよ~」的なログがでます。
英文です。正確な文はすみません、忘れました。
とにかく、このログが出なくなるまでBlenderでウェイトの設定を調整します。

4. VertexGroupはアーマチュアと同じ名前で同じ数かつ同じ順番にする

さぁ、来ました、★★★★★! 仕様解明の難易度最高ランクのク〇仕様です!笑
(これもきちんとしたモデラーさんなら常識だったら文句言ってごめんなさい。)

これはどういうことかというと画像4をご覧ください。

画像4 VertexGroups

画像4 VertexGroups

画像4に表示されるVertexGroupを全てのアーマチュア分用意します。
例えそのオブジェクトにはウェイトがついていない無関係と思われるアーマチュア/VertexGroupだとしても、
それぞれのオブジェクトについて全部のアーマチュア分のVertexGroupが必要です。
全部のオブジェクトについてチェックして足りないVertexGroupがあるオブジェクトについては+ボタンを押してVertexGroupを作成しアーマチュアと同じ名前を付けます。
ウェイトを設定したときにある程度は自動で作成されているはずですが、オブジェクトによってまちまちだと思います。
並べ替えには、VertexGroupsの横にある▼ボタンを押すと表示される「Sort by Bone Hierarchy」を使用します。

アーマチュアが多いと結構根気のいる作業です。。。

そしてVertex Groupsの数は60個以内にしなければならないと思われます。
vvvvのSkinningノードのSkinningMatricesピンが60個以上の入力に対応してないからです。
(実際60個以上で試してないのでどうなるかわかりませんがきっとうまくいかないでしょう。)

5. キーフレームを作成し終わったら1フレーム目でポーズの初期化を行う

これもランク★★★★★の謎仕様です。

マジ意味わからないので慎重に丁寧にやっていきましょう。
まず、タイムラインで1フレーム目に移動します。

画像5 1フレーム目に移動

画像5 1フレーム目に移動

アーマチュアを選択してPoseModeにしておきます、
Aキーでアーマチュアを全選択します。
Spaceキーを押して「Clear Pose Transforms」を選択しポーズを元に戻します。

画像6 ClearPoseTransforms

画像6 ClearPoseTransforms

次にObject Modeにしてオブジェクトを全て選択し、
Spaceキーを押して「Apply Visual Transform」を選択します。
これでモデルの初期位置が設定されることになります。

画像7 ApplyVisualTransform

画像7 ApplyVisualTransform

6. Colladaをエクスポートするときは必ずタイムラインの1フレームで行う

これも意味わからないやつですね。★★★★★ですね。

5.で1フレーム目に移動していればそのままでOKです。
今後もフレームを移動したらエクスポートするときは1フレーム目に戻してからエクスポートするように注意してください。

7. エクスポート時のオプションをvvvv用に設定する

File>Export>Colladaからエクスポートを行います。
エクスポート時のオプションに注意が必要です。
画像8の様に設定します。
Presetsに登録しておくと今後便利だと思います。

画像8 Colladaのエクスポート

画像8 Colladaのエクスポート

Apply ModifiersやSort by Object nameが特に重要でしょうか。

8. ColladaFileノードの座標系をBlenderに合わせて設定する

いよいよvvvvにモデルを読み込みます。
ColladaFileノードの設定は画像9の様にしておきます。

ColladaFileノードの設定

ColladaFileノードの設定

ここでSkeletonとメッシュの向きを一致させるのにちょっと工夫が必要です。
ColladaFileノードで座標系の設定を変えてもSkeletonには反映されないようです。(なんでだよ。。。)
なのでSkeletonのルートであるArmatureという名前のSkeleton(ややこしいな)をx軸で90度回転させてから使用します。
SelectJointノードのウィンドウのFRONTタブの表示がモデルを正面から見た時と同じになっていればOKです。
(モデルが小さかったのでついでにここでスケールも大きくしています。)
以降、Skeletonをいじるのはここで設定したTransformを起点に行います。

画像10 Skeletonの初期Transform

画像10 Skeletonの初期Transform

9. Mesh、Skeleton、Skinning、GetJointTransformを正しく設定する

モデルをアニメーションさせるにはSkinningノードを使用します。
今回はMesh(Ex9.Geometry Collada)ノードとSkinningノードの間にSkeleton(Skeleton Collada)ノードやSetJointノードを挟んでアニメーションさせます。
最終的なTransformはGetJointTransformノードで取得します。
ここで重要なのはMeshノードからInverse Bind Pose Transformsというピンの出力をもらうことです。
このピンは隠れているのでInspektorで表示するように変更します。
これをGetJointTransformのInverse Bind Poseピンに繋げます。

画像11 InverseBindPoseTransforms

画像11 InverseBindPoseTransforms

Skeletonを自由に扱えることによってBlenderで設定していない動きを付けることが出来ます。
これによってリアルタイムに色々な動きを付けることが出来るようになるので、様々な創造的な試みができるようになるでしょう。
vvvvに組み込みで入っている他のSkeleton系の強力なノードを使うこともできるようにな…るはずなんですが何だかこれも変な挙動するやつがあるんで後日また調べたいと思います。。。

ここでは例として髪の毛の三つ編み部分のSkeletonの角度を変更しています。

画像12 三つ編みの角度を変更

画像12 三つ編みの角度を変更

9. RendererのDepthBufferを正しく設定する

これは今回に限った話ではありませんがInspectorで、
Renderer(EX9)のFullscreen/Windowed Depthbuffer FormatをD16かD24X8にしておきましょう。
これで3Dオブジェクトが正しく描画されます。

11. Colladaファイルのリロードに注意する

最後に、これは手順というより注意事項ですが、
ColladaFileノードのDo RescanピンをBangしてもColladaファイルが再読み込みされない場合があります。
そういう場合はCtrl+Rでパッチを再起動しましょう。

おわり

以上です!
長かったですがこんなことをしないとBlenderとvvvvは仲良くやってくれないようです笑
これで3Dモデルを扱う下地がほぼ整ったので、
これからはもっといろんなアニメーションをさせて面白い映像を作っていきたいと思います!
では、また会う日まで~!
girl

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください