position、velocity、acceleration を操作する
 
 
 

さまざまなパーティクル モーションを生成するには、位置(position)、速度(velocity)、アクセラレーション(acceleration)の各アトリビュートにベクトル値を代入します。これらアトリビュートの操作例については、 ランタイム エクスプレッションを記述するを参照してください。

運動物理学を明確に把握している場合を除いて、位置、速度、アクセラレーションの各アトリビュートを操作することは避けてください。

ランタイム エクスプレッションを使用してスムースでランダムなモーションをパーティクルに与えるには、sphrand などの乱数関数を使用してパーティクル シェイプのアクセラレーション アトリビュートに乱数を代入します。アクセラレーションの変化が急激な場合でも、常にスムースなモーションが実現されます。

ランタイム エクスプレッションを使用して細かく揺れるランダムなモーションをパーティクルに与えるには、sphrand などの乱数関数を使用してパーティクル シェイプの速度アトリビュートまたは位置アトリビュートに乱数を代入します。

乱数関数の使用方法の詳細については、 乱数関数の基礎知識を参照してください。

オブジェクトの位置、速度、アクセラレーションがエクスプレッションとダイナミック フィールドによって制御される場合は、エクスプレッションによる効果が最初に適用された後、ダイナミック フィールドのエフェクトが追加されます。

注:オブジェクトの位置、速度、アクセラレーションがエクスプレッションとダイナミック フィールドによって制御される場合は、オブジェクトの動きの結果にインフルエンスがあります。エクスプレッションがダイナミック フィールドより先に実行される場合は、そのエクスプレッションによって代入された値を使用してダイナミックが計算されます。エクスプレッションがダイナミック フィールドより後に実行される場合は、前のフレームから引き継がれたアトリビュート値、または入力されたランプによって生成されたアトリビュート値に基づいてエクスプレッションが計算されます。

エクスプレッションをダイナミック フィールドの前後どちらで実行するかを設定するには、パーティクル オブジェクトを選択し、アトリビュート エディタを表示し、ダイナミクス後のエクスプレッション(Expression After Dynamics)をオンまたはオフに設定します。

デフォルト設定の重力(gravity)フィールドに制御されて下降するパーティクルを想定します。重力フィールドによって、各パーティクルには Y 軸方向に 9.8 単位 / 秒の下方加速度が適用されます。すなわち、重力フィールドのデフォルト アクセラレーションは <<0,-9.8,0>> です。

さらに、このパーティクル用に次のようなランタイム エクスプレッションを作成します。

velocity = velocity + <<1,0,0>>;

各フレームを再生すると、最初にエクスプレッションの文に基づいてパーティクルの速度が計算されます。パーティクルの速度は X 軸方向に 1 単位 / 秒の割合で増加します。次に、重力加速度が速度に加算され、その結果に基づいてパーティクルの位置が計算されます。

もちろん、この計算過程はユーザには見えません。計算が完了して初めて、パーティクルが計算結果の位置に表示されます。

アニメーションを再生すると、エクスプレッションによってフレームごとに、定数 <<1,0,0>> がパーティクルの速度に加算されます。このため、時間の経過に伴って、X 軸方向の移動速度が増加します (増加する速度はアクセラレーションと呼ばれます)。

アクセラレーション アトリビュートの作用は、位置アトリビュートまたは速度アトリビュートの作用とは、重要な点で異なります。各フレームの前に、アクセラレーション アトリビュートは <<0,0,0>> に初期化されます。オーバー サンプル レベルが 2 以上である場合は、各タイムステップの前に加速度が初期化されます。

重力の影響を受けないパーティクル オブジェクト(5 つのパーティクルを含む)について次のランタイム エクスプレッションを作成したと仮定します。

acceleration = acceleration + <<0,1,0>>;

このエクスプレッションでは、フレームごとにアクセラレーションの値に <<0,1,0>> が加算されるのではなく、各パーティクルのアクセラレーションは一定の <<0,1,0>> に留まります。これは各フレームの前にアクセラレーションが <<0,0,0>> に初期化されるからです。

デフォルト設定の重力フィールドをパーティクル オブジェクトに適用した場合は、パーティクルのアクセラレーションが <<0,1,0>> + <<0,-9.8,0>> = <<0,-8.8,0>> になります。すなわち、上のエクスプレッションによって設定されるアクセラレーションは、重力による下方アクセラレーションを減少させます。

上のエクスプレッションを次のように変更します。

acceleration = acceleration + sphrand(3);

各フレームの前にアクセラレーションが <<0,0,0>> に初期化されるため、この文は次の文と同じ結果になります。

acceleration = sphrand(3);

各フレームを再生すると、最初にエクスプレッションの文に基づいてパーティクルのアクセラレーションが計算され、各パーティクルのアクセラレーションに sphrand(3) 関数の戻り値が代入されます。

sphrand(3) 関数はベクトルを提供します。このベクトルの、ランダムに選択されたコンポーネントは、原点を中心にした半径 3 の球状の領域内に存在します。パーティクルはそれぞれ、異なるベクトル値を受け取ります。

最後に、重力フィールドのアクセラレーションがエクスプレッションのアクセラレーション(sphrand 関数の戻り値)に加算され、各パーティクルが計算結果の位置に表示されます。

エクスプレッション内の sphrand 関数によってランダムな値が生成されるため、各パーティクルのアクセラレーションは、重力加速度の方向やマグニチュードとは少しずつ異なります。sphrand 関数は各パーティクルについてフレームごとに実行され、各パーティクルのアクセラレーションはフレームごとに異なる値になります。

この例では、アクセラレーション アトリビュートとフィールドを組み合わせて新しいカスタム エフェクトを生成する方法を紹介しました。

ヒント:パーティクル シェイプ ノードのアトリビュートに対する全フィールドのエフェクトを無効にするには、各フィールドのダイナミクス ウェイト(Dynamics Weight)アトリビュートを 0 に設定します。