Maya キューブ上に分割された壁の一部が飛び出すアニメーションを作る で作成した MEL スクリプトを改良して、複数のコントロールでキューブ上に分割されたオブジェクトを操作できるようにしました。
スクリプトを載せておきます。$targets にオブジェクトのパーツ群の名前配列を指定し、$locators にコントロールとなるlocatorの名前配列を渡します。
global proc CreateRepulsiveAnimation(string $targets[], string $locators[])
{
int $index = 0;
for ($locatorName in $locators)
{
addAttr -k true -ln "distanceThreshold" -at double $locatorName;
setAttr ($locatorName+".distanceThreshold") 10.0;
}
for ($target in $targets)
{
print("Creating expression for "+$index + "\n");
string $expName = "RepulsiveExpression";
string $exp="float $resultX = 0.0;\nfloat $resultY = 0.0;\nfloat $resultZ = 0.0;\nfloat $targetPos[] = {"+$target+".originX, "+$target+".originY, "+$target+".originZ};\n";
xform -cp $target;
addAttr -k true -ln "originX" -at double $target;
addAttr -k true -ln "originY" -at double $target;
addAttr -k true -ln "originZ" -at double $target;
float $rotatePivot[] = `xform -q -ws -rp $target`;
setAttr ($target+".originX") $rotatePivot[0];
setAttr ($target+".originY") $rotatePivot[1];
setAttr ($target+".originZ") $rotatePivot[2];
for ($locatorName in $locators)
{
$exp+="{\n float $dx = $targetPos[0] - "+$locatorName+".translateX;\n float $dy = $targetPos[1] - "+$locatorName+".translateY;\n float $dz = $targetPos[2] - "+$locatorName+".translateZ;\n\n float $dist = sqrt($dx * $dx + $dy * $dy + $dz * $dz);\n if ($dist < "+$locatorName+".distanceThreshold)\n {\n float $normMult = 1.0 / $dist;\n float $normDx = $dx * $normMult;\n float $normDy = $dy * $normMult;\n float $normDz = $dz * $normMult;\n float $t = ("+$locatorName+".distanceThreshold - $dist);\n $resultX += $normDx * $t;\n $resultY += $normDy * $t;\n $resultZ += $normDz * $t;\n }\n}";
}
$exp += $target + ".translateX = $resultX;\n"+$target+".translateY = $resultY;\n"+$target+".translateZ = $resultZ;";
expression -s $exp -n $expName;
++$index;
}
}
使用例
string $locatorNames[];
int $i;
for ($i = 0; $i < 3 ++$i)
{
string $tmp[] = `spaceLocator`;
$locatorNames[$i] = $tmp[0];
}
string $selections[] = `ls -sl`;
CreateRepulsiveAnimation($selections, $locatorNames);