2013年10月29日火曜日

移動の値を、ワールド回転ピボットの値に、一致

// 移動の値を、ワールド回転ピボットの値に、一致
// 複数選択可、親ノード選択では、子ノードに影響を与えない仕様

// global グローバル変数
// proc プロシージャの定義
global proc transformEqualWorldRotatePivotKohakunekotarou(){
    // ls:シーン内のオブジェクトの名前(およびオプションでタイプ名)を返す
    // -selection:現在選択しているオブジェクト
    // -objectsOnly:オブジェクト名のみが返され、コンポーネントやアトリビュートは無視
    // -transforms:トランスフォーム オブジェクト
    // ``:`でコマンドを囲み、返り値を取得(アサイン)
    string $selectTransformList[] = `ls -selection -objectsOnly -transforms`;

    // size:配列の要素数または文字列の文字数を返す
    if(`size $selectTransformList` != 0){
        // Bの要素を順番にひとつづつ取り出してAに代入しブロックを実行する
        // 例:for($A in $B){ブロック}
        string $nodeName;
        for($nodeName in $selectTransformList){
            // ワールド回転ピボットの値を取得
            // xform:変換ノードにおける、あらゆる要素の照会/設定
            // -query:値を取得する(質問を問いかける)
            // -worldSpace:ワールド空間
            // -rotatePivot:回転ピボット
            float $hozonWorldRotatePivot[] = `xform -query -worldSpace -rotatePivot $nodeName`;

            // ワールドスペースで回転ピボットを基準に原点へ移動
            // move:ジオメトリ オブジェクトの位置を変更
            // -rotatePivotRelative:オブジェクトの回転ピボット ポイントを基準に移動
            move -worldSpace -rotatePivotRelative 0 0 0 $nodeName;

            // トランスフォームのみフリーズ
            // makeIdentity:選択したトランスフォーム、およびシェイプレベルまでのすべての子を
            // ID 変換でリセット
            // -apply:トランスフォーム ピボットのワールド空間での位置が保持されて
            // シェイプが移動しないように、トランスフォームが ID になった後で
            // 累積されたトランスフォームがシェイプに適用
            // -translate:平行移動のみがシェイプに適用されます。平行移動は、0, 0, 0 に変更
            // -rotate:回転のみがシェイプに適用されます。回転は、0, 0, 0 に変更されます。
            // -scale:スケールのみがシェイプに適用されます。スケール係数は、1, 1, 1 に変更
            // -normal:ポリゴン オブジェクトの法線がフリーズ(ロック)されます。
            // -preserveNormals:ポリゴン オブジェクトの法線は、オブジェクトが 
            // 負にスケールされる(反射)と反転されます。
            makeIdentity -apply true -translate true -rotate false -scale false -normal 0 -preserveNormals true $nodeName;

            // 保存しておいたワールド回転ピボットの位置に戻す
            move -worldSpace -rotatePivotRelative $hozonWorldRotatePivot[0] $hozonWorldRotatePivot[1] $hozonWorldRotatePivot[2] $nodeName;
        }
    }else{
        // オブジェクトが1つも選択されていない時の処理
        // warning:警告の表示
        warning "オブジェクトを選択してください。";
    }
}

// 実行
transformEqualWorldRotatePivotKohakunekotarou;

0 件のコメント:

コメントを投稿