琥珀猫太郎のAutodesk Mayaの部屋
2013年10月30日水曜日
選択ポリゴン頂点を、選択ポリゴンフェースと選択エッジの交点に移動
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;
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;
登録:
投稿 (Atom)