2013年10月30日水曜日

ポリゴンエッジの長さを求める














arclen コマンド
カーブの円弧長を返すそうですが
ポリゴンエッジの長さも求められます
(ポリゴンエッジもカーブのようです)

選択ポリゴン頂点を、選択ポリゴンフェースと選択エッジの交点に移動


UnitBusさんのBBSに投稿させて頂いたMEL
// ポリゴンフェースと2点を繋ぐ直線の交点を求める
// 引数 string フェイス名 , string エッジ始点 , string エッジ終点
// 戻り値 float[] 交点の座標 [0]=x,[1]=y,[2]=z
global proc float[] polyFaceToEdgeNoKoutenMotomeruKohakunekotarou(string $heimen,string $siten,string $syuuten){
    //// 平面の法線ベクトルを (nx, ny, nz) を求める
    // フェースの法線を求める
    string $ns[] = `polyInfo -faceNormals $heimen`;
 
    string $tokenizedList[];
    // 項目のリストを表す文字列を取ります
    tokenizeList($ns[0],$tokenizedList);
    float $nx = $tokenizedList[2];
    float $ny = $tokenizedList[3];
    float $nz = $tokenizedList[4];
 
    //// 平面上の任意の一点(xp0, yp0, zp0)を求める
    // ポリゴンフェースのみリストされているので、そのフェイスに含まれる頂点の情報を取得
    string $heimenNiniPoint[] = `polyListComponentConversion -toVertex $heimen`;
    string $heimenNoTen[] = `filterExpand -sm 31 $heimenNiniPoint`;
 
    //// 平面の一点の座標を取り出す
    float $heimenNiniPointZahyou[3] = `pointPosition $heimenNoTen[0]`;
    float $xp0 = $heimenNiniPointZahyou[0];
    float $yp0 = $heimenNiniPointZahyou[1];
    float $zp0 = $heimenNiniPointZahyou[2];
 
    //// 直線に平行な単位ベクトル (ax, ay, az)を求める
    // 始点終点のワールド座標を求める
    float $sitenPosition[] = `pointPosition -world $siten`;
    float $syuutenPosition[] = `pointPosition -world $syuuten`;
    // エッジのベクトルを求める(終点の座標から始点の座標を引き算する)
    float $ejjiVectorAtaiX = $sitenPosition[0] - $syuutenPosition[0];
    float $ejjiVectorAtaiY = $sitenPosition[1] - $syuutenPosition[1];
    float $ejjiVectorAtaiZ = $sitenPosition[2] - $syuutenPosition[2];
 
    // 単位ベクトル
    vector $ejjiTaniVector = `unit <<$ejjiVectorAtaiX,$ejjiVectorAtaiY,$ejjiVectorAtaiZ>>`;
    float $ax = $ejjiTaniVector.x;
    float $ay = $ejjiTaniVector.y;
    float $az = $ejjiTaniVector.z;
 
    //// 直線上の任意の点(xl0, yl0, zl0)を求める
    float $xl0 = $sitenPosition[0];
    float $yl0 = $sitenPosition[1];
    float $zl0 = $sitenPosition[2];
 
    //点P(xp0,yp0,zp0) を通り,方向ベクトルが(nx,ny,nz)の直線の方程式・・・1
    // x= xp0 + t*nx
    // y= yp0 + t*ny
    // z= zp0 + t*nz
 
    // 点P(xl0,yl0,zl0)を通り,法線ベクトルが(ax,ay,az)の平面の方程式・・・2
    // ax(x-xl0) + ay(y-yl0) + az(z-zl0) = 0 
 
    // 1と2の式よりtを求める・・・3
    // t = (nx(xp0 - xl0) + ny(yp0 -yl0) + nz(zp0 -zl0)) / (nx*ax + ny*ay + nz*az)
    float $t = ($nx * ($xp0 - $xl0) + $ny * ($yp0 - $yl0) + $nz * ($zp0 - $zl0)) / ($nx * $ax + $ny * $ay + $nz * $az);
 
    // 1に3を代入して平面と直線の交点を求める
    float $heimenToSenNoKoutenX = $ax * $t + $xl0;
    float $heimenToSenNoKoutenY = $ay * $t + $yl0;
    float $heimenToSenNoKoutenZ = $az * $t + $zl0;
    return {$heimenToSenNoKoutenX,$heimenToSenNoKoutenY,$heimenToSenNoKoutenZ};
}
 
//選択ポリゴン頂点を、選択ポリゴンフェースと選択エッジの交点に移動
global proc pointSetPolyFaceToEdgeNoKoutenNiKohakunekotarou(){
    string $nekonekoSelectList[] = `ls -selection`;
     
    // ポリゴンフェースのみリスト
    string $taisyouHeimen[] = `filterExpand -sm 34 $nekonekoSelectList`;
    if(`size $taisyouHeimen` == 0){
        warning "ポリゴンフェースが選択されていません。";
        return;
    }
     
    // エッジのみリスト
    string $taisyouEjji[] = `filterExpand -sm 32 $nekonekoSelectList`;
    if(`size $taisyouEjji` == 0){
        warning "ポリゴンエッジが選択されていません。";
        return;
    }
    // 線の長さが0の時の処理
    // エッジの長さを求める
    if(`arclen $taisyouEjji[0]` == 0){
        warning "長さが0のエッジを選択しています。";
        return;
    }
    // 頂点に変換
    string $taisyouTen[] = `polyListComponentConversion -toVertex $taisyouEjji[0]`;
    // vtx[0:4]といった値で帰ってくるのでfilterExpandコマンドで分解
    string $sitenSyuuten[] = `filterExpand -selectionMask 31 $taisyouTen`;
 
    // 移動させるポリゴン頂点のみリスト
    string $taisyouPoint[] = `filterExpand -sm 31 $nekonekoSelectList`;
    if(`size $taisyouPoint` == 0){
        warning "ポリゴン頂点が選択されていません。";
        return;
    }
     
    // 交点を取得
    float $kouten[3] = `polyFaceToEdgeNoKoutenMotomeruKohakunekotarou$taisyouHeimen[0] $sitenSyuuten[0] $sitenSyuuten[1]`;
     
    // 頂点を求めた交点に移動
    move -worldSpace $kouten[0] $kouten[1] $kouten[2] $taisyouPoint[0];
     
    // 結果
    print("// Result: move -ws " + $kouten[0] + " " + $kouten[1] + " " + $kouten[2] + " " + $taisyouPoint[0] + " //\n");
}
 
// 実行
pointSetPolyFaceToEdgeNoKoutenNiKohakunekotarou;

シェーディングOnOff

// シェーディングOnOff
global proc shadingOnOffKohakunekotarou(){
    // オブジェクトのみリスト取得
    string $SelectObjectList[] = `ls -sl -selection -objectsOnly`;
    if (`size $SelectObjectList` != 0){
        int $flg;
        for($n in $SelectObjectList){
            // オーバーライド有効化のフラグを取得
            $flg = (!$flg = `getAttr ($n + ".overrideEnabled") `);
            // アトリビュート値の設定
            setAttr ($n + ".overrideEnabled") $flg;
            // 1: Drawing Overrides Shading On
            setAttr ($n + ".overrideShading") (!$flg);
        }
    }else{
        warning "オブジェクトが選択されていません。";
    }
}

// 実行
shadingOnOffKohakunekotarou;

MMDのデータをAutodesk Mayaに読み込む

PMXIO for Maya

2013年10月29日火曜日

バウンディングボックスOnOff

// バウンディングボックスOnOff
global proc boundingBoxOnOffKohakunekotarou(){
    // オブジェクトのみリスト取得
    string $SelectObjectList[] = `ls -sl -selection -objectsOnly`;
    if (`size $SelectObjectList` != 0){
        int $flg;
        for($n in $SelectObjectList){
            // オーバーライド有効化のフラグを取得
            $flg = `getAttr ($n + ".overrideEnabled") `;
            // !:true→false、false→true
            $flg =  !$flg;
            setAttr ($n + ".overrideEnabled")  $flg;
            setAttr ($n + ".overrideLevelOfDetail")  $flg;
           }
    }else{
        warning "オブジェクトが選択されていません。";
    }
}

// 実行
boundingBoxOnOffKohakunekotarou;

リファレンスOnOff

// リファレンスOnOff
global proc referenceOnOffKohakunekotarou(){
    // オブジェクトのみリスト取得
    string $SelectObjectList[] = `ls -sl -selection -objectsOnly`;
    if (`size $SelectObjectList` != 0){
        int $flg;
        int $flg2;
        for($n in $SelectObjectList){
            // オーバーライド有効化のフラグを取得
            $flg = `getAttr ($n + ".overrideEnabled") `;
            // !:true→false、false→true
            $flg =  !$flg;
            if($flg == 0){
                $flg2 = 0;
            }else{
                $flg2 = 2;
            }
            setAttr ($n + ".overrideEnabled")  $flg;
            setAttr ($n + ".overrideDisplayType")  $flg2;
        }
    }else{
        warning "オブジェクトが選択されていません。";
    }
}

// 実行
referenceOnOffKohakunekotarou;

テンプレートOnOff

// テンプレートOnOff
global proc templateOnOffKohakunekotarou(){
    // オブジェクトのみリスト取得
    string $SelectObjectList[] = `ls -sl -selection -objectsOnly`;
    if (`size $SelectObjectList` != 0){
        int $flg;
        for($n in $SelectObjectList){
            // オーバーライド有効化のフラグを取得
            $flg = `getAttr ($n + ".overrideEnabled") `;
            // !:true→false、false→true
            $flg =  !$flg;
            setAttr ($n + ".overrideEnabled")  $flg;
            setAttr ($n + ".overrideDisplayType")  $flg;
        }
    }else{
        warning "オブジェクトが選択されていません。";
    }
}

// 実行
templateOnOffKohakunekotarou;