float $scaleOffset = 0.2 ;
float $pos[] = `pointOnCurve - pr(particleShape1.age) - p curve1`;
float $tan[] = `pointOnCurve - pr(particleShape1.age) - nt curve1`;
float $norm[] = `pointOnCurve - pr(particleShape1.age) - nn curve1`;
vector $posvec = <<$pos[0],$pos[1],$pos[2]>>;
vector $tanvec = <<$tan[0],$tan[1],$tan[2]>>;
vector $normvec = <<$norm[0],$norm[1],$norm[2]>>;
vector $norm2vec = cross($tanvec,$normvec);
particleShape1.position = $posvec + ($scaleOffset * $normvec *cos(particleShape1.age*20))+($scaleOffset*$norm2vec*sin(particleShape1.age*20));
缺点,速度慢。下面对表达式做一处更改,使它运行的更多快。
-ch on(代表“Construction history on(创建历史信息选项开)“)是pointOnCurve命令的选项之一。这个选项创建一个具有输入属性和输出属性的pointOnCurveInfo类型节点。通过为每条曲线创建一个这样的节点,并使用setAttr来设置参数,使用getAttr来获得参数值,该表达式将运行得更快。因为pointOnCurve 每一次运行时都要创建并销毁这样的一个节点,而这个操作对每一帧中的每一个粒子都要执行一次。通过消除这些节点的创建和销毁操作,该表达式将执行的更快。
pointOnCurve -ch on -pr 0 curve1;
pointOnCurve -ch on -pr 0 curve1guide;
float $scaleOffset = 0.2 ;
setAttr pointOnCurveInfo1.parameter(particleShape1.age);
setAttr pointOnCurveInfo2.parameter(particleShape1.age);
float $pos[] = `getAttr pointOnCurveInfo1.position`;
float $tan[] = `getAttr pointOnCurveInfo1.normalizedTangent`;
float $normEnd[] =`getAttr pointOnCurveInfo2.position`;
float $norm[];
$norm[0] = $normEnd[0]-$pos[0];
$norm[1] = $normEnd[1]-$pos[1];
$norm[2] = $normEnd[2]-$pos[2];
vector $posvec = <<$pos[0],$pos[1],$pos[2]>>;
vector $tanvec = <<$tan[0],$tan[1],$tan[2]>>;
vector $normvec = unit(<<$norm[0],$norm[1],$norm[2]>>);
vector $norm2vec = cross($tanvec,$normvec);
particleShape1.position = $posvec + ($scaleOffset * $normvec *cos(particleShape1.age*20))+($scaleOffset*$norm2vec*sin(particleShape1.age*20));