LightWave 3D チュートリアル

 

パート VII: 車輪

パート VII: 車輪

このチュートリアルの最終章では、車輪の回転を自動化していきます。ヘリコプターは地上の直線だけを進む場合には、簡単に自動化できますが、離陸する場合もあります。この場合、ヘリコプターが地上に存在する間のみ、車輪を回転させたいですね。離陸すると同時に、車輪は緩やかに停止するようにします。このために、"条件"または"コントロール"エクスプレッションを使用することにします。パート IV パート VI で得た知識を使い、条件エクスプレッションと結び付けていきましょう。

地上

地上の車輪の動きに対する基本的な考え方として、外周の方程式を使います。

円周 = PI*直径

これに地上で移動する距離を結び付けていきます。ヘリコプターは直線状にのみ移動するわけですから、MasterNull を使用していくつか水平のキーフレームを、正しい方向へと作成していきましょう。以下のキーフレームを MasterNull に対し設定してください:

フレーム

0

90

109

200

MasterNull.Position.X

-0.5m

-0.5m

0.5m

4.98m

MasterNull.Position.Z

-0.5m

-0.5m

0.5m

4.98m

MasterNull.Rotation.H

45

45

45

45

TCB 設定

(0,0,0)

(0,0,0)

(0,0,0.9)

(1,0,0)

Graph Editor

これは XZ 平面を対角線状に横切る動きとなっています(後ほど、地上から飛び立たせます)。ヘリコプターは109フレームまでは停止状態にあり(その後、パイロットはハンドブレーキを放すのを思い出し)、ヘリコプターは200フレーム(アニメーションの終端)まで動きます。よりリアルに見えるように TCB の値を設定していますが、そこにこだわる必要はありません。ここでは二つのエクスプレッションが必要となります。一つは前輪に対するエクスプレッション、もう一つは後輪に対するエクスプレッションです。前輪と後輪の直径が必要となります:

前輪の直径 = 910 mm

後輪の直径 = 350 mm

ここで数式の登場です。車輪が 360度回転する場合、その距離は円周と一致するわけですから、距離 L を移動した場合には、車輪は 360*L/円周 の角度だけ回転していることになります。直線距離に対してキーフレームを設定していますので( MasterNull を通して)、別の方程式を使用して MasterNull の位置から 距離 L を取得することが出来ます(大昔のギリシャ人が編み出した方程式です):

距離^2 = ( X 軸上の移動距離 )^2+( Y 軸上の移動距離)の^2

"^2"は"二乗"という意味を表しています。MasteNull が移動する X と Y の距離は以下の式で取得します:

X 軸上の移動距離 = MasterNull.pos(Time).x - MasterNull.pos(0).x

Y 軸上の移動距離 = MasterNull.pos(Time).y - MasterNull.pos(0).y

(0フレームからの距離を測定しています)。エクスプレッションとして ( X 軸上の移動距離)^2+( Y 軸上の移動距離)^2 全体を書き込まなくても、LightWave® ではビルトイン関数 vmag(X,Y,Z) が用意されています。この関数は上記と同じ計算を行ってくれる関数です(変数 Z は三次元空間を移動する場合に使用されます) 。ですからエクスプレッションは以下のようになります:

MasterNull の移動距離 = vmag( A,B,0)

A = MasterNull.pos(Time).x - MasterNull.pos(0).x

B = MasterNull.pos(Time).y - MasterNull.pos(0).y

前述のエクスプレッションよりも、はるかに簡単になりましたね。チャンネルエクスプレッションから座標を抜かしたい場合、LightWave® ではベクトルは以下のように定義されています:

MasterNull.pos(Time) =
<MasterNull.pos(Time).x,MasterNull.pos(Time).y,MasterNull.pos(Time).z>

このため、エクスプレッションを更に簡単にすると、以下のようになります:

MasterNull の移動距離 = vmag( MasterNull.pos(Time)- MasterNull.pos(0))

従って、前輪の与えれたエクスプレッションの値を通して、回転値は以下のようになります:

前輪の Pitch 角度 =
360*vmag( MasterNull.pos(Time) - MasterNull.pos(0))/2.8588

定数値 2.8588 は 2.8588 = PI*(前輪の直径)=PI*0.910m として算出されています。後輪に関しては:

後輪の Pitch 角度 =
360*vmag( MasterNull.pos(Time)- MasterNull.pos(0))/1.0996

定数値 1.0996 は 1.0996 = PI*(後輪の直径)=PI*0.350m で算出されました。

上記を統合型エクスプレッションとして適用していきます。統合型のエクスプレッションを使うわけですから、括弧付きのエクスプレッションが使用できるはずですが、不運なことに vmag 関数では括弧付きエクスプレッションの形式ではベクトルを受け付けてくれません。二つの新規エクスプレッション wheelFrontwheelRear を作成し、前述した二つのエクスプレッションを値フィールドに入力してください(エクスプレッションの数式の入力及び適用の方法についての詳細は パート III をご覧ください)。最後に、エクスプレッション wheelFront はチャンネル wheelLeftNull.Rotation.P と wheelRightNull.Rotation.P に、エクスプレッション wheelRearwheelRearNull.Rotation.P チャンネルに適応してください。下の二つの図はこの段階におけるグラフ編集のエクスプレッションの設定を表しています。

Graph Editor
Graph Editor

さあ、それではレイアウトに戻ってフレームスライダを前後に動かし、どのような結果になるか見てみましょう。車輪がきちんと回っており、滑ったりしていませんね。

空中

ヘリコプターが離陸すると同時に、車輪の動きは遅くなり停止するように設定しましょう。これはエクスプレッションとキーフレーム設定を結びつけることによって、実装します。

まずヘリコプターが離陸するために、キーフレームをいくつか追加する必要があります。チャンネル MasterNull.Position.Y に対してキーフレームが作成されているようであれば削除し、以下の値でキーを追加してください:

フレーム

0

160

200

MasterNull.Position.Y

0

0

3.3m

TCB 設定

(0,0,0)

(0,0,1)

(1,0,0)

Graph Editor

160フレームではチャンネル MasterNull.Position.Y の TCB 曲線の傾斜を、必ず 1.0 に設定してください。それ以前のフレームにおいて Y = 0 よりも小さな値にならないようにするためです。

ヘリコプターが地上に存在する場合には、MasterNull.Position.Y = 0 となります(これが地上の"定義"として扱います)。地上に存在する場合、車輪の動きは wheelFront (または wheelRear )の形に沿うエクスプレッションに設定しました。離陸したあとは、キーフレームで動きを付けていきます。つまり変数 Value の値に従うことになります( パート III 参照)(完璧に自動化しようとすると、エクスプレッションの範囲を越えた話となってしまいます)。ここで必要となるのが条件(コントロール)エクスプレッションです。このエクスプレッションは以下のような形式を取ります:

条件 ? motion_1 : motion_2

例 1:Time>5 ? 12 : 20
これは Time が5秒以降であれば、エクスプレッションの値は 12 となり、それ以外であれば 20 となります。

例 2:obj.pos(Time).x <= 25 ? obj.pos(Time).z : Time
これは オブジェクト obj の X 座標位置が 25m 以下であれば、エクスプレッションの値は obj の Z 座標位置の値を、それ以外は現在時刻を取得します。

この形式に従うと、求める前輪のエクスプレッションは:

MasterNull.pos(Time).y > 0 ? Value : A
A = 360*vmag( MasterNull.pos(Time)- MasterNull.pos(0))/2.8588

(*)

後輪のエクスプレッションは:

MasterNull.pos(Time).y > 0 ? Value : A
A = 360*vmag( MasterNull.pos(Time)- MasterNull.pos(0))/1.0996

(**)

となります。スクラッチ変数 A を使用しているため、グラフ編集のモディファイヤタブにあるチャンネルエクスプレッションを使用しなくてはなりませんね(詳細については パート VI を参照のこと)。

  1. まず三つの車輪用ヌルオブジェクトから統合型エクスプレッションを削除していきましょう:
    • エクスプレッションリスト(グラフ編集内部)からエクスプレッション wheelFront を選択すると、エクスプレッションエントリタブにそのエクスプレッションが表示されます。
    • チャンネルビンからチャンネル wheelLeftNull.Rotation.P を選択します(もしチャンネルビンにないようであれば、チャンネルビンの下にあるシーンリスとから、チャンネルビンに持ってきてください) 。
    • エクスプレッションエントリタブにある除去ボタンがハイライトになっていますね。除去ボタンをクリックし、エクスプレッションからチャンネルを解除します(このボタンではエクスプレッション自体を削除するわけではなく、あくまで解除するだけです)。チャンネル名称の隣に表示されていた"ドット"が消えます。
    • 同様にチャンネル wheelRightNull.Rotation.P からエクスプレッション wheelFront を、チャンネル wheelRearNull.Rotation.P からエクスプレッション wheelRear を除去してください。
  2. 次にパネルエントリ形式を使用して、新しい三つのエクスプレッションを作成します。
    チャンネル wheelLeftNull.Rotation.PwheelRightNull.Rotation.P、wheelRearNull.Rotation.P に対して、それぞれモディファイヤタブ(右図参照) からエクスプレッションを追加してください。
    • チャンネル wheelLeftNull.Rotation.P に適用されているエクスプレッション用のチャンネルエクスプレッションパネルを開き、上記のエクスプレッション(*)を入力します。下左図を参照してください。
    • チャンネル wheelRightNull.Rotation.P に適用されているエクスプレッション用のチャンネルエクスプレッションパネルを開き、上記のエクスプレッション(*)を入力します( wheelLeftNull.Rotation.P  用のチャンネルエクスプレッションパネル内にある Copy ボタンを使用し、Paste ボタンで新しいパネルに貼り付ければ、簡単に設定できます)。下左図を参照してください。
    • 最後に、チャンネルwheelRearNull.Rotation.P に適用されているエクスプレッション用のチャンネルエクスプレッションパネルを開き、上記のエクスプレッション(**)を入力します。 下右図を参照してください。
  3. Channel Expression
    Channel Expression

    前輪用エクスプレッション

    後輪用エクスプレッション


  4. チャンネルビンから wheelLeftNull.Rotation.P を選択し、曲線ウィンドウに曲線を表示させてください。Pitch の値は161フレームまでは元のカーブの形状( wheelFront  )に従い、それ以降、突然値が0になっているのがわかりますね。このフレームはまさにヘリコプターが地上を飛び立ったフレームであり、このフレーム以降、エクスプレッションは Value 変数を通して wheelLeftNull.Rotation.P モーションのキーフレーム値を使用しています(ごみが入っていない限り、現在この値は 0 をさしているはずです)。下図にこの様子を表示しています。

    Graph Editor
  5. ここからは簡単で、161フレームにキーフレームを作成し、161フレーム以前の(ドット)曲線に沿うように、値を設定します(これ以前のフレームに設定されているキーフレームの値は、モーションに影響を及ぼしません)。さらに184フレーム目にもキーフレームを作成し、幾分大きな角度に設定します(車輪の Pitch 角度は以前回転しつづけており、値は増加しているものの、その回転速度は遅くなります)。車輪の回転が遅くなり、やがて停止するモーションを設定したいので、最終フレームである200 フレームに、最後のキーフレームを作成します。このフレームの値は 184フレームの値と同じ値にします(TCB 設定を調節して曲線をより滑らかにして下さい。)曲線は水平な状態となり、回転速度に0(または限りなく0に近い)になります。結果は以下のようになります。

    Graph Editor

    同様の処理を wheelRightNull.Rotation.PwheelRearNull.Rotation.P に対しても設定してください。
  6. さあ、レイアウトに戻りフレームスライダを動かして、どういう結果になるかを見てみましょう。車輪はヘリコプターが地上にある間は正しく自動的に動き、離陸すると同時に緩やかに回転が停止していますね。

これでチュートルアルは終了です。少しでも LightWave® エクスプレッションについての理解を深めてもらえれば幸いです。

Cheers,
Richard Brak.

PS 疑問点やご意見などがございましたら、r.brak@richardbrak.net までご連絡ください。