LightWave 3D チュートリアル

 

エクスプレッション物理: 発射軌道


LightWave 3D®のような仮想空間は、シミュレーション作業を行うのに非常に適しています。シミュレーションでは物理的な事象を再現するため、プログラミング経験が多少ある方のほうがよいかもしれません。今回のチュートリアルでは、いくつかの物理現象をエクスプレッションで再現していきます。発射軌道に関する物理方程式を LightWave® の エクスプレッションへと変換していくのです。

物理の世界において動きはmechanics(力学)という範疇にあり、発射軌道もこの範疇に収まります。発射軌道の物理計算をシミュレートするために必要となる方程式は以下のとおりです:

x = v0 cosθ0 t

y = v0 sinθ0 t - ½gt²

上記の恐ろしげな方程式に現れる要素を説明していきましょう。 v0 (V-ゼロ)は発射時における初期速度を表しています。 θ0 (Theta-ゼロ)は地平線からの初期発射角度、 t はタイムインデックス、そして g は重力による加速度(地球の場合は約 9.8 m/s² )を表しています。

上記の物理方程式を変換して使えるようにするために、 少し解説を加えておきましょう。

方程式の変換

必要とされるコンポーネント(前述)を少しずつ置換していけば、これらの方程式を LightWave® エクスプレッションに簡単に変換することが出来ます。例えば、発射の初期速度として 10 m/s と指定する場合、双方の方程式における v0 に対し、直接この値を入れ替えます:

x = 10 * cosθ0 t

y = 10 * sinθ0 t - ½gt²

次に θ0 に対しては、シーン内にある "Cannon" というオブジェクトのバンク角度を使用しましょう。エクスプレッションのチャンネル構文を用い、シーンオブジェクトのバンク角度に基づいて方程式の初期角度を求めることにします:

x = 10 * cos([Cannon.Rotation.B,0.0]) t

y = 10 * sin([Cannon.Rotation.B,0.0]) t - ½gt²

角度の使用単位についてここで一つ小さな問題が発生します。 sin() やcos() 関数はラジアン単位で角度を受け付けるのに対し、チャンネルエクスプレッションでは度数単位で角度を返すという点です。ですから、rad() 関数を呼び出し時に、各チャンネルを正しい単位へと変換させなくてはなりません:

x = 10 * cos(rad([Cannon.Rotation.B,0.0])) t

y = 10 * sin(rad([Cannon.Rotation.B,0.0])) t - ½gt²

それぞれの方程式に出てくる要素 t には、エクスプレッションの Time 変数をそのまま置換することが出来ます:

x = 10 * cos(rad([Cannon.Rotation.B,0.0])) * Time

y = 10 * sin(rad([Cannon.Rotation.B,0.0])) * Time - ½g(Time)²

そして加速度 g には地球の重力である 9.8 m/s² を代用します:

x = 10 * cos(rad([Cannon.Rotation.B,0.0])) * Time

y = 10 * sin(rad([Cannon.Rotation.B,0.0])) * Time - ½ * 9.8 * (Time)²

計算が正しく行われるように、方程式に最終的な修正を幾つか施せば、地球の重力にしたがって弾道をシミュレートするLightWave®用の初期エクスプレッションが完成です:

x = 10 * cos(rad([Cannon.Rotation.B,0.0])) * Time

y = (10 * sin(rad([Cannon.Rotation.B,0.0])) * Time) - (0.5 * 9.8 * (Time * Time))

エクスプレッションの適用

新規シーンを作成し、 まずは "Cannon" という名称のヌルオブジェクトを追加して下さい。その後、投射物として提供されるオブジェクトも読み込みます:

インタラクティブ性を保つため、 "Auto Key(自動キー作成)" 設定をオンにしておいてください:

ではグラフ編集を開きましょう。選択した投射物のXチャンネルを選択し、このチャンネルに対し新規エクスプレッションを追加します:

X チャンネル用に先ほど作成したエクスプレッションの式をコピーし、エクスプレッションの "Value(値)" に貼り付け、 "Apply(適用)" ボタンをクリックします:

Y チャンネルに対して同じような手順でエクスプレッションを適用します:

LightWave® のメインウィンドウへと戻り、 "Cannon" オブジェクトを選択し、バンク角度を26.5度へと調節します:

再生ボタンを押すと、投射物は "Cannon" から初期投射角度 26.5 度、初期速度 10 m/s で発射されます:

"Cannon" オブジェクトのバンク角度を変えると、何の変更も加えなくても、投射物を制御しているエクスプレッションによって自動的に軌道が変化します:

さらなるコントロールの追加

既存のシステムでも十分有効ではありますが、 ユーザーインターフェイスからアクティブなエクスプレッション内における操作可能な値を調節できるようにすることで、よりインタラクティブ性を持たせることが出来ます。例えば、シーンに対し新しいヌルオブジェクト( "Vo" という名称をつけましょう)を追加し、このヌルオブジェクトの X 位置をエクスプレッションの初期速度として割り当てることで、発射の初期速度を調節することが出来るようになります。

まずは、ヌルオブジェクト "Vo" を追加し、X の初期位置を 1 メートルとします:

次にヌルオブジェクト "Vo" 発射の X 位置を使用して、先ほど作成しておいたエクスプレッションの発射初期速度を制御できるように、改造していきましょう。速度を調節するオブジェクトがスクリーン外側へとはみ出してしまわないように、X 位置の値に 10 を掛け合わせることにします(このため位置の 1 メートルは初期速度 10 m/s に相当します)。

x = (10 * [Vo.Position.X,0.0]) * cos(rad([Cannon.Rotation.B,0.0])) * Time

y = ((10 * [Vo.Position.X,0.0]) * sin(rad([Cannon.Rotation.B,0.0])) * Time) - (0.5 * 9.8 * (Time * Time))

さらに投射物が "Cannon" オブジェクトの水平面より下方へと落ちていかないようにしましょう。現在のエクスプレッションでは、 "Cannon" オブジェクトで定義されている地平線よりも下へと投射物が落下してしまうことがあります:

clamp() 関数を Y エクスプレッションへと適用し、投射物が "Cannon" オブジェクトの Y 位置よりも下方へと落下しないようにします。clamp() 関数の中で、下側のレベル(最小)値を "Cannon" オブジェクトの Y 位置に、上側のレベル(最大)値を任意の高い数値へと設定します:

clamp(((10 * [Vo.Position.X,0.0]) * sin(rad([Cannon.Rotation.B,0.0])) * Time) - (0.5 * 9.8 * (Time * Time)),[Cannon.Position.Y,0.0],50000.0)

さらへ先へと・・・

今回作成したエクスプレッションは LightWave® エクスプレッションシステム内部において、どのようなことを実現できるのかという範囲をかなりよく表しています。さらに LSciprt で発射を制御すれば、さらにより多くのことが実現できるようになります(例えば、任意の地面を追加して投射物がある地点上に存在するように)。今回のチュートリアルで方程式は変換されましたから、今度は個人練習として、エクスプレッションの働きを再現するような独自の LScript (Item Motion) を書いてみたり、エクスプレッションにさらに機能を追加してみたりと、色々試してみてください。

ここからソースファイルをダウンロードしてください Win Mac