ラベル curve の投稿を表示しています。 すべての投稿を表示
ラベル curve の投稿を表示しています。 すべての投稿を表示

2021年3月4日木曜日

カプセルの軌跡をモデリングする

  前回のスクリプトで作成したカプセルには"extentCurve"というカーブオブジェクトが存在しています。


  今回は、このカーブオブジェクトを使った小技というか、備忘録。
  エフェクトで、剣とか槍とか武器の軌道が欲しい場合に使えるかもしれません。

2021年1月14日木曜日

tryCurveObjectToolの覚書

  tryCurveObjectToolとは、リグのコントローラを作成するためにカーブオブジェクト作成する自作のツールです。

こんなの

  ただ、カーブオブジェクトは配置してみないと、その形状やサイズが適正なのかが分かりづらかったりします。そのため、配置用のスクリプトを何度も何度も書いている気がするので覚書。

2020年3月9日月曜日

エディットポイントを繋げたように見せるツール

リグのコントローラを作るとき、カーブオブジェクトだけでコントローラを作っておけば、ビューパネルの Show メニューから簡単に表示の切り替えを行えます。
ただ、立体的なカーブオブジェクトを作るとなると、一筆書きの要領で作る必要があり、なかなか大変です。

そんなときに役立つツールを作ってみました。


trySewCurveEP.mel


2020年2月17日月曜日

カーブオブジェクトを作成するツールを作ってみた

カーブオブジェクトを作成するツールを作ろうと思っていたんですが、かなり時間が掛かってしまった感じ。
実行部分はかなり昔に出来上がっていたりはしたんですが、一番厄介なGUI作成に時間がかかりました。
このブログを書き始めた頃なので構想5年くらい?

2019年10月21日月曜日

カーブのエディットポイントをmoveコマンドで移動させる

リグを作っていると、コントローラ用のカーブオブジェクトを変形させるためにエディットポイントを移動させる事があります。
ただ、MELだけで移動させようとすると変なエラーが出て止まってしまうことがあるのです。

2017年12月12日火曜日

カーブオブジェクトの座標をスクリプトで使いやすくプリントする

昔、カーブオブジェクトのEP座標を表示するスクリプトを作ったのですが、スクリプトに組み込むには少し使い勝手が悪かったので、用途を限定し作り直してみました。

tryPrintCurveEP.mel


こんな感じでカーブオブジェクトを作成したら、選択状態でコマンドラインへ
tryPrintCurveEP 桁数
で実行。


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"はリグ作成スクリプトのサポート用。


2015年5月27日水曜日

カーブスフィアを作成する。

createCurveObject.melを使って、球のカーブオブジェクトを作成するMEL。


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



createCurveSphere( 24,5 );で、ikHandleで使うような球体のカーブオブジェクト。
createCurveSphere( 4,5 );で、poleVectorで使うような八面体のカーブオブジェクトになります。

応用で、

{
    string $crv=createCurveSphere( 4,5 );
    select -r ($crv+".ep[7]") ($crv+".ep[12] ");
    doDelete;
    
}


とすると、ピラミッド型になります。


2015年5月26日火曜日

カーブオブジェクトを作成する

リグを作成するとき、ほとんどの場合カーブオブジェクトでコントローラを作成すると思いますが、そのカーブオブジェクトを作成するコードを補佐するmelスクリプト。


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


こんな感じになります。

8行目、renameコマンドへ返ってきたカーブ名を渡すことで即座にリネームできるのがミソです。
直線のカーブオブジェクトしか作れないというのが欠点ですかね・・・。



多くのリガーが使用しているであろうrigging101.comrig101 Wire Controllersは、カーブの座標がベタ書きなので可読性が悪く、なんとなくよろしくないですね。