ロゴ メインコンテンツへ
RSSフィード
「デジタルコンテンツ制作」に関連する記事一覧

Maya キューブ上に分割されたオブジェクトをアニメーションする MEL スクリプト改良

2016/06/29
(この記事の文字数: 178)

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


  このエントリーをはてなブックマークに追加  

<<「デジタルコンテンツ制作」の記事一覧に戻る

コメント(0 件)



コンテンツロード: 0.0086 sec
Copyright(C)2006-2024 puarts All Rights Reserved