2015年5月29日金曜日

カーブポイントの座標を表示する

リグ用のカーブオブジェクトを作ろうとしたとき、再利用するためにはカーブオブジェクトのポイント座標を調べる必要があります。
そんな時のためのスクリプト。


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


カーブオブジェクトを選択した状態で、

printCurvePointPositions( 2,"xform" );
printCurvePointPositions( 2,"list" );

のような感じに実行すると、スクリプトエディタのヒストリーに座標がプリントされます。

"xform"は左右反転のサポート用。
"list"はリグ作成スクリプトのサポート用。


0 件のコメント:

コメントを投稿