maya particle 模拟僵尸新娘斗篷飞散之instance物体的opacity

 
之前在公司的时候,测试的一段僵尸新娘里面的斗篷怎么变成蝴蝶飞掉的。 其中的难点在于:1 如何自然的让蝴蝶逐渐的从斗篷上脱落。 2 斗篷飞动的同时,如何让instance的rotation 保持一致。 最终效果:  

 
maya <wbr>particle <wbr>模拟僵尸新娘斗篷飞散之instance物体的opacity

下边是mel的内容:
global proc gs_objfade()
{
if(`window -ex "gswin"`) deleteUI gswin;

window -t gs_butterfly gswin;
columnLayout;
textFieldButtonGrp -label "instobj" -text "pCube1" inst_button;
textFieldButtonGrp -label "emitobj" -text "nurbsPlane1" -buttonLabel "createParticle" -bc "makeP" surface_button;
showWindow gswin;
**
global proc string[] dupInst()
{
string $dupobjs[];

for($i=0;$i<11;$i++)
{
string $instext=`textFieldButtonGrp -q -text inst_button`;
select -r $instext;

string $tmp[]=`duplicate -rr -n ("gsobj"+$i)`;
$dupobjs=stringArrayCatenate($dupobjs,$tmp);

string $shadeNam=`shadingNode -asShader lambert -n ("insopc"+$i)`;
float $opc=$i*0.1;
setAttr ($shadeNam+".transparency") -type double3 $opc $opc $opc;
sets -renderable true -noSurfaceShader true -empty -n ("insopc"+$i+"SG");
connectAttr -f ($shadeNam+".transparency") ("insopc"+$i+"SG"+".surfaceShader");

select -r $tmp;
sets -e -forceElement ("insopc"+$i+"SG");
**
return $dupobjs;

**


global proc makeP()
{
string $emitobj=`textFieldButtonGrp -q -text surface_button`;
select $emitobj;
emitter -type omni -r 100 -sro 0 -nuv 0 -cye none -cyi 1 -spd 1 -srn 0 -nsp 1 -tsp 0 -mxd 0 -mnd 0 -dx 1 -dy 0 -dz 0 -sp 0 ;
particle;
connectDynamic -em emitter1 particle1;
rename p;
setAttr emitter1.emitterType 2;

setAttr "emitter1.rate" 10;

string $instobj=`textFieldButtonGrp -q -text inst_button`;

select -r pShape ;
addAttr -ln rotPP0 -dt vectorArray pShape;
addAttr -ln rotPP -dt vectorArray pShape;
setAttr -e -keyable true pShape.rotPP;
addAttr -ln scalePP0 -dt vectorArray pShape;
addAttr -ln scalePP -dt vectorArray pShape;
setAttr -e -keyable true pShape.scalePP;
addAttr -ln indexPP0 -dt doubleArray pShape;
addAttr -ln indexPP -dt doubleArray pShape;
setAttr -e -keyable true pShape.indexPP;
addAttr -ln dieAtPP0 -dt doubleArray pShape;
addAttr -ln dieAtPP -dt doubleArray pShape;
setAttr -e -keyable true pShape.dieAtPP;
addAttr -ln dieAt -at double -min 0 -max 100 -dv 1 pShape;
setAttr -e -keyable true pShape.dieAt;

string $expC[];
$expC[0]="pShape.indexPP=int(rand(0,9));\r\n";
$expC[1]="pShape.scalePP=rand(0.5,0.8);\r\n";
$expC[2]="pShape.rotPP=rand(360);\r\n";
$expC[3]="pShape.lifespanPP=rand(3,5);\r\n";
$expC[4]="pShape.dieAtPP=pShape.dieAt*pShape.lifespanPP*0.01;";

string $expressionC1;
for ($i=0;$i<5;$i++)
{ $expressionC1=$expressionC1+$expC[$i];
**
dynExpression -c -s $expressionC1 pShape;

string $expR[];
$expR[0]="pShape.rotPP+=<<rand(10),rand(10),rand(10)>>;\r\n\r\n";
$expR[1]="pShape.indexPP=int(linstep(pShape.dieAtPP,pShape.lifespanPP,pShape.age)*10);";


string $expressionR1;
for ($i=0;$i<2;$i++)

$expressionR1=$expressionR1+$expR[$i];
**

dynExpression -rbd -s $expressionR1 pShape;

clear $expC;
clear $expR;

string $obj[]=`dupInst`;
select $obj;
select -add p ;

string $tmp;
for($i=0; $i<size($obj); $i++)
{
$tmp=$tmp + " -object "+$obj[$i] ;
**

$tmp= "particleInstancer -addObject" + $tmp+" pShape";

$temp=eval_r($tmp);

particleInstancer -e -name instancer1 -rotation rotPP pShape;
particleInstancer -e -name instancer1 -objectIndex indexPP pShape;
particleInstancer -e -name instancer1 -scale scalePP pShape;


cycleCheck -e off;
**



说简单一点就是,调10个不同透明度的物体, 用粒子的的Opacity来逐渐调用ObjectID

在粒子的Run time中可以这样写:

vector $opc = particleShape1.opacityPP;
particleShape1.custom_Index = 10 - $opc.x * 10;

物体越多 透明度的层次越多

posted @ 2012-02-26 19:51  garçon  阅读(471)  评论(0)    收藏  举报