ユーザへのヒント

次のセクションには、XGen ワークフローで使用できるヒントが含まれています。

UV の補正

アトリビュートの補正を使用するときに、場合によってモデル内のフェースが適切に位置揃えが行われません。たとえば、V のティルト=1(Tilt V=1)(エクスプレッションで使用する場合は OffU)を設定してすべてのプリミティブが同じ方向に向かないようにすることができます。このように位置が揃わないのは、XGen がそのモデルの固有の、CV の巻上げ順序から派生したパラメータを使用しているためです。

その固有の UV がフェースによってランダムに並んでいるように見えるように、モデルを準備することができます。ほとんどの場合、これはいくつかのエクスプレッションで補正することができます。

位置が揃っていないフェースを補正するには:

  1. グローバル エクスプレッションとして、次の 3 つのエクスプレッションを入力します(「エクスプレッション」を参照)。
    float upOrDown: (abs(dot(norm($dPdv),[0,1,0]))>0.6 || abs(dot(norm($dPdu),[0,1,0]))>0.6)? 1 : 0
    float flipY:      (abs(dot(norm($dPdu),[0,1,0]))>0.6)?90 : 0
    float flipZ:      (abs(dot(norm($dPdu),[0,0,1]))>0.6)?90 : 0
    
  2. アトリビュートのツイスト(Twist Attribute)フィールドに次のように入力します。
    twist: upOrDown() ? flipY() :flipZ()
    

カメラのほうに回転させる

法線を軸にプリミティブのみカメラに正対させるには、次の操作を行います。

プリミティブを回転させてカメラに向くようにするには:

  1. プリミティブ(Primitives)タブの Card アトリビュートに次のように入力します。
    length: 0.3
    width:  1.0
    offV:   1.0
    aboutN: $eye=norm($cam-$P);$ang=acosd(dot( $eye,[0,0,1])); $axis=cross([0,0,1],$eye); dot($axis,$N)>0 ?$ang : -$ang
    
  2. スプライン(Spline)アトリビュートに次のように入力します。
    length:   0.3
    width:    1.0
    bendV[0]: 1.0
    aboutN:   $eye=norm($cam-$P);$ang=acosd(dot( $eye,[0,0,1])); $axis=cross([0,0,1],$eye); dot($axis,$N)>0 ?$ang : -$ang
    

草のグルーミング

草の生えた大きな領域をグルーミングする場合、次を使用してコントロール(Control using)アトリビュート(Attribute)に設定してプリミティブの各セグメントでノイズをコントロールします。ガイドを作成しなくてもアトリビュート駆動でディスクリプションを作成します。これにより、既定のエクスプレッションもガイドを必要としないように設定されます。

常に垂直に生える

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

offU: (90 - acosd(dot(norm($dPdu),[0,1,0]))) / 90
offV: (90 - acosd(dot(norm($dPdv),[0,1,0]))) / 90
これらのエクスプレッションを組み合わせることで、offU (U のティルト(Tilt U))アトリビュートと offU (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. 次に、offU および bendMagU エクスプレッションを
    bendMagU() に設定します。
  3. offU および bendMagV
    bendMagV() に設定します。
    注: 次を使用してコントロール(Control using)を必ずアトリビュート(Attribute)に設定してください。

指定方向に正確に生える

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

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

  1. 次のように 4 つのグローバル エクスプレッションを作成します。
    vector  dir   norm([1.0, 1.0, 0.0])
    float   dotU  dot( norm($dPdu), dir() )
    float   dotV  dot( norm($dPdv), dir() )
    float   len   100.0 * (abs(dotU()) + abs(dotV()))
    
  2. 次のスプライン プリミティブのアトリビュートを入力します。
    offU  dotU() / len()
    offV  dotV() / len()
    offN  acosd( dot($N, dir()) )
    

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

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