エルミートカーブに沿った値を返します。この関数を使用して、たとえば、パーティクル オブジェクトをカーブに沿ってスムースに動かすことができます。下記の例で示すように、hermite 関数の引数を変更すると、さまざまなシェイプのカーブを作成することができます。
vector hermite(vector start, vector end, vector tan1, vector tan2, float parameter)
float hermite(float start, float end, float tan1, float tan2, float parameter)
tan1 は、カーブが始点から離れるときに、カーブの方向とシェイプを指示する接線ベクトルです。この接線ベクトルの始点はカーブの始点の位置にあります。
tan2 は、カーブが終点に近づくときの、カーブの方向とシェイプを指示する接線ベクトルです。この接線ベクトルの始点はカーブの終点の位置にあります。
parameter は、0~1 の範囲の浮動小数点数(linstep 関数の戻り値など)です。
2 番目の形式では、引数と戻り値が 1 次元空間にあります。
原点に位置する 1 つのパーティクルからなる dust というオブジェクトを作成します。このオブジェクトをアニメーション再生の最初の 4 秒間で短い上向きカーブに沿って動かすため、次のようなランタイム エクスプレッションを作成することができます。
dust.position = hermite(<<0,0,0>>,<<2,2,0>>,
<<3,0,0>>, <<0,3,0>>, linstep(0,4,time));
アニメーションを再生すると、パーティクルが始点 <<0,0,0>> からカーブに沿って終点 <<2,2,0>> まで移動します。接線ベクトル <<3,0,0>> は、カーブが始点から遠ざかるときの方向とシェイプを指示します。接線ベクトル <<0,3,0>> は、カーブが終点に近づくときの方向とシェイプを指示します。
アニメーション時間が 0 秒から 4 秒に延びると、パーティクルが linstep 関数で定義されるカーブに沿って移動します (詳細については、 linstep を参照してください)。
次の図に、hermite 関数の引数と、生成されたパス カーブを示します。
例 1 のエクスプレッションで、3 番目の引数を <<6,0,0>> に変更します。
dust.position = hermite(<<0,0,0>>,<<2,2,0>>,
<<6,0,0>>, <<0,3,0>>, linstep(0,4,time));
tan1 ベクトルが長いため、パス カーブの傾きが大きくなります。
次のようにエクスプレッションを変更すると、dust オブジェクトが S 字形のパターンを描いて移動するようになります。
dust.position = hermite(<<0,0,0>>,<<2,0,0>>,
<<0,3,0>>, <<0,3,0>>, linstep(0,4,time));
tan1 ベクトル <<0,3,0>> は、カーブが始点から遠ざかるときの方向を Y 軸の正方向に設定します。tan2 ベクトル <<0,3,0>> は、カーブが終点に近づくときの方向を Y 軸の正方向に設定します。
例 3 のエクスプレッションで、4 番目の引数を <<0,-3,0>> に変更します。
dust.position = hermite(<<0,0,0>>,<<2,0,0>>,
<<0,3,0>>, <<0,-3,0>>, linstep(0,4,time));
dust パーティクルが半円周に近い軌道を描いて移動するようになります。
tan1 ベクトル <<0,3,0>> は、カーブが始点から遠ざかるときの方向を Y 軸の正方向に設定します。tan2 ベクトル <<0,-3,0>> は、カーブが終点に近づくときの方向を Y 軸の負方向に設定します。
例 4 のエクスプレッションで、3 番目の引数を <<0,10,0>> に変更します。
dust.position = hermite(<<0,0,0>>,<<2,0,0>>,
<<0,10,0>>, <<0,-3,0>>, linstep(0,4,time));
tan1 ベクトルが長くなったため、始点から上昇するときのパス カーブの傾きが大きくなります。tan2 ベクトルの Y 要素は tan1 ベクトルの Y 要素よりマグニチュードが小さいため、終点に近づくにつれて、パス カーブの傾きが小さくなります。tan1 ベクトルの Y 要素が 3 から 10 に増加しているため、パス カーブの Y 方向への上昇度合いが前の例よりも大きくなっています。