BlenderでRigifyを使う方法


最近、Blenderでアニメーションをつける練習をしているので、それのメモです。
主に人型のアニメーションです。

##プラグインを有効にする

最近のBlenderのversionでは、どうやら人体のriggingを行うのに汎用的なものがプラグインとしてすでに設定されています。が、デフォルトはオフになっているので、まずはそれをオンにします。

infoのメニューから、[File] > [User Preferences]を選び、下記の画像の部分をクリックしてRigging: Rigifyを有効にします。

![rigfy-setting.png](https://qiita-image-store.s3.amazonaws.com/0/5616/e8cea6df-7a35-e40a-5388-c055e9857eb3.png "rigfy-setting.png")

##Rigging用のArmatureを追加する

このプラグインをオンにすると、infoのメニューの[Add] > [Armature] > Human(Meta-Rig)というのが増えています。（デフォルトだとSingle Boneしか項目がない）

![menu.png](https://qiita-image-store.s3.amazonaws.com/0/5616/e3d60ce8-e9b2-8671-83fe-3e022cc0e8cf.png "menu.png")

これを追加します。すると、すでに人の形に近い構成になっているbone郡が表示されます。

これを、準備した人のモデルの形に近づけます。サイズの変更、腕や足、指などの形をモデルに合わせます。後々ボーンとモデルをひもづける際に形がちゃんとなっていないと、変なところとひもづいてしまって修正がめんどくさいので、ここでしっかりボーンの形を整えておきます。

##ボーンからRigを生成する

ボーンの形を整えたら、ボーンを選択した状態でプロパティメニューのObject Dataから、**Rigify Buttons** にある「Generate」ボタンを押下してください。すると、ボーンの形から自動でRigが生成されます。

![generate.png](https://qiita-image-store.s3.amazonaws.com/0/5616/f01d3c36-db60-1026-227e-1e59a285ce36.png "generate.png")

##生成されたRigを調整する

上記で生成したRigはサイズが合っていない場合があります。
その場合はスケールなどで大きさを調整します。

![rig.png](https://qiita-image-store.s3.amazonaws.com/0/5616/272c9f2d-b803-0c9d-67f8-c44e6876b701.png "rig.png")

　↓

![rig-L.png](https://qiita-image-store.s3.amazonaws.com/0/5616/de4cbe05-3297-b683-3802-b54b7475eb8f.png "rig-L.png")


##Rigとモデルをひもづける

ここまで来たら、あとはRigとモデルとをひもづけるだけです。
まず最初にモデルを選択し、その後Rigを選択してください。
選択の順番には意味があるので、必ずモデル→Rigの順番で選択してください。

###Auto Weightでひもづける

選択したら、Ctrl + Pか、3D Viewバーの[Object] > [Parent] > [Armature Deform] > [With Automatic Weights]を選択してひもづけを行います。

![auto-weight.png](https://qiita-image-store.s3.amazonaws.com/0/5616/554dae16-3ba1-d80a-c8c4-c4b7b31f4f37.png "auto-weight.png")

##Errorが出たら

たまに、モデルのデータ構造によってはこの「With Automatic Weights」が失敗する場合があります。理由はどうやら、二重頂点だったりといった構造に問題がある場合に、自動でWeightが付けられない、ということのようです。

全部の原因がこれとは限りませんが、自分がやっていた場合は以下の方法で解消することができました。

###不要なMeshを削除する

まず、3D Viewで「T」キーを押してTool Shelfを出します。そしてモデルを選択し、Edit modeに入ります。（TABキーがショートカット）
すると、先ほど開いたTool Shelfの内容がMesh用に切り替わります。

ツールの中に[Remove] > [Remove Doubles]という項目があるのでこれを実行します。すると重複した頂点などが自動で削除されます。
続いて同じパネル内の[Normals] > [Recalculate]を実行しておきます。（これはもしかしたら必要ないかもしれません）

![tool-shelf.png](https://qiita-image-store.s3.amazonaws.com/0/5616/c9c1f0ed-4c3e-4329-e7b0-e6ff6138cc03.png "tool-shelf.png")

モデルデータの各パーツが分かれている場合は、それぞれのMeshに対してこれを実行する必要があります。
すべての調整が終わったら再び、ひもづけを行ってみてください。
次はうまく設定されるはずです。

##IKとFKを切り替える

さて、これでRigが生成されモデルとのひもづけが終わりました。
これでRigを操作してモデルを動かすことができるようになります。

が、生成されたRigはIKとFK両方の操作ができるようになっています。
（IKはInverse Kinematicsの略、FKはForward Kinematicsの略です）

これの切り替えは、次は3D View上でNキーを押すと出てくるPropetiesパネルにあります。

![ik-fk.png](https://qiita-image-store.s3.amazonaws.com/0/5616/b6c29e8f-2f66-5fc0-2b88-a28129687ca3.png "ik-fk.png")

上記の赤枠部分がその切替部分です。
おそらく、0だとFKによる操作、1だとIKによる操作になり、0.5だとそれぞれが半分ずつ影響を及ぼす、というような使い方になると思います。

基本的にはIKで操作したほうが直感的に操作できるのでおすすめです。
これを元に、実際に適用してみたのが以下の画像です。

![pose.png](https://qiita-image-store.s3.amazonaws.com/0/5616/da571d46-0532-3ffc-de11-6928a2190cd3.png "pose.png")

サンプルでは、腰の位置を下にさげ、上体を少しだけ前に出したものです。
腰の動きに追従して足が動いているのが分かると思います。

Rigのコントールは若干大変な部分がありますが、腕や足、かかとなどその部分を動かすことを目的としたコントローラ的な役割を持つオブジェクトがあるので、それを見つけて移動したり回転したりすることで、人体っぽい動きをつけることができます。

ものによっては移動が制限されていたり、回転が制限されていたりするので、色々といじって、どこを動かしたらどれが動くのか、というのを探してみてください。

##ボーンとメッシュの関連付けがおかしい場合

大事な点を忘れていたので追記。
今回、上記の方法でおおむねうまく行ったんですが、いくつかのメッシュが想定していないボーンとむすびついてしまうことがあります。
（多分、普通の人体ではなくロボットだったためと思われる）

今回はパシフィック・リムの主人公機、ジプシー・デンジャーのモデルデータが配布されていたのでそれを利用しています。
そのため、元々のモデルの状態がボーンと近かったりするので、関連付けなどで問題が出ました。

###ボーンと頂点は、Vertex Groupsで紐づく

なぜボーンを動かすと頂点が動くのでしょうか。理由は、ボーンひとつに対して「どの頂点郡が連動するか」というのを連携しているためです。

リアルな人間も、骨が動くことで筋肉や皮膚などが一緒に動きますよね。
それと同じです。

このボーンに対応する頂点はどれか、という紐付けが内部的に保持されているため、想定通りに動くのです。

さて、ではどこで設定されたのか。
それが、上記の「With Automatic Weights」です。
これを実行したあと、適当にメッシュを選択してもらうと「Vertex Groups」にボーンと同名のものがずらっと並んでいることに気づくと思います。

![vertex-group.png](https://qiita-image-store.s3.amazonaws.com/0/5616/3bbb9653-8811-e2fe-1386-42246c97f648.png "vertex-group.png")


この、ボーンと同名の頂点グループが、ボーンが動いた際に一緒に動く頂点、ということになります。
なのでとあるボーン名に対して、本来想定していない頂点が含まれてしまっていると、当然、そのボーンが動いた際に動いてほしくない頂点まで動いてしまう、ということになるのです。

![wrong-vertex-groups.png](https://qiita-image-store.s3.amazonaws.com/0/5616/186f7e41-fc55-fed8-60d2-509d3a6654f3.png "wrong-vertex-groups.png")
上記画像は、DEF-head頂点グループに登録されているメッシュの選択（Select）を行ったのに、頭ではなくその後ろの装甲が選択されてしまってる。つまり、頂点の登録が間違っている。


なので、想定していない頂点が含まれてしまっている場合はその頂点をグループから削除してやる必要があります。
これは結構めんどくさい処理なのでちまちまやっていくしかない（と思っています）のですが、手順としては

1. 想定していない頂点が動くオブジェクトを選択
2. Edit modeでメッシュ編集状態にする
3. ひとつひとつVertex Groupsを選択し、「select」ボタンを押す(※1)
4. 想定していない頂点が含まれている場合は、それを「Remove」する（例えば、足のメッシュを選択しているのに、「hand」などと書かれた頂点グループの「select」を行ったのに選択されてしまう場合は当然違う頂点が登録されていしまっている）

※1…頂点グループ名の下に「Assing」「Remove」「Select」「Deselect」が並んでいますが、これは現在選択中のグループ（サンプルではDEF-head）に対して、3D Viewで選択されているメッシュをどうするか、というものです。
Assingが選択されているメッシュを頂点に登録、Removeが削除。
Selectは現在選択中の頂点グループにアサインされている頂点を選択します。Deselectは逆に、現在選択中のメッシュから、頂点グループに登録されている頂点を非選択にします。

上記の対応をすることで、想定通りにモデルを動かすことができるようになると思います。