アーカイブおよび樹木をインスタンス化するエクスプレッション

真上を向くようにプリミティブを強制する

ガイドを使用せずに草原をグルーミングしていて、その地面が平らではなく起伏がある場合、既定での草は地面のサーフェスの法線の向きに沿って生えます。そのような草の葉が既定で真上を向くようにするには、次のエクスプレッションを使用して、葉の 1 枚 1 枚の向きを変えて上を向かせる必要があります(または少なくともそれに近い方向に)。

tiltU: (90 - acosd(dot(norm($dPdu),[0,1,0]))) / 90
tiltV: (90 - acosd(dot(norm($dPdv),[0,1,0]))) / 90
これらのエクスプレッションを組み合わせることで、tiltU (U のティルト(Tilt U))アトリビュートと tiltU (V のティルト(Tilt V))アトリビュートが調整され、ISO 接線とアップベクトルの間の変化が考慮されます。草の方向にさらに高い精度が求められる場合は、後段の「指定方向に正確に生える」を参照してください。
注: また、alignUalignValignN の各エクスプレッションも使用できます。

常に垂れ下がる

木の葉が垂れ下がってる様子をシミュレートするシーンがある場合は、ガイドを使わずに次のプロシージャを使用することができます。

垂れ下がった木の葉をシミュレートするには:

  1. まず、XGen エクスプレッションエディタ(XGen Expression Editor)で、2 つのグローバル エクスプレッションを作成します。
    float bendMagU  -acosd(dot(abs(norm($N)),[0,1,0]))/180*(dot(norm($dPdu),[0,1,0]))
    float bendMagV  -acosd(dot(abs(norm($N)),[0,1,0]))/180*(dot(norm($dPdv),[0,1,0]))
  2. 次に、tiltU および bendMagU エクスプレッションを
    bendMagU() に設定します。
  3. tiltU および bendMagV
    bendMagV() に設定します。
    注: 次を使用してコントロール(Control using)を必ずアトリビュート(Attribute)に設定してください。

指定方向に正確に生える

常に垂直に生えるようにするテクニックは、草には効果を発揮しますが、tiltUtiltV の制限によってコンストレイントされるため、正確ではありません。つまり、エクスプレッションでは接線平面を超えて成長させることはできません。たとえば、一方向に向いている松の葉などをさらに正確にシミュレートする場合は、松の葉が生えているサーフェスの中に含めながら、次のワークフローを試してください。

正確な方向を指定するには:

  1. 次のように 4 つのグローバル エクスプレッションを作成します。
    vector dir 
    $x = -0.0750; # -1.000, 1.000
    $y = 0.2550; # -1.000, 1.000
    $z = 0.1650; # -1.000, 1.000
    norm([$x, $y, $z])
    float   dotU  dot( norm($dPdu), dir() )
    float   dotV  dot( norm($dPdv), dir() )
    float   len   100.0 * (abs(dotU()) + abs(dotV()))
  2. 次のスプライン プリミティブのアトリビュートを入力します。
    tiltU  dotU() / len()
    tiltV  dotV() / len()
    tiltN  acosd( dot($N, dir()) )

これにより方向が定まり、dir グローバル エクスプレッションで正規化されます。これは、この例のように定数でもかまいませんが、ペイントされた法線マップでもよく、変換して適切な正規化されたベクトルに戻すこともできます。

このプロシージャがうまく機能するのは、グローバル エクスプレッションがプリミティブの正しい回転方向を決めているためです。それを小さい値に変更し tiltUtiltV エクスプレッションで埋める場合は、実際の回転に tiltN を使用できます。これにより、接線平面に打ち勝ち、プリミティブの位置を方向ベクトルに揃えるために必要なマグニチュードが作成されます。グローバル エクスプレッションがなければ、方向は保証されず、回転のマグニチュードのみです。