如果您在不使用导向的情况下修饰一块草地,并且地平面是不平坦或呈起伏状的,默认情况下草将会朝向曲面法线的方向。要使草的叶片默认呈垂直方向,您必须更改方向以使每张叶片指向上方(或至少是近似方向),请尝试输入以下表达式:
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 来实现真正的旋转。这会突破切线平面并创建基本体与方向向量对齐所需的幅值。不使用全局表达式,则无法保证方向,只能保证旋转幅值。