LightWave 3D チュートリアル

 

パート VI: ロータードループモーフィング

パート VI: ロータードループモーフィング

ヘリコプターの回転翼は、回転していない場合には下へと垂れ下がり、回転しているときには水平(もしくは上向き)の状態にあるのを見たことがありますか?エンドモーフとエクスプレッションを使用して、これと同じ効果を得ることが出来ます。今回はモデリングに関するチュートリアルではありませんから、エンドモーフの作り方については詳細を説明することはありません。ベースオブジェクトとして水平バージョンの回転翼をモデリングし、それにモーフターゲットとして下方へ垂れている回転翼を追加しました。このモーフターゲットの名称は rotorMorph としてあります(翼をまっすぐに直すよりも、下方へたれるようにモデリングする方が、はるかに簡単だからです)。つまりモーフ量が 0% の場合には水平な回転翼、100% の場合には下へ垂れきった回転翼ということになります。また効果がはっきりと表現できるように、少々大げさ気味に下へたれるように作成してあります。

この章における新しい要素として、ドループは回転量ではなく、回転速度によりコントロールするようにします。このためローターの速度を取得する方法を理解しておかなくてはなりません。

最後に、今回のチュートリアルではパネルインターフェイスのエクスプレッションを使用することにします(統合型のエクスプレッションでも同じ結果が得られます)。

 Morph Base
Morph Target
Base(ベース) Target (ターゲット rotorMorph)
  1. Morph Mixer を有効にするために必要となるモーフィングをコントロールするためには
    Morph Mixer
    オブジェクト rotor.6 のプロパティパネルを開き、変形タブの中にある変位プラグインのポップアップから Morph Mixer を選択します。グラフ編集からのみ、モーフ量の調節を行うため、Morph Mixer を開く必要はありませんが、その効果を確認するために、パネルを開きスライダを動かしてみてください。Morph Mixer を追加することにより、 rotor.6 に MorphGroup チャンネルも追加されました。
  2. パネルエントリエクスプレッション
    前述した通り、実例として今回はパネルインターフェイスを通し、エクスプレッションを作成していきます。
    Channel Bin
    グラフ編集を開きシーンリストを見てみると、オブジェクト rotor.6 のモーフ rotorMorph の下に、チャンネル MorphGroup があるのがわかりますね。では rotorMorph をチャンネルビンへとドラッグしてください。また同様にチャンネル pedalChainGearNull.Rotation.P もチャンネルビンへとドラッグしてください。そうしたらチャンネルビンの中からチャンネル rotorMorph を選択し、曲線ウィンドウの下にあるモディファイヤタブをクリックしてください。モディファイヤ追加ポップアップから Expression を選択します。これでモディファイヤリストにエクスプレッションのモディファイヤが追加されるようになりました( rotorMorph の名称の隣にも、何らかの修正が加えられているということを示す"ドット"が表示されましたね) 。モディファイヤ Expression をダブルクリックし、エクスプレッションパネルを開いてください。

  3. パネルをよく見てみましょう(下の図にあたります。この時点では入力されているエクスプレッションの式は全て無視してください)。最上部には Expression フィールドがあります。このフィールドがエクスプレッションを入力する場所となります(モディファイヤのエクスプレッションは"名称"を持ちません)。エクスプレッションフィールドの下には Additive ボタンがあります。このボタンをチェックすると、エクスプレッションの効果はチャンネルに割り当てられているキーフレームの値に追加されることになります(統合版のエクスプレッションでペダルの方向を設定するときに使用した変数 Value と同じ役割を果たします)。

    Channel Expression

    Additive ボタンの下には説明不要なボタンがリストされていますね。そのボタンの下には四つのフィールド A、B、C そして D があります。これらは"スクラッチ変数"を表します。例えばエクスプレッションを入力できる追加のフィールドなのです。これらは最上部のメインのエクスプレッションフィールドに、使用することが可能なのです。スクラッチ変数を使用すると、複雑なエクスプレッションを、より簡単な部分へと分解することが出来るため読みやすくなり、長いエクスプレッションの場合にはスペースの確保も行います。LigthWave® ではまず、このスクラッチ変数を(アルファベット順に)評価した上で、メインのエクスプレッションを計算します。このため変数 A は 変数 B の中で、また変数 B は変数 C の中で使用することが可能です。

    このパネルのタイトルは Channel Expressions となっていますね。それはグラフ編集内部から、このモディファイヤが呼び出されるためです。似たようなパネルが LightWave® 内部の異なる位置からも、いくつか呼び出せる場所があります。例えばオブジェクトプロパティパネルの変形タブにある Expression (変位エクスプレッション)やモーションオプションパネルの中にある Expression (モーションエクスプレッション)などがそれにあたりますが、このエクスプレッションは決して同じではありません。モーションオプションパネルからエクスプレッションを呼び出すと、グラフ編集で使用されるエクスプレッションにはない利点があります。モーションエクスプレッションでは after IK というオプションを適用できるのです(チャンネルエクスプレッションは常に IK の計算の前に適用されます)。ただし、これは少し上級者向きなので、元の話に戻るとしましょう!
  4. では実際にエクスプレッションを組んでいきます。まずはどのように動作させたいのかを考えていきましょう。ローターが動いていない場合には垂れ下がっている状態(モーフの量は 100%)、高速で動いている場合には、ほぼ水平(モーフの量は 0% 近く)となるように設定します。ただし 0% (水平)に到達することなく、回転が速くなればなるほど、その値に近くなるという設定にします(回転が非常に高速になるとドループが上向きになるように設定したい場合には、モーフターゲットをモデリングしなおす必要が出てきます)。どうすれば、このように設定できるのでしょうか?
       ここに指数関数 exp(-x) と呼ばれる数学関数があります。これで上記のような設定を行う場合のコツです。
    Exponential Function
    図では指数関数がどのような値をとるのかを示しています。この関数の値の範囲は 0〜1であり( x の値が正の値である限り)、まさにこれから設定が必要となるモーフ量の数値と一致しています(モーフの範囲は 0%〜100% ですが、LightWave® ではこの量を 0〜1 の範囲の数値で表しています)。
  5. まずはスクラッチ変数を使用して、最終エクスプレッションの外観をより簡単にしていきましょう。今回はモーフ量をコントロールする回転速度が欲しいわけですが、rotorNull の Heading に関する回転速度は Heading 曲線の勾配によって与えられます。このカーブの勾配は、二つの連続したフレームにおける Heading 値の差分を求めることにより、近似値を求めることが出来るのです。

    Approx. Rotation Speed = pedalChainGearNull.rot(Time+1/Scene.fps).p - pedalChainGearNull.rot(Time).p


    どうしてここまで、ローター用ヌルオブジェクトではなく、ペダルギア用ヌルオブジェクトの値を使ってきたのでしょうか?ローター用ヌルはそれ自身、エクスプレッションによって決定されています。しかしローター用ヌルオブジェクトのエクスプレッションが LightWave® によって必ず速度計算の前に計算されていると、確信を持つことが出来ますか?(そうでない場合、速度は常に 0 という結果を出すことになるでしょう)実際、正しく動作する場合であったとしても、チャンネルの値は出来るだけ下の行で使うように習慣づけたほうが良いでしょう。ローターの Heading はペダルギアの Pitch 角度と等しいので(ペダルギアにはキーフレームが付けられているため、完璧に安全なチャンネルです)、ペダルギアのヌルを使用することにしましょう。また、今回は括弧無しバージョンのエクスプレッションを使用しています。パネル版のエクスプレッションでは括弧付きエクスプレッションは動作しないのです。さらに標準装備の Scene "オブジェクト"である Scene.fps も使用しています。この Scene.fps はシーンのフレーム/秒を表す数値です。ですから Time+1/Scene.fps では Time よりも1フレーム先を計算することになります。

    変数 A には Time+1/Scene.fps を、変数 B には pedalChainGearNull.rot(Time).p を、変数 C には1秒後の角度にあたるpedalChainGearNull.rot(A).p を(ここで変数 A を使用していますね) 、変数 D には速度を表す C-B を代入しています。エクスプレッションは最終的に以下のようになります。

    Expression: 

    exp(-D/5)

    A: 

    Time+1/Scene.fps

    B: 

    pedalChainGearNull.rot(Time).p

    C: 

    pedalChainGearNull.rot(A).p

    D: 

    C-B


    上記の式をエクスプレッションパネルに入力してください。定数値 5 は、ドループが速度の変化に対応する速さをコントロールするために使用されます。定数値を色々と変えて、試してみてください。

    速度 (
    C-B) が負の値の場合(ローターが逆方向に回転している場合にそうなります) 、exp(-D/5) は1よりも大きな値となります(つまりモーフ量は 100% より大きくなります)。確実に指数関数の引数(つまり "-x")を負の値にしたい場合には、もう一つ別の関数 abs(x) を使用することが出来ます。この関数は常に x の絶対値を返してくれます。たとえば x が負の値の場合、負の記号を取り去り、正の値の場合には、そのままの値を返します(例 abs(-3)=3)。これにより abs(x) に -1 を掛け合わせることにより、負の値を取得することが出来るのです。お望みであれば、 exp(-D/5) を exp(-abs(D)/5) で置き換えても構いません。
  6. パネルを閉じ、グラフ編集からモーフ量を表す曲線を観察してください。望みどおりの曲線になっていますね。ペダルギア用ヌルオブジェクトの Pitch 曲線の勾配がきつくなるほど(回転速度が速くなるほど)、モーフ量は 0% に近くなっていきます(水平に近くなります)。
    Graph Editor
    ペダルギア用ヌルオブジェクトの Pitch 曲線が平らな場合(つまり回転していない場合、モーフ量は 100% となり、ドループが垂れ下がっている状態になります。

これでこの章はお終いです!最終章では車輪の回転に対するエクスプレッションを組み立てていきます。