Doc:JA/2.6/Manual/Animation/Editors/Graph/Drivers
Page status (reviewing guidelines)
Copy This page is a copy of the same page in 2.4 manual, need to be updated Text
partially
|
ドライバ
ドライバは、あるプロパティのアニメーションを他のプロパティの値によってコントロールするために使います。つまり、そのアニメートされる値はフレーム番号でコントロールされるのではなく、特定のチャンネルにコントロールされます。ドライバが使えるのは、何らかの単一のプロパティや、回転の差や、Blender上でも編集できるPythonスクリプト等です。
たとえば、ドライバのX位置を使ってマテリアルの色(RGBカーブ)をコントロールしたり、ドライバの回転を使ってオブジェクトの拡大縮小をコントロールしたり、ドライバの拡大縮小を使ってメッシュやカーブの形状を(シェイプキーを介して)コントロールしたり、Pythonの関数でコンストレイントの影響をコントロールしたり…もっともっといろんなことができます。
一つの効果的な使い方は、キャラクターアニメーションでの使用です。たとえば顔のシェイプキーに対してドライバを追加し、そのドライバオブジェクト(もちろんこれはレンダリングされないように設定します)を動かしてキャラクターの表情を操作することができます。NLAエディタと少し似ていますが、よりわかりやすいでしょう。シェイプキーをドライブするを参照。
ドライバのインターフェースや機能はF-カーブに似ていますが、ドライバはアニメーションシステムのヒエラルキーにおいてアクションの外側に位置しています。ドライバはアクションの後で評価されるので、アクションに関わるどんなF-カーブもドライバの効果に上書きされます。
マッピング
ドライバで使われるカーブは時間に支配されているのではありません(これは力説しておきます。非常に重要なことなのでよく理解してください)。ドライバのプロパティの変更(X軸上)に応じて、カーブのどの位置の値(Y軸上)が適用されるかが決まります。
デフォルトでは、入力と出力はGenerator F-カーブモディファイアによって一対一にマッピングされています。このモディファイアを削除して、グラフエリアにCtrl + LMB でキーフレームを追加すれば、好きなマッピングを作れます。
ドライバの作成
ドライバを作成するには、まずドライブする属性をプロパティパネルで見つけます。これが、他の属性によってドライブされる属性となります。
チャンネル上でRMB クリックして、いかのオプションの一つを選択してください。
- Add Drivers
- 選択したチャンネルに関連するチャンネルすべてにドライバが作られます。たとえば、X、Y、Z方向の移動に対してそれぞれドライバが作られます。
- Add Single Driver
- 選択したチャンネルのみに対してドライバが作られます。
ドライバの編集
ドライバを作成したらそのチャンネルが何によってどのようにドライブされるかを決めなくてはいけません。
ドライバエディタはグラフエディタの中にあります。ヘッダのメニューで、F-カーブエディタビューからドライバビューに切り替えられます。
ドライバエディタは現在のシーン内にあるすべてのドライバを表示します。左側のチャンネル欄に表示されます。
シーンの中に複数のドライバがある場合、グラフエリアでの表示/非表示を切り替えられます。また、特定のドライバを編集するにはそれを選択する必要があります。
ドライバプロパティ
ドライバのプロパティは右側のプロパティパネル(デフォルトでは隠されています。Nで表示されます)にあります。
- Update Dependencies
- ドライバの接続を更新します。
ドライバの種類
ドライバにはいくつかの種類があります。ドライバの入力値がどのように計算されるかが異なります。
- Maximum Value
- ユーザ変数の最高値をとります。
- Minimum Value
- ユーザ変数の最低値をとります。
- Sum Values
- ユーザ変数の合計値をとります。
- Averaged Values
- ユーザ変数の平均値をとります。
- Scripted Expression
- Pythonによる記述にしたがって値を計算します。これはユーザ変数を自在に使える方法でもあります(後述)。
変数
ユーザ変数はドライバの入力値を計算するものです。スクリプトを使う場合以外は、少なくとも一つの変数が必要です。一つの変数を使うと、スクリプト以外のすべての種類のドライバは同じ値を生み出します。
単一プロパティ
シーン内のあらゆるものの中からデータブロックを呼び出すにはSingle Propertyを使います。これはランプの強度でもいいし、テクスチャのカラーでもいいです。
座標変換チャンネル
このタイプはオブジェクトの座標変換プロパティを通じてカーブをコントロールすることができます。つまり、一つのドライバで9つのカーブを別々にコントロールできます(XYZそれぞれの位置、回転、拡大縮小)。
オブジェクトドライバを設定するには、
- ドライブしたいチャンネルを選択する。
- OB欄が現れるので、ドライバオブジェクトの名前を入力する。
- ドライバがアーマチュア以外の場合、Driver typeのドロップダウンリストからはObjectのみが選べる。
- 最後に、二つ目のドロップダウンリストでカーブをドライブするためのプロパティを選択する(Loc X、Scale Zなど)。
これでカーブは時間にコントロールされるのではなく、選んだプロパティによってコントロールされます。値はBlender単位です。
ドライバのプロパティはローカル座標で評価されることに注意してください(親オブジェクトの座表変換には影響されません)。
例
これからの例では、よく知られた猿の頭(Susanne)のサイズを、Emptyをドライバとしてコントロールしてみます。まず、SusanneオブジェクトのScaleX、ScaleY、ScaleZチャンネルにAdd Driverでドライバを追加します(カーブがまだ存在しない場合は、自動的に作られます)。今の時点では、まだカーブがないので、Blenderは直線的なカーブがあるかのように一対一のマッピングをします(下の画像での破線)。これはまた同じドライバのプロパティ(この例ではY位置)をいくつかの違ったドライバに使えることを示しています。
下図ではカーブエディタウィンドウはSuzanneのカーブに表示固定されているので、Emptyオブジェクトを移動しながらドライバカーブを見ることができます)。 |
では、ドライバのカーブを基本的な一対一のマッピングより複雑にしてみましょう。下図に示されているのは上と同じシーンですが、今回はScaleYチャンネルが1.0から-1.0の間で反復する擬似サインカーブになっています。これは三つの制御点とCyclic補外で作られています。SuzanneのX方向とZ方向の大きさは依然としてEmptyオブジェクトのY位置を直接的に反映していますが、Y方向の大きさは下図のようにEmptyオブジェクトの移動とともに反復的に変わるということです。
回転の差
回転の差はボーンの場合だけ使えますが、オブジェクトの場合とほぼ同様です。
ボーンをドライバとして使うには、OB欄にアーマチュアの名前を入力し、Driver typeのリストからPoseを選択します。そして現れたBO欄にボーンの名前を入力し、使用するプロパティを選択します。
以下の特徴に注意してください。
- 座標変換はそのボーンの空間で評価されます(親ボーンやオブジェクトそのものの座標には影響されません)。
- 回転をドライバに使う場合、制限に気づくでしょう。ボーンの回転は常に
[-180°, 180°]
の範囲にマッピングされます(つまり、180°を超えて回転させると、-180°に値が飛び移ります)。 - 特別なドライブプロパティが使えます。{Literal|Rotation Difference}}は他のボーンの名前を入力すると、そのボーンとドライバボーンの角度の差をドライブに使用します。
距離
距離モードは二つのオブジェクトまたはボーンの間の距離を使います。
式ドライバ
Python式ドライバ(略してパイドライバ)は、他のオブジェクトのプロパティを使う代わりに、一行のPythonによる式を入力に使います。明確な値が計算できるならどんな記号でも使えます。
パイドライバによってコントロールするのは、カーブそのものではありません。他のタイプのドライバと同じように、カーブ上のどこの値を使うかということをコントロールします。
パイドライバを使うには、ドライバタイプをScripted Expressionに変更します。すると標準的なテキスト欄が現れるので、そこにPython式を入力します。
このドライバには面白い可能性がたくさんあります。数式やプログラミングを使ってオブジェクトをアニメートすることができるのです。唯一のルールは、パイドライバの表現は最終的には実数値を生み出さなければいけないということです。たとえば文字列などではいけません。
オブジェクトが特定の点の周りで往復するようにサインまたはコサイン関数を使うこともできるし、拡散、RGB,アルファなどをランダムな数値で変えることもできます。
パイドライバの評価は、内蔵のeval()関数の結果と同じです。ただしパイドライバでは結果として実数を返さなければならないという制約があります(あらゆる種類の数値は自動的に浮動小数点数にキャストされます)。
Valid Expressions
(訳注:Blender 2.6現在ではAPIが大幅に変更されているので、以下の式は動かないものが多いです。最新の情報を参照してください)
We’ve already told the basics: there is a text field where you can type an expression in Python. Here are some examples of valid expressions:
- Any real value:
1 1.0
- Expressions with numbers and operators:
1 4.5 + 8.9 * 7.0 - (2 / 3.0)
- Expressions also with variables:
1 math.pi * 2 + 5.0
- Available data:
1 Blender.Get("curframe") # the current animation frame
- A little math:
1 math.sin(Blender.Get("curframe")) # the sine of the current frame
- Using the animated (driven) object, available as
self
:1 self.LocX * 10
Builtin resources and aliases
Pydrivers use their own global dictionary that is cached and only gets recreated when any expression fails. In this dictionary, a few modules are pre-imported, so that they can be used inside pydriver expressions.
Note
To save typing and keep expressions smaller, we’ve added aliases for each module: Blender can be referenced as “
Blender ” or simply as “b ”. Below, each module is followed by its available aliases. |
- All from
builtin
(the defaultbuiltin
module) Blender
:blender
,b
Blender.Noise
:noise
,n
math
:math
,m
Example expression:
1 m.cos(m.pi * b.Get("curframe") / n.random())
Aliases were also added for a few commonly needed data:
ob(name)
is equivalent toBlender.Object.Get(name)
me(name)
is equivalent toBlender.Mesh.Get(name)
ma(name)
is equivalent toBlender.Material.Get(name)
Example expression:
1 ob("Cube").LocX + ob("Lamp").RotZ
The pydrivers.py Blender text
Besides the above modules, if there’s a Blender text buffer called “pydrivers.py
” loaded in the Text Editor, it’s also imported:
pydrivers
:pydrivers
,p
This allows users to create their own functions and add their own variables without the restriction of the one-line Python expression. For example, if your pydrivers.py text looks like this:
1 myvar = 10.0
2
3 def myfunction(arg):
4 # do something fancy here
5 return float_val
You can access both myvar
and myfunction
inside any expression:
1 p.myvar * p.myfunction(2) - 1
Note: if you make updates to the pydrivers.py
text, go to the Curve Editor window and click in any pydriver’s text input box (in the Transform Properties panel), then click out of it or press ↵ Enter, to force reloading the pydrivers.py
module and to update all pydrivers at once.
Example
Let’s say we want to give our Suzanne
a perfect two BU radius circle movement in the (XY) plane. This is not easy to achieve with standard curves, as you have to create perfect sinusoidal ones (for those who lost their math, a perfect circle in a Cartesian plane is obtained with x = sin(t)
and y = cos(t)
…). So let’s use Python drivers:
The sin()
and cos()
math
functions take as input a radian value (i.e. a cycle takes 2π
frames to complete), and output a value in range [-1.0, 1.0]
. So, to get a 2BU radius circle fully walked in 50 frames (two seconds in PAL videos), we have to use the following Python expression:
- For LocX:
1 2.0 * math.sin(Blender.Get("curframe")*math.pi/25)
- For LocY:
1 2.0 * math.cos(Blender.Get("curframe")*math.pi/25)
Now, Suzanne
will go in endless circles around the world’s origin (if you want to make it turn around another point, just add an offset to the above expressions, or drive dLoc… curves…).
Note that:
- In the above example, we did not use F-curves.
- You can also get a perfect circular movement by using a NURBS circle curve as a path…
Links
- The Blender 2.49 Python API reference and the chapter on extending Blender with Python.
- Python and its documentation.
- This might be a good hunting ground for those looking for functions to try with pydrivers: http://functions.wolfram.com/ (newcomers are recommended to start with elementary ones, specially trigonometric).
- Finally, the patch tracker entry, with patch and sample .blend files for pydrivers: right here.