ユーザへのヒント

 
 
 

次のセクションには、XGen を使用する際に役立つヒントやベスト プラクティスが含まれています。

UV の補正

アトリビュートの補正を使用するときに、場合によってモデル内のフェースが適切に位置揃えが行われません。たとえば offV = 1 と設定することで、一部のプリミティブが同じ方向を向きません。このように位置が揃わないのは、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
    

草のグルーミング

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

常に垂直に生える

ガイドを使用せずに草原をグルーミングしていて、その地面が平らではなく起伏がある場合、既定での草は地面のサーフェスの法線の向きに沿って生えます。そのような草の葉が既定で真上を向くようにするには、葉の 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

これらのエクスプレッションを組み合わせることで、offUoffV アトリビュートが調整され、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. そして、オフ U(Off U)U のベンド[0](Bend U[0])エクスプレッションを
    bendMagU() に設定します。
  3. オフ V(Off V)V のベンド[0](Bend V[0])
    bendMagV() に設定します。
    注:補間モード(Interpolation Mode)を必ずアトリビュート(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 を使用することがあります。これにより、接線平面に打ち勝ち、プリミティブの位置を方向ベクトルに揃えるために必要なマグニチュードが作成されます。パレット エクスプレッションがなければ、方向は保証されず、回転のマグニチュードのみです。