前回のスクリプトで作成したカプセルには"extentCurve"というカーブオブジェクトが存在しています。
今回は、このカーブオブジェクトを使った小技というか、備忘録。
エフェクトで、剣とか槍とか武器の軌道が欲しい場合に使えるかもしれません。
前回のスクリプトで作成したカプセルには"extentCurve"というカーブオブジェクトが存在しています。
今回は、このカーブオブジェクトを使った小技というか、備忘録。
エフェクトで、剣とか槍とか武器の軌道が欲しい場合に使えるかもしれません。
tryCurveObjectToolとは、リグのコントローラを作成するためにカーブオブジェクト作成する自作のツールです。
ただ、カーブオブジェクトは配置してみないと、その形状やサイズが適正なのかが分かりづらかったりします。そのため、配置用のスクリプトを何度も何度も書いている気がするので覚書。
proc string _round( int $digit, string $mode, float $value ) /****************************************************************************** 指定の桁数で切り上げる ******************************************************************************/ { float $mlt =pow( 10, $digit ); float $sub =pow( 10,-$digit ); float $pls =( 0<$value ) ? 0.5: -0.5; float $val =((int)(($value*$mlt)+$pls)*$sub); string $str =(string)$val; if("xform"==$mode) return $str; //------------------------------------------------------------------------------ if( !$digit ) return (( $val<0 ) ? $str: (" "+$str)); //------------------------------------------------------------------------------ // 少数の桁数をそろえる string $array[]=stringToStringArray( $str,"." ); if( 0<=$val ) $array[0]=(" "+$array[0]); while(`size $array[1]`<$digit ) $array[1]=($array[1]+"0"); return ($array[0]+"."+$array[1]); } global proc printCurvePointPositions( int $digit, // 少数部の桁数 string $mode ) // 表記方法 /****************************************************************************** main procidure. ******************************************************************************/ { string $objs[]=`ls -sl`; for( $obj in $objs ) { select -r ($obj+".ep[*]"); string $eps[]=`ls -sl -fl`; int $i=0; for( $e in $eps ) { vector $p=`xform -q -os -t $e`; string $x=`_round $digit $mode ($p.x)`; string $y=`_round $digit $mode ($p.y)`; string $z=`_round $digit $mode ($p.z)`; switch( $mode ) { case "xform": print ("xform -os -t "+$x+" "+$y+" "+$z+" "+$e+";\n"); break; case "list": print ("$pos["+$i+"]=<<"+$x+", "+$y+", "+$z+">>;\n"); break; } $i++; } } select -r $objs; }
global proc string createCurveSphere( // カーブ名を返す float $subdiv, // 粗さ:4,8,12,24,36(,360) float $radius ) // 球の半径 { float $div = 360.0/$subdiv; vector $pos[]; float $x,$y; // xy for( $i=0; $i<=$subdiv; $i++ ) { $x = cosd( $i * $div ); $y = sind( $i * $div ); $pos[size($pos)] = << $x, $y, 0.0 >> * $radius; // yz if( 270 == ($i * $div) ) { for( $j=0; $j<=$subdiv; $j++ ) { $x = cosd( $j * $div + 270 ); $y = sind( $j * $div + 270 ); $pos[size($pos)] = << 0.0, $y, $x >> * $radius; } } } // xz for( $i=1; $i<=$subdiv; $i++ ) { $x = cosd( $i * $div ); $y = sind( $i * $div ); $pos[size($pos)] = << $x, 0.0, $y >> * $radius; } return createCurveObject( $pos ); }
{ string $crv=createCurveSphere( 4,5 ); select -r ($crv+".ep[7]") ($crv+".ep[12] "); doDelete; }
global proc string createCurveObject( vector $positions[] ) { string $cmd ="curve -d 1"; vector $pos; int $size = size( $positions ); for( $i=0; $i<$size; $i++ ) { $pos = $positions[$i]; $cmd+=(" -p "+($pos.x)+" "+($pos.y)+" "+($pos.z)); } for( $i=0; $i<$size; $i++ ) $cmd+=(" -k "+$i); return eval( $cmd ); }座標のリストを渡すと、カーブオブジェクトの名前が返ってきます。 ドキュメントフォルダの中にあるmaya\scriptsのなかに"createCurveObject.mel"ファイルを作成して上をコピぺすると呼び出せます。
{ vector $pos[]; $pos[0]=<< 0,0,0>>; $pos[1]=<< 10,0,0>>; $pos[2]=<< 0,0,0>>; $pos[3]=<<-10,0,0>>; $pos[4]=<< 0,0,0>>; rename `createCurveObject $pos` "testCrvObj"; }