Maya キューブ上に分割されたオブジェクトをアニメーションする MEL スクリプト改良 | puarts.com
映像・CG・画像処理関連の技術情報、個人作品の創作記録、メモなど
Category

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

公開日: 2016/06/29 | カテゴリ: Maya | タグ:

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


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

にほんブログ村 デザインブログ グラフィックアートへ
Links

参考になりそうなブログやサイトを見つけたら勝手にリンクを貼らせてもらっています。
リンク削除を希望の場合はお手数ですがメールにてご一報下さい。
Ke-Sen Huang's Home Page        Disney Research        VIDEO COPILOT        AbandonedArt.org
ryoji ikeda        チームラボ        トルク with AR三兄弟        DAITO MANABE

Copyright(C)2006-2017 wsp All Rights Reserved