次のセクションには、XGen を使用する際に役立つヒントやベスト プラクティスが含まれています。
アトリビュートの補正を使用するときに、場合によってモデル内のフェースが適切に位置揃えが行われません。たとえば offV = 1 と設定することで、一部のプリミティブが同じ方向を向きません。このように位置が揃わないのは、XGen がそのモデルの固有の、CV の巻上げ順序から派生したパラメータを使用しているためです。
その固有の UV がフェースによってランダムに並んでいるように見えるように、モデルを準備することができます。ほとんどの場合、これはいくつかのエクスプレッションで補正することができます。
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
twist: upOrDown() ? flipY() :flipZ()
法線を軸にプリミティブのみカメラに正対させるには、次の操作を行います。
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
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
これらのエクスプレッションを組み合わせることで、offU と offV アトリビュートが調整され、ISO 接線とアップ ベクトルの間の変化が考慮されます。草の方向にさらに高い精度が求められる場合は、後段の「指定方向に正確に生える」を参照してください。
木の葉が垂れ下がってる様子をシミュレートするシーンがある場合は、ガイドを使わずに次のプロシージャを使用することができます。
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]))
bendMagU() に設定します。
bendMagV() に設定します。
常に垂直に生えるようにするテクニックは、草には効果を発揮しますが、offU と offV の制限によってコンストレイントされるため、正確ではありません。つまり、エクスプレッションでは接線平面を超えて成長させることはできません。たとえば一方向に向いている松の葉などをさらに正確にシミュレートする場合は、松の葉が生えているサーフェスの中に含めながら、次のワークフローを試してください。
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()))
offU dotU() / len() offV dotV() / len() offN acosd( dot($N, dir()) )
これにより方向が定まり、dir パレット エクスプレッションで正規化されます。これは、この例のように定数でもかまいませんが、ペイントされた法線マップでもよく、変換して適切な正規化されたベクトルに戻すこともできます。
このプロシージャがうまく機能するのは、エクスプレッションがプリミティブの正しい回転方向を決めているためです。それを小さい値に変更し offU と offV エクスプレッションで埋める場合は、本来の回転に offN を使用することがあります。これにより、接線平面に打ち勝ち、プリミティブの位置を方向ベクトルに揃えるために必要なマグニチュードが作成されます。パレット エクスプレッションがなければ、方向は保証されず、回転のマグニチュードのみです。