ガイドを使用せずに草原をグルーミングしていて、その地面が平らではなく起伏がある場合、既定での草は地面のサーフェスの法線の向きに沿って生えます。そのような草の葉が既定で真上を向くようにするには、次のエクスプレッションを使用して、葉の 1 枚 1 枚の向きを変えて上を向かせる必要があります(または少なくともそれに近い方向に)。
tiltU: (90 - acosd(dot(norm($dPdu),[0,1,0]))) / 90 tiltV: (90 - acosd(dot(norm($dPdv),[0,1,0]))) / 90
垂れ下がった木の葉をシミュレートするには:
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() に設定します。
正確な方向を指定するには:
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()))
tiltU dotU() / len() tiltV dotV() / len() tiltN acosd( dot($N, dir()) )
これにより方向が定まり、dir グローバル エクスプレッションで正規化されます。これは、この例のように定数でもかまいませんが、ペイントされた法線マップでもよく、変換して適切な正規化されたベクトルに戻すこともできます。
このプロシージャがうまく機能するのは、グローバル エクスプレッションがプリミティブの正しい回転方向を決めているためです。それを小さい値に変更し tiltU と tiltV エクスプレッションで埋める場合は、実際の回転に tiltN を使用できます。これにより、接線平面に打ち勝ち、プリミティブの位置を方向ベクトルに揃えるために必要なマグニチュードが作成されます。グローバル エクスプレッションがなければ、方向は保証されず、回転のマグニチュードのみです。