Blenderのドライバーの使い方

## 概要

Blenderのドライバーの使い方を紹介します。
ドライバーとは、あるオブジェクトのプロパティを別のオブジェクトから参照するしくみです。
ドライバーを使うとアニメーションの設定などが便利になります。

以降では具体例で説明します。

## 対象オブジェクト

下図のようなオブジェクトを用意してください。

- 車体（名前は`body`とします）
- 前輪（名前は`tire_f`とします）
- 後輪（名前は`tire_r`とします）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/ae03b772-cf83-7817-bea4-0f24b4533ee9.png" width="300">

ここから、**車体を動かした時に、自動的に車輪が回転する**方法を説明します。

まず、前輪と後輪の親を車体にしましょう。前輪、後輪、車体の順に選択し、`Ctrl + P`（ペアレント）のオブジェクトを選択します。
これにより車体を動かすと車輪も一緒に動きます。

## ドライバーの設定

車体は、y軸の負の方向を向いているとします。ここでは、車体のy座標を使って、前輪のx軸を回転させます（回転させるべき軸はモデルによって異なります）。

まず、車体のy座標のドライバーを作成しコピーします。

- 車体を選択
- `N`（サイドバー）でサイドバーを表示し、アイテムタブを選択
- 位置Yで右クリックし「新規ドライバーとしてコピー」を選択

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/8e5348f0-9e7b-6177-0aaf-eabad0b50b0d.png" width="240">

続いて前輪を選択し、サイドバーの回転Xの位置で右クリックし「ドライバーを貼り付け」を選択します。ドライバーを貼り付けると、下図のように紫色になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/008bd6ed-8018-6687-c4e8-183eb43f61c2.png" width="240">

車体を動かしてみましょう。前輪が回転します。しかし、動きがゆっくりですし方向も逆回転です。

## ドライバーの編集

ドライバーはスカラーの変数として使えます。
位置Yで「新規ドライバーとしてコピー」すると変数名は`location`になります（変更も可能ですが、ここではそのまま使います）。

今回前輪の高さ（直径）は0.333mとします。このとき円周は`πR = π/3`です。
また、ドライバーの値を設定する回転の値の単位は度でなくラジアンにしないといけません。
このことから、`π/3`進んだら`-2π`回転させる必要があります。
すなわち、`location`だけ進んだら、回転は`-6 * location`になります。

ドライバーの値を変えるには、前輪を選択して回転Xで右クリックし「ドライバーの編集」を選択します。下図のような画面が表示されます。

※ 「ドライバーの編集」を使うには、ドライバーが設定されている必要があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/9b027fe2-1e14-734b-9e09-e065399db734.png" width="300">

主な項目を見てみましょう。

- ドライブ対象プロパティ：対象オブジェクトとそのプロパティです。ここでは、対象オブジェクトが`tire_f`で、プロパティがXオイラー角回転ということがわかります。
- タイプ：ドライバーの値の種類です
- 入力値（「入力値を追加」の下の枠内）
    - （項目なし）：変数名（`location`が変数名）
    - プロパティ：変数の元になるオブジェクト
    - パス：変数の値を表すもの。ここでは、オブジェクトの`location[1]`であるy座標になります。

これらのことから、車体（`body`）のy座標（`location[1]`）を、ドライバーの`location`として使えることがわかります。

この状態では、前輪の回転Xの値として`location`が設定されています。値には式を設定できます。そのためには、タイプを「スクリプト型の式」に変えます。
変えると「式」という項目があるので、`-6 * location`に変えます。下図のようになります。

※ 式にはPythonの式が書けます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/8cb0a332-42ca-ccc0-8994-ef57b179c658.png" width="300">

アニメーションをレンダリングして確認すると、下図のようにそれらしく前輪が回転しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/f06d86ee-f872-98c2-19ee-403cbf786fa1.gif" width="500">

## 後輪の設定

後輪も動かしてみましょう。

前輪の回転Xから「新規ドライバーとしてコピー」します。
後輪の回転Xに「ドライバーを貼り付け」します。
これで前輪と後輪が同じように回転します。

ちなみに、ドライバーを削除する場合は、対象を右クリックして「ドライバーを削除」を選びます。

## パスアニメーション

ここまでは、車体がy軸の方向に動く場合の設定をしました。
ここからは、車体が何らかのパスに沿って動く場合の設定を説明します。

まずは、パスとなるカーブを作成しましょう。カーブの種類は何でもいいのですが、ここではベジエを作成してください。
作成したら、名前を`path`にして適当に編集してください。

車体、パスの順に選択し、`Ctrl + P`（ペアレント）の「パス追従コンストレイント」を選びます。

車体のオブジェクトコンストレイントプロパティを以下のように設定します。「前方の軸」が`-Y`に、「カーブに従う」がオンになっています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/3f863088-1699-9947-6469-f395420ba6e0.png" width="300">

※ コンストレイントの設定については、記事「[Blenderで待ち行列](https://qiita.com/SaitoTsutomu/items/1e5c95736876bb97df29)」も参考にしてみてください。

上図のオフセットを`0`から`-100`にすることで、パス上を移動することになります。
したがって、下記の設定をすれば、パスアニメーションで車輪が動くことになります。

- 時刻を開始位置にします。オフセット上で`i`を押し、キーフレームを設定します。
- 時刻を終了位置にします。オフセットを`-100`にし、オフセット上で`i`を押し、キーフレームを設定します。
- オフセットを右クリックし「新規ドライバーとしてコピー」します。

ドライバーの調整をしましょう。
メジャーなどを使ってパスの長さを推定してください。ここでは10mとします。
また、1m進んだら、-6になるようにします。
このことからドライバーには、「-6 * オフセット / -100 * 10」を設定します。
オフセットの変数は`offset`なので、ドライバーの編集で`-6 * offset / -100 * 10`を指定します。

ドライバーを使った例の説明は以上です。

## 補足

車体が一定の速度で動くのであれば、ドライバーを使わずに別々に設定しても問題ありません。
しかし、車体の速度が一定でないならば、別々に設定するのは手間がかかりますし、間違いの元になります。

以上