用户提示

 
 
 

下面一部分包含有关使用 Xgen 的提示和最佳实践。

UV 补偿

当您使用属性补偿时,模型中的面有时会不能正确对齐。例如,您可能会设置 offV=1,而所有基本体不会指向相同的方向。不能对齐的原因是 XGen 使用派生于 CV 缠绕顺序的模型的内在参数化。

您可以准备模型,使其内部的 UV 看起来像是从面到面任意排序的。大多数情况下,您也可以使用一些表达式来对此作出补偿。

要补偿不对齐的面,请执行下列操作:

  1. 输入以下三个表达式作为选项板表达式:
    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)来控制基本体各个分段的噪波。可在无需创建导向的情况下创建属性驱动的描述:这样也可以设置默认的表达式,从而使其不需要导向。

始终垂直生长

如果您在不使用导向的情况下修饰一块草地,并且地平面是不平坦或呈起伏状的,默认情况下草将会朝向曲面法线的方向。要使草的叶片默认呈垂直方向,您必须更改方向以使每张叶片指向上方(或至少是近似方向),请尝试在 “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 属性,并影响等参线切线和上方向向量之间的任何更改。如果您需要更精确的草地方向,请参见后面所述的“沿精确方向生长”。

注意 您也可以使用 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. 然后将 Off UBend U[0] 表达式设为:
    bendMagU()
  3. Off VBend V[0] 设为:
    bendMagV()
    注意请确保将“插值模式”(Interpolation Mode)设置为“属性”(Attribute)

沿精确方向生长

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

要指定精确的方向:

  1. 创建四个选项板表达式:
    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)选项板表达式中提供规格化方向。这可以是一个常量(如在本示例中),也可以是一个绘制的法线贴图,该贴图可以转化回正确的规格化向量。

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