maya particle 模拟僵尸新娘斗篷飞散之instance物体的opacity
之前在公司的时候,测试的一段僵尸新娘里面的斗篷怎么变成蝴蝶飞掉的。 其中的难点在于:1 如何自然的让蝴蝶逐渐的从斗篷上脱落。 2 斗篷飞动的同时,如何让instance的rotation 保持一致。 最终效果:
下边是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;
**
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;
物体越多 透明度的层次越多
在粒子的Run time中可以这样写:
vector $opc = particleShape1.opacityPP;
particleShape1.custom_Index = 10 - $opc.x * 10;
物体越多 透明度的层次越多