归档和植被实例化表达式

强制基本体到点垂直

如果您在不使用导向的情况下修饰一块草地,并且地平面是不平坦或呈起伏状的,默认情况下草将会朝向曲面法线的方向。要使草的叶片默认呈垂直方向,您必须更改方向以使每张叶片指向上方(或至少是近似方向),请尝试输入以下表达式:

tiltU: (90 - acosd(dot(norm($dPdu),[0,1,0]))) / 90
tiltV: (90 - acosd(dot(norm($dPdv),[0,1,0]))) / 90
这些表达式组合可调整 tiltU“倾斜 U”(Tilt U))和 tiltU“倾斜 V”(Tilt V))属性,并影响等参线切线和上方向向量之间的任何更改。如果您需要更精确的草地方向,请参见后面所述的“沿精确方向生长”。
注: 您也可以使用 alignUalignValignN 表达式。

始终下垂

如果想要在场景中模拟叶子下垂的效果,您可以在没有导向的情况下使用下列步骤。

要模拟下垂的叶子:

  1. 首先,在“XGen 表达式编辑器”(XGen Expression Editor)中创建两个全局表达式:
    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. 然后,将 tiltUbendMagU 表达式设定为:
    bendMagU()
  3. tiltUbendMagV 设定为:
    bendMagV()
    注: 请确保将“控制使用”(Control using)设置为“属性”(Attribute)

沿精确方向生长

“总是垂直生长”(Always Grow Vertical)提示应用于草地时可获得很好的效果,但它不如通过 tiltUtiltV 进行约束时那样精确,也就是说您不能使用表达式来突破切线平面。如果您需要更高的精度,例如,让松树的松针指向特定的方向,包括指向生成针叶的曲面,请尝试以下工作流:

要指定精确的方向:

  1. 创建四个全局表达式:
    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()))
  2. 输入以下样条线基本体属性:
    tiltU  dotU() / len()
    tiltV  dotV() / len()
    tiltN  acosd( dot($N, dir()) )

这会在 dir 全局表达式中提供归一化方向。这可以是一个常量(如在本示例中),也可以是一个绘制的法线贴图,该贴图可以转化回正确的归一化向量。

因为全局表达式确定基本体应该旋转的方向,所以此步骤是可行的。如果您要将其更改为较小的值并用 tiltUtiltV 表达式来填充,您可以使用 tiltN 来实现真正的旋转。这会突破切线平面并创建基本体与方向向量对齐所需的幅值。不使用全局表达式,则无法保证方向,只能保证旋转幅值。