Blenderで複数ボーンの一括制御をしてみる（ドライバを使ったExpression）

Blenderで１体のモデルを操作するのは簡単なんですが、まとめて複数のモデルを制御したいとなると、ちょっと面倒です。

スクリプト書くほどではなくて、一つの何かを操作すると連動して他の何かが動く的な機構があればよいので探してみた所、ドライバという機能があることがわかりました。

というわけで、ちょっとドライバいじってみました的な記事になります。

## シンプルに立方体に骨を入れる
+ 実験用に、立方体を10分割ぐらいして、骨を3段にして入れます。
![2014-12-06_221025.png](https://qiita-image-store.s3.amazonaws.com/0/32778/23b6f088-ba3e-e8aa-a332-20788c70ef41.png)

+ 骨を立方体の真ん中にセットして、両方選択して自動ウェイトで親子設定します。（[ctrl]+[p]）
![2014-12-06_221107.png](https://qiita-image-store.s3.amazonaws.com/0/32778/cf81ce29-52e7-c19c-efb5-a2019321215c.png)

+ ポーズモードにして、曲がることを確認します。
![2014-12-06_221124.png](https://qiita-image-store.s3.amazonaws.com/0/32778/22bc36f4-0d19-e13a-2c09-c22157fba51b.png)

## コピーして３つにする。
+ 今作成した骨付き立方体を３つコピーします（以下１つ１つをインスタンスと呼びます）。ポーズモードで動かした部分は一旦元に戻しておいてください。（コピーしてから戻すと面倒なので、戻してからコピーします）
![2014-12-06_221335.png](https://qiita-image-store.s3.amazonaws.com/0/32778/a93d6819-db9d-6401-ec19-24069f84c381.png)


## ドライバを追加する
+ 右のインスタンスをポーズモードにして一番上の骨を選択します。3Dビュー右側のトランスフォームで、回転のところを修正します。「クォータニオン(WXYZ)」となっているところを「XYZオイラー角」に変更してください。
![2014-12-06_221335.png](https://qiita-image-store.s3.amazonaws.com/0/32778/32a4a30a-2e55-8e50-e78c-287a6499e5a1.png)

+ それから回転のXYZの入力部分で右クリックします。メニューが出るので、ドライバーを追加を選択してください。
![2014-12-06_221343.png](https://qiita-image-store.s3.amazonaws.com/0/32778/23d5c864-7c95-8336-4541-a8a887755684.png)

+ 回転のXYZが紫色になればドライバが追加されています。真ん中と左のインスタンスも同じ操作をしてください。
![2014-12-06_221351.png](https://qiita-image-store.s3.amazonaws.com/0/32778/d650ffb1-6bbd-2bb8-646b-20b072dfd401.png)

+ インスタンスの上にコントロール用の骨を作成します。名前をcontrolとしてください。
![2014-12-06_221700.png](https://qiita-image-store.s3.amazonaws.com/0/32778/f9dfcb3e-551a-39e4-a6b6-7b81a6774aab.png)

## ドライバを設定する
+ インスタンスのアーマチュア部分を３つとも選択します。（右のアウトライナーから選択したほうが楽です）　その後、グラフエディター画面に変更します。
![2014-12-06_223810.png](https://qiita-image-store.s3.amazonaws.com/0/32778/9ed22aaf-e1a0-a0ea-6d24-e6e2199856f2.png)

+ 表示された画面下部の、「Fカーブ」となっているところを、「ドライバー」に変更します。グラフエディター画面のプロバティが開いていない場合は、[N]キーか画面右上の[+]ボタンをクリックしてください。
![2014-12-06_223928.png](https://qiita-image-store.s3.amazonaws.com/0/32778/d180879f-3cf6-f42c-3d66-30682face884.png)

+ さきほどドライバとして追加した内容が左側に出てくればここまでは成功です。
![2014-12-06_223947.png](https://qiita-image-store.s3.amazonaws.com/0/32778/732042d8-fae1-3d6a-3fea-62b2ce8d69bb.png)

+ さて、それでは連動させるための設定を行っていきます。今は「アーマチュア」の「ドライバ」の「Xオイラー角回転」というパラメータが指定されています。まず、プロバティ部分を下にスクロールします。
![2014-12-06_224909.png](https://qiita-image-store.s3.amazonaws.com/0/32778/b07b9ace-1f45-c25d-5c50-dd123cbac9df.png)

+ 「ドライバー」の「タイプ」の下の「値」となっている部分（0が入っている部分）を変更します。「変数を追加」というボタンの下に、「var」という文字があります。この文字が変数になります。0となっている「値」の0を消して、「var」と入力します。これで「アーマチュア」の「ドライバ」の「Xオイラー角回転」に今まで固定値の0という値が登録されていましたが、変数の値が入るようになります。
![2014-12-06_225004.png](https://qiita-image-store.s3.amazonaws.com/0/32778/4b1b51de-ecbb-fe42-72da-e89eaa1f7d90.png)

+ 次にvarという変数に入る値を設定します。（※少しプロバティが狭かったので少し広げました。）赤くなっているオブジェクトをクリックすると、リストが出てきますのでcontrolを選択します。またその下の空っぽの枠をクリックするとリストが出てきますのでboneを選択します。その下のタイプと空間には、X回転、ローカル空間と指定してください。これで、varの値は、controlというオブジェクトのboneのローカル空間のX回転パラメータにすることができました。
![2014-12-06_225112.png](https://qiita-image-store.s3.amazonaws.com/0/32778/4dda3242-6ac6-7601-f4dc-cbdb2a6bd3c8.png)

+ 以下同じ用に、Yオイラー角回転はY回転に、Zオイラー角回転はZ回転にそれぞれ設定します。アーマチュア.001及びアーマチュア.002についても同様に、0->var、controlの設定をします。
![2014-12-06_225716.png](https://qiita-image-store.s3.amazonaws.com/0/32778/2716fae3-1d81-44c5-f14a-39336c44f871.png)

## 3Dビュー空間で動きを試す
+ 3Dビューに戻って、動きを確認してみましょう。controlを選択して、ポーズモードにします。
![2014-12-06_230102.png](https://qiita-image-store.s3.amazonaws.com/0/32778/16b8ed41-783e-0e0d-1e03-44539663e998.png)

+ boneを回転させてみます。controlのboneを回転させると、下の３つに設定されたドライバがそれぞれの骨の回転パラメータを変更します。それにつられて、立方体も動くという動作になります。controlの動きに連動していれば設定完了です。
![2014-12-06_230111.png](https://qiita-image-store.s3.amazonaws.com/0/32778/b62d1bfb-632d-3c15-ac37-cadf649dcf00.png)

## この記事を見ている人が疑問に思いそうなQ&A
Q.なぜパラメータを設定する時にクォータニオンからXYZオイラー角に変更したのか。またドライバでローカル座標に設定したのはなぜか。

A.クォータニオンで連動させるための選択肢がなかったので、あらかじめオイラー角に変更した。ドライバでローカル座標にした理由は、ワールド座標にしてX回転パラメータを連動させようとすると、なぜかcontrol側が0の時でも相手側（インスタンス側）に90度という値が入ってしまい、見た目が変わってしまうため。ローカル座標にするとそのような挙動はなかったので、とりあえずよしとしている。

## まとめ
スクリプトが使えると、100個のインスタンスについて100回ループまわして全部のパラメータを変更して…とかやってしまいそうですが、ドライバを使うと１つのパラメータ変更で連動させることができるので、使いどころが多そうな機能ですね。

Blender Advent Calendar 2014、明日はmoongearsさんです!