【Blender2.9】オブジェクトを簡単制御!ドライバー入門

Blender

はじめに

こんにちは!

今回はBlenderでオブジェクトを操作してアニメーションを作るのに非常に便利「ドライバー」について紹介したいと思います!

こちらの記事は、(私も含めてですが)Blenderのドライバーを触ったことのない方を対象とした入門向けの内容になっています。

ドライバーを応用した本格的なリギングの方法については、あらためて別の記事で紹介する予定です!

ドライバーとは?

ドライバーは、関数または数式を使用してプロパティの値を制御する方法です。

出典:Blender 3.1 Manual アニメーション&リギング ドライバー はじめに

「関数」「数式」と言うと難しく聞こえるかもしれませんが、「あるオブジェクトのプロパティ(座標・スケールなど)「他のオブジェクトの位置」や「フレーム数」などでコントロールできる」ということです。

たとえば、こちらのようにモンキーのZ座標に、立方体のX座標と連動させるドライバーを設定することで、立方体の左右の動きに合わせてモンキーを上下に動かすことができます。

設定方法・使い方

まず、ドライバーの設定方法について簡単に説明していきます!

ドライバーの設定方法

まず、画面右下の「オブジェクトプロパティ→トランスフォーム」を選択します。

(もしくはショートカットキー「N」→「アイテム→トランスフォーム」でもOKです。)

ドライバーを設定したいプロパティの値を右クリックし、「ドライバーを追加」を選択します。

すると、こちらのようにドライバーの設定画面ウインドウが表示されます。

ドライバーの設定画面では、以下①~③の設定ができます。

①~③の内容について詳しく説明します。

①タイプの選択

ドライバーのタイプを「スクリプト型の式」「平均値」「合計値」「最小値」「最大値」から選択できます。

今回は「スクリプト型の式」に絞って説明します。

②数式の入力

ドライバーを定義する数式を入力します(①で「スクリプト型の式」を選択した場合)。

数式の書き方は、「Python」というプログラミング言語に準拠します。

たとえば「+(プラス)、ー(マイナス)、×(かける)、÷(割る)」は “+, -, *, / “といった形で書き表します。

あとで代表的なものをいくつか紹介しますが、いろんな関数を使えます

ちなみに、「selfを使用」をチェックすると「操作されるオブジェクト自身を”self”という変数で表現できる」そうですが、今回は使用しません。

③入力値の選択

以下のように、ドライバーの入力値の「タイプ」「名前」「オブジェクトID」「変数タイプ」「座標系」を設定します。

  • 入力値のタイプの選択
    入力値のタイプを「単一のプロパティ」「トランスフォームチャンネル」「回転差異」「距離」から選択できます。
    今回は「トランスフォームチャンネル」に絞って説明します。
  • 入力値の名前の入力
    入力値の名前を指定します。
    デフォルトでは”var”となっていますが、複数の入力値を使用する場合は、わかりやすいように「cubex」など名前をつけるとよいでしょう。

    “-(ハイフン)”など数式で使用する記号は入力値の名前に使えません。
  • 入力値のオブジェクトIDの選択
    入力値の参照先のオブジェクトを選択します。
  • 入力値のドライバー変数タイプの選択
    入力値の変数タイプを選択します。
    「X,Y,Z位置」「X,Y,Z,W回転」「X,Y,Z,平均スケール」から選択できます。
  • 入力値のスペースの選択
    入力値の座標系を選択します。
    「ワールド空間」「トランスフォーム空間」「ローカル空間」から選択できます。
    今回の記事のような簡単な例であれば、デフォルトの「ワールド空間」からのままで変更不要です。

このようにドライバーにはいろいろな設定項目がありますが、今回示す簡単な例については、基本的にデフォルト設定のままでOKです。

ドライバーエディターについて

ドライバー設定画面のウインドウは、マウスカーソルがウインドウの外に出ると閉じてしまいます。

こちらのように、ドライバー設定画面で「ドライバーエディターに表示」を選択するとドライバーエディターの画面上で編集できるようになります。

「ドライバーエディター」の画面は、マウスカーソルが外に出ても消えないので、複雑な数式を入力するときなどはドライバーエディターを使った方が良いと思います。

「#」を使って直接ドライバーを追加する

ドライバーの設定画面やドライバーエディターを使わずに、こちらのようにプロパティに「#(数式)」と打ち込むことで、直接ドライバーを追加することもできます。

ドライバーのコピー・貼り付け

ドライバーはコピペできます!

こちらのようにドライバーを右クリックして「ドライバーをコピー」し、他のパラメータや別オブジェクトを右クリックで「ドライバーを貼り付け」します。

複数のオブジェクトを一緒に動かしたいときなどに便利です。

ドライバーの削除

ドライバーを削除するときは、右クリックで「ドライバーを削除」を選択します。

ドライバーが消されずに残っていると意図しない誤作動が起きる可能性があります。
新たにドライバーを設定し直す時は、一度ドライバーを削除してから設定するクセをつけましょう。

使用例:他のオブジェクトを回転させる

ドライバーを使って、自動車の車輪を回転させる方法を紹介します!

ドライバーの使い方を覚えるには実際に手を動かしてみるのも大事なので、ぜひマネしてみてください!!

(ドライバーを設定する前に、「モデリング」と「ペアレント設定」が必要なため、まずは前置きとしてその説明をさせてください。)

モデリング

まず、立方体(Blenderを立ち上げたときに表示されている「デフォルトキューブ」でOKです)を使って、こちらのようにこのように「ループカット」や「押し出し」等を使ってボディを作ります。

(ボディの形は特にドライバーに影響ないので、立方体をX方向に伸ばすだけでもOKです。)

つぎに、円筒メッシュを追加してこちらのようにタイヤを作ります。

回転が分かりやすいように、タイヤの一部の色を変えておきます。

マテリアルを設定したら、こちらのようにタイヤを複製して車体の四隅に付けます。

↑で説明した手順で作ると、このような形になると思います。

ですが、ドライバーはどんな形状でも動くので、車は↑の方法にとらわれず好みの形状にモデリングしてしまって構いません。

ペアレント設定

車輪にドライバーを設定する前に、ボディを車輪のペアレントに設定します。

こちらのように、車輪を4つ選択したあと、ボディを選択「Ctrl+P」でペアレント設定します。

すると、車輪がボディに追従して動くようになります。

ドライバーの設定

やや前置きが長くなってしまいましたが、下準備が完了したところでいよいよドライバーを設定します!

まず左側の前輪を選択してオブジェクトプロパティを選択し、「回転Y」の数値を右クリックして「ドライバーを追加」を選択します。

ドライバー設定画面で、「式」はとりあえずそのままにしておき、「オブジェクト」車のボディ(“Cube”)を選択します。

車のボディの位置Xに合わせてタイヤを回転させたいので、「タイプ」「X位置」のままでOKです。

自動車をX方向(画面左側)に動かすと、ボディの動きに合わせてドライバーを設定したタイヤが回転します。

↑だと少しタイヤの回転が少ないので、ドライバーを編集して回転量を調節します。

「式」を「var + 0.0」から「1.5*var + 0.0」に変更して、回転量を1.5倍にしたところタイヤの動きが自然になりました。

左前輪の「回転Y」を右クリックし、「ドライバーをコピー」を選択します。

その後、左後輪の「回転Y」を右クリックし、「ドライバーを貼り付け」でコピペします。

すると、こちらのように左後輪左前輪と同じ動きをするようになります。

右側のタイヤは、そのまま左側のタイヤのドライバーを貼り付けると、こちらのように進行方向と逆向きに回転してしまいます。

これは、モデリングのときにZ軸回りに180°回転させたために「トランスフォーム回転Z」が180°になっているからです。

なので、こちらのようにドライバーの式に符号「-」を追加するか、右側の車輪を選んで「Ctrl+A」→回転を適用すると車の進行方向に回転するようになります。

右後輪も同じように設定し、自動車のX位置にキーフレームを打つことで、このような自動車の走行アニメーションを作ることができました

ちなみに、車輪のドライバーの引数にボディのZ回転を設定することで、こんな風にぐるぐる周回するパスアニメーションを作ることもできます。

パスアニメーションの作り方については、こちらのチュートリアル動画等を参考にしてみてください!

#12 悪魔のBlender入門 カーブを使ったカメラワーク Blender2.8

代表的なドライバー変数・関数とその使用例(blender ドライバー 変数/関数)

つぎに、代表的なドライバーの変数・関数を紹介します!

フレーム数を表す変数frame

変数”frame”は現在のフレーム数を出力します。

時間経過に合わせてアニメーションを付ける場合に便利です!

たとえば、こちらのようにオブジェクトのX位置に”frame”と打ち込むとフレームの経過に合わせて移動します。

また、三角関数と組み合わせることで、こちらの例のように点滅(放射シェーダーの強さ)や振動(オブジェクトの位置・回転など)などを表現することができます!

ランダムな値を出力する関数noise.random()

関数”noise.random()”を使用することによって、フレームごとに(0~1の間で)ランダムに値を変化させることができます

たとえば、こちらのように時間経過に合わせてオブジェクトの大きさをランダムに変化させることができます。

noise.random()を使用すると、こちらのようなエラーメッセージが出ることがあります。

「実行可能にする」を選択してもこちらのように「無効なPython式」というエラーメッセージが出て動かないことがあります。

そのようなときは、ファイルを保存した後同じファイルを再度立ち上げ直し、もう一度「実行可能にする」を選択すると(式に間違いがなければ)ドライバーが動きます。

場合分けの式[if, else]

場合分けの式”(A) if (C) else (B)”によって、「条件(C)ならば(A)、それ以外なら(B)」という条件による出力結果の分岐ができます。

場合分けの例として、こちらのモンキーにまばたきをさせてみます。

まずはこちらのようにモンキーにシェイプキーを追加します。

つぎに、シェイプキー「key1」が選択された状態で編集モードに切り替え、まばたきをしている状態を表現するようにモンキーのまぶたの頂点を移動します。

このとき「押し出し」などで頂点数を変更してはいけません。

追加したシェイプキーを右クリックして、こちらの数式をドライバーとして設定します。

1 if noise.random() < 0.07 else 0

すると、こちらのようにモンキーがランダムなタイミングでまばたきします。

その他の関数・数式

↑で紹介した例はごく一部ですが、他にもいろいろな関数・数式をドライバーとして使えますので、ぜひ試してみてください!

使える関数・数式の一覧は、こちらの記事を参照ください(Blender 2.83のものです)。

Blender のドライバー Tips

ドライバーの応用について

冒頭で少し書きましたが、ドライバーは本格的なリギングにも応用することができます。

ドライバーを使ってシェイプキーの値をボーンの動きに合わせて変化させることで、ボーンアニメーションと同時に表情のアニメーションを制御することが可能になったり、腕の曲げに合わせて筋肉を収縮するような変形も可能になります!

ドライバーを使ったリギングの方法については、改めて別な記事で紹介いたしますので、ご期待ください!

注意点

ドライバーを使う上で気を付けなければいけないポイントがいくつかあるのでご注意ください!

使える式と大文字・小文字の違いに注意!

さきほど書いたように、ドライバーの式はPythonの文法に従って書く必要があります。

また、こちらのように式の大文字と小文字を間違えると動かなくなるのでご注意ください。

コンストレイントとの干渉に注意!

オブジェクトコンストレイントが設定されていると、ドライバーが意図した動きをしないことがあります

たとえば、モンキーの回転Zにドライバーを設定した場合、こちらのように「回転制限」コンストレイントがかかっていると、回転はコンストレイントの制限を受けます。

複雑なリグだとこういう現象がよく出てくると思うので、要注意ですね。

Unityなど外部ソフトへはエクスポートできない

残念ながら、ドライバーはBlenderの内部でしか使えません

Unityなど外部ソフトへはエクスポートできないのでご注意ください。

Blenderで設定したドライバーを外部ソフトで使えるようにする方法が見つかったら、別の機会に紹介したいと思います!

まとめ

Blenderのドライバーの機能についていろいろと紹介しましたが、いかがだったでしょうか?

本記事の内容が、「ドライバーって何?」「ドライバーで何ができるの?」「ドライバーが動かない」といった疑問の答えになってくれればうれしいです。

先ほど書いたように、ドライバーを使いこなすにはある程度慣れが必要だと思うので、ぜひ今回紹介した例を参考にアニメーションを作ってみてください!

最後に、今回のまとめです。

  • ドライバーとは「関数または数式を使用してオブジェクトのプロパティを制御する」方法
    • 「あるオブジェクトのプロパティ(座標・スケールなど)を「他のオブジェクトの位置」や「フレーム数」などでコントロールできる
    • 使用例:自動車のタイヤの回転
  • 代表的な関数・式 と使用例
    • frame:フレーム数を出力する
    • noise.random():フレームごとに(0~1の間で)ランダムに値を変化させる
    • [if,else]:条件によって出力結果を分岐する
  • 注意点
    • 数式の書き方、小文字・大文字の違い
    • コンストレイントとの干渉
    • Unityなどにはエクスポートできない

コメント

タイトルとURLをコピーしました