环绕曲线周围的螺旋状粒子

来源:互联网 发布:mg动画教程 知乎 编辑:程序博客网 时间:2024/04/30 11:19

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));

 

 

原创粉丝点击