2015年12月14日月曜日

MELのファイル名を考察

MELは基本的に、ファイル名と同じ名称のグローパルプロシージャが起動時に登録されてコマンドとして実行できるようになっている。

なので、公式のスクリプトとプロシージャ名が重複していると誤作動するため、自作のスクリプトには、イニシャルやプロジェクト名なんかを HG_hogeHoge.mel みたいな感じで先頭につけて作ったりすることが多い。

しかし、アンダーバーで区切るのはスクリプト作っていて文面的になんか気持ち悪い。
タイピングのリズムとか。
見た目のバランスとか。

単にアンダーバーを省くのも芸が無いし、イニシャルだと子音が入っていてカッコ悪い。

余り長い接頭辞でもうざいし。


などとあれこれ考えていたところ、名前の方の子音を省いて見ようと思い立った。

ただjavaスクリプトに同じ関数あるからなぁ・・・。
と思いつつtryを使っていくか。

2015年11月30日月曜日

uiConfigurationScriptNodeを作らせない

ぐぐたすから探し出すのが大変なのでブログへ再投稿。

global int $gUseSaveScenePanelConfig;
global int $gUseScenePanelConfig;
if( $gUseSaveScenePanelConfig ) $gUseSaveScenePanelConfig=0;
if( $gUseScenePanelConfig ) $gUseScenePanelConfig=0;


起動時に実行するようなスクリプトへ記入しておく。


uiConfigurationScriptNodeは読んで字の如く、mayaのUIを復元する為のスクリプトノード。
昔はそうでもなかったが、バージョン番号が年号になってからシーンファイル内における割合が極端に多くなったような気がする。
メインウィンドウだけの状態でも100KBくらいは行くんじゃないだろうか・・・。
しかもmayaBinaryで保存してもASCIIのままなので圧縮が掛からないという。

カスタムレイアウトなんか作ったりした日にゃ目も当てられない。

なぜシーンファイルに入れるのか謎なノード。


ちなみにドキュメントにも
ヒント:
リファレンス ファイルとして使用するオブジェクト/サブシーンを作成する場合は、このオプションを無効にしてください。既定では、Maya は開かれたすべてのエディタについてのあらゆる情報、すべてのシーン ファイル(.ma/.mb)の場所、サイズ、ウィンドウ固有のオプションなどを記憶しています。これは、uiConfigurationScriptNode という名前のスクリプト ノードにアトリビュートとして保存され、ノードの文字列型アトリビュートに追加された MEL コードとして表されます。
とあるし、作成仕様に作らないよう注意書きしても無視するしな。

素人さんはもとより職種によっては中級者くらいな人でも、平気でuiConfigurationScriptNodeの入ったsceneファイルを納品してくるのは、なんだかなぁ~。


---------------------
このノードを無効化するには、こちらを参考にしてみてください。

2015年11月17日火曜日

2つの画像を比較してみる【改】

前回、imconvert.exeを使って画像の差を数値化してみましたが、どうも、mayaのバージョンによってimconvert.exeの方にも差があるらしく希望の値を取得できないことが発覚。

しかもTruecolorだと、meanの値が使っている色によって偏ってしまうことも判明。

という事で、-compose differenceした画像をグレースケールに変換してから-identify -verboseを取得するようにしたらどうかと思い修正。

@echo off
title %~n0

set WORK_AREA=%~dp0
set MAYA_BIN=C:\Program Files\Autodesk\MayaLT2016\bin\


:: 比較する画像
set IMG_A=%1
set IMG_B=%2
:: 存在確認
if ""=="%IMG_A%" echo IMG_A is blank. & pause & exit /b
if ""=="%IMG_B%" echo IMG_B is blank. & pause & exit /b
if not exist "%IMG_A%" echo %IMG_A% not found. & pause & exit /b
if not exist "%IMG_B%" echo %IMG_B% not found. & pause & exit /b


:: imconvertの作業エリア作成
set IMCNV_TMP=%WORK_AREA%_tmp
if not exist "%IMCNV_TMP%" md "%IMCNV_TMP%"

:: 差分画像のファイル名
set OUT_IMG=%IMCNV_TMP%\out.png
:: ログファイル名
set VRBS_FILE=%IMCNV_TMP%\verbose
set MEAN_FILE=%IMCNV_TMP%\mean


:: imconvert実行
"%MAYA_BIN%imconvert.exe" -composite -compose difference "%IMG_A%" "%IMG_B%" "%OUT_IMG%"
"%MAYA_BIN%imconvert.exe" -depth 8 -type Grayscale "%OUT_IMG%" "%OUT_IMG%"
"%MAYA_BIN%imconvert.exe" -identify -verbose "%OUT_IMG%" "%OUT_IMG%">%VRBS_FILE%


:: 結果解析
find "mean:" %VRBS_FILE% | find "mean:">%MEAN_FILE%
set RESULT_MEAN=
for /F "tokens=1-3" %%A in (%MEAN_FILE%) do set RESULT_MEAN=%%B


:: 結果表示
echo %RESULT_MEAN%
pause



前のよりもソレっぽい値が出てきた!

2015年11月15日日曜日

2つの画像を比較してみる※mayaをインストールした人用

とある目的で、2つの画像を比較し、違いがどれくらいなのかを数値で表せられないかとネットで調べていたところ、ImageMagickで数値化できそうなことを発見。

しかしツールを新規にインストールするのは美学に反するので、今ある環境でどうにかします。


mayaをインストールするとmayaのbinフォルダ内に幾つかの.exeファイルを見つけることができます。
その中でimconvert.exeというのが、実はImageMagickであるというのは数年前から知っていたので、これを使います。

ただ、本家よりもかなり機能や使い方が変更されているのでなかなか難航。
imconvert.exe -hと本家のリファレンスを見比べつつ、必要なオプションを割り出していきます。


本家のほうには、
compare -metric PSNR

とすることで数値化できるっぽいのですがimconvertの方には見つからず・・・。
似たことができないかとimconvertのヘルプを読んでいると、-identify -verboseを使えば出来そうな予感。

実際、ログを見てみると欲しい情報のmean: ~を発見。
ただ、これだと2つの画像の比較が出来ず、ファイル情報を垂れ流すだけ。
もうひと手間必要。

ファイルの情報が取れるということは、差分の画像ファイルを作ることができれば、そのファイルの-identify -verbosを取ればよいということなので、今度は差分ファイルの作成方法を調べることに。


もともと、ImageMagickはファイル形式の変換や編集、合成をコマンドラインで行うツールのようなので、差分ファイルの作成方法は割と簡単に判明。
-composite -compose difference で作れるらしい。

@echo off

set WORK_AREA=%~dp0
set MAYA_BIN=C:\Program Files\Autodesk\MayaLT2016\bin\

:: 比較する画像
set IMG_A=%WORK_AREA%A.bmp
set IMG_B=%WORK_AREA%B.bmp

:: 結果画像
set OUT_IMG=%WORK_AREA%C.bmp


:: imconvert実行
"%MAYA_BIN%imconvert.exe" -composite -compose difference "%IMG_A%" "%IMG_B%" "%OUT_IMG%"

pause



 
A.bmp      B.bmp    C.bmp

この差分ファイルのC.bmpに対して-identify -verbose を使用する。
なんとなく欲しいデータが取れそう。

これを元にバッチファイルを作成。

@echo off
title %~n0

set WORK_AREA=%~dp0
set MAYA_BIN=C:\Program Files\Autodesk\MayaLT2016\bin\


:: 比較する画像
set IMG_A=%1
set IMG_B=%2
:: 存在確認
if ""=="%IMG_A%" echo IMG_A is blank. & pause & exit /b
if ""=="%IMG_B%" echo IMG_B is blank. & pause & exit /b
if not exist "%IMG_A%" echo %IMG_A% not found. & pause & exit /b
if not exist "%IMG_B%" echo %IMG_B% not found. & pause & exit /b


:: imconvertの作業エリア作成
set IMCNV_TMP=%WORK_AREA%_tmp
if not exist "%IMCNV_TMP%" md "%IMCNV_TMP%"

:: 差分画像のファイル名
set OUT_IMG=%IMCNV_TMP%\out.png
:: ログファイル名
set VRBS_FILE=%IMCNV_TMP%\verbose
set MEAN_FILE=%IMCNV_TMP%\mean


:: imconvert実行
"%MAYA_BIN%imconvert.exe" -composite -compose difference "%IMG_A%" "%IMG_B%" "%OUT_IMG%"
"%MAYA_BIN%imconvert.exe" -identify -verbose "%OUT_IMG%" "%OUT_IMG%">%VRBS_FILE%


:: 結果解析
find "mean:" %VRBS_FILE% | find "mean:">%MEAN_FILE%
set RESULT_MEAN=
for /F "tokens=1-3" %%A in (%MEAN_FILE%) do set RESULT_MEAN=%%B


:: 結果表示
echo %RESULT_MEAN%
pause


画像ファイルを2つ、このバッチファイルへドラッグ&ドロップすると違いの数値が出てくる。


2015年9月17日木曜日

EXCELの条件付き書式(覚書)

最近は、もっぱらリボンUIのタブから選んで設定してばかりいたので、
自前で条件付き書式を書くことが減り、基本的な部分を忘れていた。

書式ルールに数式を選んだ場合、返ってきた値が1だと書式を変えて、
0だとそのまま。
当たり前か。

なので、

=IF($A1="hogehoge",1,0)


となっているとき、該当のセルが「hogehoge」だったら書式が変わる。


dir /s /b のリダイレクトで作ったリストなんかの場合、

=IF($A1=$A2,0,1)


とかにしておけば、階層の切り替わった行に色付けできる。


しかし、LOOKUP関数の使い方とかさっぱり忘れてしまったなぁ・・・。
復習しとくか。


2015年7月10日金曜日

ファイルリスト作成のTips

けっこうな数のフォルダに散らばっている特定のファイルのリストを作成する場合、
コマンドプロンプトを使用すると手軽にリストを作成できます。


エクスプローラのアドレスバーへcmdと入力して[Enter]


すると、開いているフォルダへのパスが通った状態でコマンドプロンプトが開きます。

そこで、

dir /s /b *.tga>tgaList.txt


と入力。

すると、開いているフォルダにtgaList.txtが作られ、中身にはフルパスな
.tgaファイルのリストが記述されています。

mayabatchに送るためのmayaファイルのリストをつくったりするのにも便利。

dir /s /b chara???.ma>maList.txt



とかだと、特定のファイル名に絞込んだ状態のリストにすることも可能。

dirの結果をfindに送って、更に詳細な絞込みを行うと、テキストエディタの
置換処理の数を減らせます。


他にも、例えば、ファイルのサイズやタイムスタンプが欲しい場合、

dir /s /-c *.tga|find ".tga">tgaTimeStamp.txt



みたいにすると、あっという間に必要な情報を取得可能。
詳細表示をメモる必要はありません。



しかし、コマンドプロンプトって、Windows10でも使えるのかなぁ・・・
PowerShellに移行になってしまうのだろうか?



2015年7月3日金曜日

findコマンドについて

ms-dos、findコマンドのヘルプから
ファイル (複数可) 内のテキスト文字列を検索します。
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "文字列" [[ドライブ:][パス]ファイル名[...]]
  /V        指定した文字列を含まない行をすべて表示します。
  /C        指定した文字列を含む行の数だけを表示します。
  /N        行番号を表示します。
  /I        大文字と小文字の区別をしないで検索します。
  /OFF[LINE] オフライン属性が設定されたファイルをスキップしません。
  "文字列"  検索する文字列を指定します。
  [ドライブ:][パス]ファイル名
            検索するファイル (複数可) を指定します。
パスが指定されていないときは、プロンプトで入力されたテキストまた
は別のコマンドからパイプ処理で渡されたテキストを検索します。


このコマンドを使用すると、なぜか
---------- [[ドライブ:][パス]ファイル名[...]]ヒットした行1ヒットした行2



と出てくる。ハッキリ云って先頭の
---------- [[ドライブ:][パス]ファイル名[...]]
は要らない・・・。

コレを出さないようにするには、

find "文字列" %FILE_NAME% | find "文字列"

とすれば必要な部分だけに整形された。

ただ、ヒットさせた行を fortokens で分割させようとしたときに問題が・・・。

for /f "tokens=1-3" %%a in ('find "文字列" %FILE_NAME% | find "文字列" %FILE_NAME%') do echo %%a %%b %%c

みたいな事はできない。
for /f "tokens=1-3" %%a in ('find "文字列" %FILE_NAME%') do echo %%a %%b %%c

を注意深く観察すると、
  1. ---------- [[ドライブ:][パス]ファイル名[...]]
  2. ヒットした行1
  3. ヒットした行2

のような感じで、行数分ループしていた。
で、1行目だけ要らないので、コメント行扱いにする eol を使用する。
for /f "eol=- tokens=1-3" %%a in ('find "文字列" %FILE_NAME%') do echo %%a %%b %%c

これで無事 find でヒットした行をtokenizeさせることができた。

2015年5月31日日曜日

mayaを起動するバッチ

普通のmayaと同じような感じで、mayaLTも起動バッチから実行できるようだったので、本格的にバッチファイルを作成。

まず、windowsの環境変数に
MAYA2016LT="C:\Program Files\Autodesk\MayaLT2016"
を設定。初期設定でインストールするとパスはこんな感じ。ただし、binまでは含めない

バッチファイルの内容は、

@echo off
title %0

if not defined MAYA2016LT goto :errEnv

set MAYA_UI_LANGUAGE=en_US

set MAYA_SCRIPT_PATH=%~dp0scripts
set MAYA_PLUG_IN_PATH=%~dp0plug-ins


if not "1"=="%1" goto :skipSaveLog
set MAYA_LOG_PATH=%~dp0_mayaCommandLog
if not exist %MAYA_LOG_PATH% md %MAYA_LOG_PATH%
set YYYYMMDD=%date%
set YYYYMMDD=%YYYYMMDD:/=%
set HHMMSS=%TIME%
set HHMMSS=%HHMMSS:~0,5%
set HHMMSS=%HHMMSS::=%
set MAYA_CMD_FILE_OUTPUT=%MAYA_LOG_PATH%\mayaCommand_%YYYYMMDD%_%HHMMSS%.log
:skipSaveLog



start "maya 2016 LT" "%MAYA2016LT%\bin\maya.exe" -hideConsole
goto :EOF



:errEnv
    echo 環境変数 MAYA2016LT が設定されていません。
    pause
    
    

バッチファイルと同じ階層にあるスクリプトフォルダやプラグインフォルダを追加して起動しています。
しかも、この起動バッチを基準にパスを指定しているので、多人数で環境を共有する場合や環境の移動も楽。


あと、このバッチファイルのショートカットを作ってプロパティのリンク先に
1

を追記することで、mayaのコマンド履歴が_mayaCommandLogフォルダの中にログファイルとして残ります。
単にバッチファイルを実行しただけではログが取れないというのが玄人向け。


やっぱ、色々と設定したバッチファイルからmayaを起動したほうが、何かと便利です。


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月28日木曜日

ReferenceEditor

mayaLTには、リグを作るうえでの基本機能、Reference Editorが無かった・・・orz

Namespace Editorはあるんだけどなぁ・・・
モデルの修正とかはどうするんだろ?


Game ExporterのAnimation Clipsは、かなり良さそう。

数年前にほぼ同じものを作ったことがあるけどオフィシャルツールというのが素敵。

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は、カーブの座標がベタ書きなので可読性が悪く、なんとなくよろしくないですね。

2015年5月25日月曜日

体験版のインストール

とりあえず体験版をインストールしてみた。

試用期間30日だと思ってたけど15日だった。


各種ユーティリティノードとか入っていたので一安心。

SplineIKも設定できたけど、mayaのほうのsplineIkと同じ感じな気がする・・。
どういうことだ?


日本語版をインストールしたが、環境変数MAYA_UI_LANGUAGE=en_USで英語UIに変更可能。
バッチファイルからの起動もできたので
set MAYA_UI_LANGUAGE=en_US
は、こっちで設定することにしよう。
起動オプションの方は要検証。


ヘルプは一緒にインストールされないみたいで、落とすかpreferenceでリンクを修正するとかが必要なのかな?


保存形式のほうは独自の.mlt形式で、バイナリファイルかぁ・・。


あとは、preferenceをどう変更したかをメモしとくか。


毎度の事ながら、メニューコマンドの配置が地味に変わっていて困るなぁ・・・。
LTだからかなぁ・・・?

2015年5月16日土曜日

SyntaxHighlighterのテスト

SyntaxHighlighterでうまくハイライトできるかな?

を、以前 google+ に投稿したフォルダを開くスクリプトでテスト。

css themesは"RDark"を使用。


global proc string openFolder()
{
    string $sceneName = `file -q -sn`;
    if(!`size $sceneName`) error("File Name Untiled.");
    
    string $path = toNativePath(`dirname $sceneName`);
    string $explorer=(`getenv "SystemRoot"`+"/explorer.exe");
    system ("start "+$explorer+" /n,"+$path);
    return $path;
    
}
maya2014以降@windows7

この部分のbrushは"php"
melの変数をハイライトしてくれている。


folderOpen();

function folderOpen()
{
    try{
        activeDocument.path.execute();
    }
    
    catch( err ){
        alert ( err, "folderOpen.jsx", true);
    }
    
}
photoshopCS6(64bit)@windows7

こっちのbrushは"js"




2015年5月15日金曜日

maya LTでスプラインIK?

公式の概要ビデオを観ていたら、2分10秒あたりでスプラインIK使っているんですが・・・?

普通のスプラインIKとは違うのか?


モデリングに関しては、MODOで出来ていた事がようやくmayaでもできるようになったかぁ。といった感じ。
さすがにコンターツールからブリッジでのリダクションみたいな事はまだできないようだけど。

mayaでモデリングやベイクシミュレーションをするとゴミノードができまくるので後始末が大変。
まだモデリングにMODOは手放せないかも。モデリングだけなら。



Maya LT (Desktop Subscription)サポートなしで年間36,000円は、趣味で使う分には意外と安いのかもしれない。

2015年5月12日火曜日

maya LT

mayaとmaya LTが、どの程度違うかを少し調べてみた。 

自分的に、mayaでパーティクル、ダイナミクス、レンダリングは使わないので問題なし。
ほんとは Turtleも無くてよいんだけどなぁ。

MELがメインなのでPythonも不要。SDKもしかり。

デフォーマを使うようなリグを作ることは、今のところ無いので問題なし。


比較表を見ていて気になった項目が、

  • アニメーションレイヤ
  • スケールコンストレイント
  • 内蔵スプラインIK
  • 独自ツールのUIをカスタマイズ※なんぞこれ
  • ノード関係の表示と編集
  • プロダクション アセット管理


このあたり。
リグを作る場合、スプラインIKが使えないのは結構やっかいだなぁ。
もし、createNodeコマンドで計算系のノードが作れなかったりmatrixNodes.mllが使えなかったりしたら、けっこうイタい。

時間ができたら体験版をダウンロードして触ってみるかな。