2014年8月31日日曜日

yjp_DetachBindShelf

これでデタッチするとバックアップオブジェが作られてウエイトがコピーされます。
バインドするシェルフが作られているので、
クリックするとフリーズとヒストリを消してバインドされ
バックアップオブジェからウエイトがコピーされます。
global proc yjp_DetachBindShelf()
{
    string $objs[] = `ls -sl`;
    if( size($objs) == 0 )return;

    string $sc = `findRelatedSkinCluster $objs[0]`;
    if( size($sc) == 0 )return;
 
//バックアップオブジェクト
    string $backupobj[] = `duplicate $objs[0]`;
    setAttr ($backupobj[0] + ".visibility") 0;
    setAttr -lock 0 ($backupobj[0] + ".tx");
    setAttr -lock 0 ($backupobj[0] + ".ty");
    setAttr -lock 0 ($backupobj[0] + ".tz");
    setAttr -lock 0 ($backupobj[0] + ".rx");
    setAttr -lock 0 ($backupobj[0] + ".ry");
    setAttr -lock 0 ($backupobj[0] + ".rz");
    setAttr -lock 0 ($backupobj[0] + ".sx");
    setAttr -lock 0 ($backupobj[0] + ".sy");
    setAttr -lock 0 ($backupobj[0] + ".sz");

string $jointlistname[] = `listConnections -type "joint" ($sc +".matrix")`;
    string $resStr = stringArrayToString($jointlistname, " ");
    int $maxInf = `getAttr ($sc + ".maxInfluences")`;
    currentTime 0 ;
 
//バックアップオブジェクトにウエイトコピー
string $yjpscname[] = `skinCluster -mi 1 -omi true -dr 4 -rui true -tsb $jointlistname $backupobj[0]`;

copySkinWeights -ss $sc -ds $yjpscname[0];
    //シェルフの処理
string $script = ("select " + $objs[0] + ";\nFreezeTransformations;\nDeleteHistory;\nstring $sc[] = `skinCluster -omi true -dr 4 -rui true -mi " + $maxInf + " -tsb " + $resStr + " " + $objs[0] + "`;\ncopySkinWeights -ss " + $yjpscname[0] + " -ds $sc[0];\ndelete " + $backupobj[0] + ";\n");
 
select -r $objs[0];
//ここに他のウエイトを保存する処理を追加しておくと便利

//デタッチ
DetachSkin;
 
    textToShelf ($objs[0], $script);
    return ;
}


一応、思いついたのができました。
setAttr -lockのところもうちょっと簡単にできないかな。

あとはシェルフ実行したら消したほうがいいが、消し方が分からない。

2014年8月30日土曜日

バインド関係のメモ


string $skincluster = `findRelatedSkinCluster $object`;

オブジェクトからSkinClusterを取得できるみたいですね。

string $jointlistname[] = `listConnections -type "joint" ($skincluster  +".matrix")`;

これでその関連するジョイントを取得できる様子


2014年8月27日水曜日

何回もバインド

メッシュ作ってバインドしてウエイト塗ってウエイト保存して動かして
デタッチしてメッシュ修正してバインドして
これの繰り返し

何か良い方法無いのかなー。
Maya2015のボクセルバインド?が良さそうなんだけど

今、考えているのは
ツールでデタッチ前にウエイトコピーして使用ジョイントを取得してデタッチ
シェルフにメッシュとジョイント選択してバインドしてウエイトインポートを記述

こんな感じのができれば、メッシュ修正前にツールを実行して修正できたらシェルフボタンで元通り
でもメッシュいじりすぎるとウエイト消えるしなー。

何か良い方法をググルか

2014年8月26日火曜日

研究が必要

スケールも自由にできるリグは難しいなー。
親がスケールしたら子も動くなー。
たしかできたと思ったんだけど。
今度ゆっくり考える。

今のFKを入れるツールでフェイシャルリグとして使うにはコントローラーがでかすぎ。
いろんなバリエーションのカーブを用意しておいたほうが便利。
セットアップは早いけどカーブコントローラの調整に時間がかかる。
フェイシャルリグらしい機能を追加していこうかな。

オブジェクトをビジビリティで切り替えるツールがリグセットアップに入ってる。
追加されたアトリビュートの数値1・2・3・・・でオブジェ表示が切り替わります。
結構便利、リグ組まずに単体としても使えるようにしよう。

SRT_CopyPaste

SRT_CopyPaste

はじめに選んだオブジェクトの値を次に選んだオブジェクトに
グローバル座標の位置、回転スケールのコピーができます。

それだけです。

2014年8月22日金曜日

VertexNormalCTRL

VertexNormalCTRL

ノーマルをコピーペーストできます。

これは標準でありそうなんですけど、昔に作りました。
アベレージが欲しいところですね。

2014年8月21日木曜日

SelectJointArray

■内容
2つのジョイント間のすべてジョイントを配列で返す

■入力
string $StartJointName RootJoint
string $EndJointName EndJoint

■戻り値
string[] joint

■使っているプロシージャ
stringArrayReverse

IKFKのセットアップで主に使用しています。

2014年8月19日火曜日

yjp_DirectoryDialogOption

■内容
UIのテキストフィールドを使ってファイルパスを環境変数に保存しておきたいときのMELです。
パス指定の記述が楽になります。
MELの中に記述されていますがこちらでも書いておきます。

■入力
string $FieldName : テキストフィールドの名称
string $optionVarSaveName : 環境変数名
int $type : 1 ファイル名までのパス or 2 フォルダパスか

■戻り値
なし

■例
symbolButton
-i "navButtonBrowse.xpm"
-c ("yjp_DirectoryDialogOption RigPatternListFolderField jptRigPatternListFolder 2");

2014年8月17日日曜日

YOS_Mirror

■YOS_Mirror

■内容
XYZの0座標を中心にミラーコピーするMELです。

・SeparateMirror
オブジェクトのピボットと回転軸も反転する。

・FaceMirror
選択したフェースのみミラーする。

練習で作っていたものなので階層が深いオブジェクトをSeparateMirrorすると問題があります。グローバルに置いて実行すると大丈夫かと思います。Maya2013なのでMaya2014以降なら標準であるかも

global proc YOS_PartsMirror()
{
float $konata[],$tukasa[],$usimata[];
string $iwasaki[],$hatunemiku,$nagato[],$kagami,$nagamon[];
int $n ;
$iwasaki = `ls -sl`;
if(`size$iwasaki` > 0)
{
print (`size$iwasaki` + "\n") ;
for ($n=0;$n < `size$iwasaki`;$n++)
{
//トランスフォームのピボット情報取得
$konata = `xform -q -a -ws -sp $iwasaki[$n]`;
$tukasa = `xform -q -a -ws -ro $iwasaki[$n]`;

if($konata[0] != $tukasa[0])
{
move -r ($konata[0] * -1) ($konata[1] * -1) ($konata[2] * -1) $iwasaki[$n];
makeIdentity -apply true -t 1 -r 1 -s 1 -n 0 $iwasaki[$n];
}

//原点0に移動
setAttr ($iwasaki[$n] + ".translateX") 0;
setAttr ($iwasaki[$n] + ".translateY") 0;
setAttr ($iwasaki[$n] + ".translateZ") 0;
setAttr ($iwasaki[$n] + ".rotateX") 0;
setAttr ($iwasaki[$n] + ".rotateY") 0;
setAttr ($iwasaki[$n] + ".rotateZ") 0;

//フリーズ
makeIdentity -apply true -t 1 -r 1 -s 1 -n 0 $iwasaki[$n];

//複製
$nagamon = `duplicate -rr $iwasaki[$n]`;

//元の位置に移動
move -r $konata[0] $konata[1] $konata[2] $iwasaki[$n];
rotate -r $tukasa[0] $tukasa[1] $tukasa[2] $iwasaki[$n];

//XYZの選択
if(`radioButtonGrp -q -sl YosMirrorBox` == 1)
{
$konata[0] = $konata[0] * -1;
$konata[1] = $konata[1] ;
$konata[2] = $konata[2] ;
$tukasa[0] = $tukasa[0] + 180;
$tukasa[1] = $tukasa[1] * -1;
$tukasa[2] = $tukasa[2] * -1;
$usimata = {-1,1,1};
}
else if(`radioButtonGrp -q -sl YosMirrorBox` == 2)
{
$konata[0] = $konata[0] ;
$konata[1] = $konata[1] * -1;
$konata[2] = $konata[2] ;
$tukasa[0] = $tukasa[0] ;
$tukasa[1] = $tukasa[1] + 180;
$tukasa[2] = $tukasa[2] * -1;
$usimata = {1,-1,1};
}
else if(`radioButtonGrp -q -sl YosMirrorBox` == 3)
{
$konata[0] = $konata[0] ;
$konata[1] = $konata[1] ;
$konata[2] = $konata[2] * -1;
$tukasa[0] = $tukasa[0] ;
$tukasa[1] = $tukasa[1] ;
$tukasa[2] = $tukasa[2] + 180;
$usimata = {1,1,-1};
}

//反転
setAttr ($nagamon[0] + ".scaleX") -1.0;
setAttr ($nagamon[0] + ".scaleY") -1.0;
setAttr ($nagamon[0] + ".scaleZ") -1.0;

//フリーズ
select -r $nagamon[0];
makeIdentity -apply true -t 1 -r 1 -s 1 -n 0 $nagamon[0];
polyNormal -normalMode 1;
DeleteHistory;
select -cl;

//移動
move -r $konata[0] $konata[1] $konata[2] $nagamon[0];
rotate -r $tukasa[0] $tukasa[1] $tukasa[2] $nagamon[0];
//$kagami = ($iwasaki[$n] + "T");

select -r $nagamon[0];
}
}
return ;
}
global proc YOS_PartsMirrorMesh()
{
float $konata[],$kagami[],$usimata[];

string $iwasaki[],$hatunemiku,$tukasa;
if(`radioButtonGrp -q -sl YosMirrorBox` == 1)
{
$kagami[0] = ($konata[0]+$konata[0]) * -1;
$kagami[1] = 0 ;
$kagami[2] = 0 ;
$usimata = {-1.0,1.0,1.0};
}
else if(`radioButtonGrp -q -sl YosMirrorBox` == 2)
{
$kagami[0] = 0 ;
$kagami[1] = ($konata[1]+$konata[1]) * -1;
$kagami[2] = 0 ;
$usimata = {1.0,-1.0,1.0};
}
else if(`radioButtonGrp -q -sl YosMirrorBox` == 3)
{
$kagami[0] = 0 ;
$kagami[1] = 0 ;
$kagami[2] = ($konata[2]+$konata[2]) * -1;
$usimata = {1.0,1.0,-1.0};
}
$iwasaki = `ls -sl`;
if(`size$iwasaki` == 0)
{
return ;
}
ConvertSelectionToFaces;
polyChipOff -ch 1 -kft 1 -dup 1 -off 0 -pvt 0.0 0.0 0.0 -s $usimata[0] $usimata[1] $usimata[2];
polyNormal -normalMode 0;
//select -cl  ;
return;
}
global proc YOS_Mirror()
{
if(`window -q -ex YOS_Mirrorwin`)
{
deleteUI YOS_Mirrorwin ;
}
window -wh 140 130 -tb 1 -tlb 0 -t "YosMirror1.1" YOS_Mirrorwin ;
columnLayout -w 130;
radioButtonGrp -cw 1 40 -cw 2 40 -cw 3 40 -sl 1
-numberOfRadioButtons   3
    -labelArray3 "X" "Y" "Z"
YosMirrorBox;

button -w 130 -h 25 -l "SeparateMirror" -c YOS_PartsMirror ;
button -w 130 -h 25 -l "FaceMirror" -c YOS_PartsMirrorMesh ;
button -w 130 -h 25 -l "Close" -c ("deleteUI -window YOS_Mirrorwin") ;

setParent..;
showWindow YOS_Mirrorwin ;
window -e -wh 160 130 YOS_Mirrorwin ;
}

2014年8月16日土曜日

s_MayaScripts更新

s_MayaScripts更新


  • 記述が長いMELの修正
  • 不使用プロシージャーの削除

NameSpaceCut

NameSpaceCut

NameSpaceをカットした後のノード名を返します。

入力
ノード名

戻り値
string

stringを返すだけなので、ノード名は変更されません。

なんかもっと単純になりそうなほど古い記述の様な気がします。
動けば良いから分かった方法で作っていたので、
標準機能があるのに作っている場合もあります。

GetTextStringLine

GetTextStringLine

名称の英語はテキトウです

これはツールではなくプロシージャです。
txtデータを読み込む時に使います。

内容
指定したテキスト形式のファイルを1行単位で配列に格納

入力
string パスとファイル名

戻り値
string[]

global proc string[] GetTextStringLine(string $mcl)
{
string $nextLine,$StringLine[];
int $fileNumber;
int $cnt = 0;

$fileNumber = `fopen $mcl "r"`;
$nextLine = `fgetline $fileNumber`;
while ( size( $nextLine ) > 0 )
{
  $nextLine = `fgetline $fileNumber`;
$StringLine[$cnt] = $nextLine;
$cnt++;
  }
fclose $fileNumber;
return $StringLine;
}

2014年8月15日金曜日

PresentFolder

PresentFolder

ただ現在開いているシーンのフォルダを開くだけのMELです。

いまMELをみるとバカみたいに長い道のりで記述していたのでコンパクトに変更。

これ以上書くことは無いですが結構使います。

global proc string PresentFolder()
{
string $filePassName = dirname( `file -q -sn` );
system ("load " + $filePassName);
return $filePassName;
}

AnimationWorkToolいらない機能満載


■AnimationWorkTool
上から閉じるボタン。×ボタンが小さいのでつくりました。

■普通の移動回転縮小のアイコン

■キーフレーム戻る進む
キーがついたフレームを戻る進む
はじめのフレーム最後のフレーム

■SetKey
キーを移動だけにつけたいとかそんなボタンが並び

カレントフレームにランダムでキーを打ちます
上の0.10を書き換えてふれ幅を変えます。

タイムスライダーの範囲でランダムキーを打ちます

値を0にするボタン。スケールは1に

■KeySaveCopyPaste
storePoseボーナスツールのショートカット

SRT_CopyPasteは別のノードに位置や回転をコピーします。

■Envelope
MotionTrail:標準機能のショートカット

Euler:ノードを選んで実行。標準機能のショートカット

AlignMultiConst:リグでマルチコンストレインをした後のアニメーションのずれを修正する機能があります。

oaSmootKeys:拾い物なのですがグラフエディターカーブのキーを3つ選択して実行。カーブがスムーズになる。拾い物なので削除対象。

■Select
Focus:キーがあるノードを選択して実行するとタイムスライダーがキーのある範囲になります。

cvSelect:アニメの機能ではないので削除予定。

SelectAllCurves:アニメの機能ではないので削除予定。


■CharactorsSet
これは機能していないかも
後日いじります。

とにかくいらない機能満載です。
使えるのはランダムキーをよく使います。

2014年8月14日木曜日

S_TOOL_CreateMenu

S_TOOL_CreateMenuについて

MELを作ったり拾ってきた場合、パスが通ったフォルダに入れてもMayaに表示されていません。
複数人でMayaを使用する時、導入説明をできるだけ少なくするために作ったメニューです。
今はこのs_MayaScriptsパッケージを渡すだけで同じ環境になるので便利です。
バージョン管理ツールのSVNで管理するとさらに楽ですね。

MELの内容
menuItem -subMenuでカテゴリを作ってmenuItemで追加MEL。
1つ作っておくと新しいMELはmenuItemをコピーして書き換えればメニューに表示されるので起動しやすい。

以下は配布していないですが、
拾ってきたMELをメニューに追加するS_TOOL_DL_scriptAdd.melです。
S_TOOL_DL_scriptAdd.melはDLフォルダに入れておくことで、
batでパス指定するだけでメニューに追加される様になります。

pythonはまだわかっていないので以下のような書き方です。
メニューウィンドウ+カテゴリのテキストを用意して入力しやすくしています。

global proc RunPyranha()
{
python "import pyranha;pyranha.gui()";
}
global proc S_TOOL_DL_scriptAdd()
{
global string $jMainWindow;

string $mdl = ($jMainWindow+"|s_Modeling_tool");
string $mat = ($jMainWindow+"|s_Material_tool");
string $tex = ($jMainWindow+"|s_Texture_tool");
string $ani = ($jMainWindow+"|s_Animation_tool");
string $joi = ($jMainWindow+"|s_Joint_tool");
string $rig = ($jMainWindow+"|s_riging_tool");
string $wig = ($jMainWindow+"|s_Weight_tool");
string $nom = ($jMainWindow+"|s_Normal_tool");
string $fbx = ($jMainWindow+"|s_FBX_tool");
string $etc = ($jMainWindow+"|s_etc_tool");

menuItem -l "reloadTextures"
-ann "シーン内のテクスチャーをリロードする"
-p $tex
-c "reloadTextures";
menuItem -l "pyranha"
-ann "mbファイルを読み込みプロジェクトも変更するブラウザ"
-p $jMainWindow
-c RunPyranha ;
}

2014年8月13日水曜日

Maya起動バッチの話

s_MayaScriptsに含まれるMaya起動バッチの話です。

タイトルです

echo ---- Start Maya 2013 S_TOOL script ----

s_MayaScriptsにはDLしたファイル用のフォルダまで指定されています。
setから始まっているところがそのフォルダです。
フォルダがないと動かないかな?
他のMELを使っているのであれば以下のフォルダを作ってそこに入れておくといいです。

set COM=common_scripts;
set RIG=rigging_scripts;
set PRO=projects_scripts;
set DLS=DL_scripts;
set UNI=Unity_scripts;
set FBX=FBX_scripts;
set PYC=DLpy_scripts;

ここは上記で設定したフォルダを環境変数に渡してます。

set MAYA_SCRIPT_PATH=%~dp0%COM%%~dp0%RIG%%~dp0%PRO%%~dp0%DLS%%~dp0%UNI%%~dp0%FBX%
echo MAYA_SCRIPT_PATH: %MAYA_SCRIPT_PATH%
set PYTHONPATH=%~dp0%PYC%

ここはMayaを起動する内容です。-hideConsoleでじゃまなコンソールを非表示にしてます。
必要なら消してください。

start "" "C:\Program Files\Autodesk\Maya2013\bin\maya.exe" -hideConsole

こんな感じでいろんなbatを用意すれば必要なスクリプトだけで起動したり出来ます。

2014年8月12日火曜日

VertexSnap

今日、再度調べてみたらVertexSnapと同じMELを作ってらっしゃる方がいた。
作る前にもっと探せばよかったけど、まあいいや。
ボーダーエッジに変換してスナップする機能はちょっと欲しくなってきたので、後日追加する。
次は何を作ろうかなー。

2014年8月9日土曜日

別メッシュの複数の頂点をスナップさせるツール

別メッシュの頂点をアベレージでスナップさせるツールを探しているけど見つからない。
マージはあるけど、同じ位置に移動させる機能がない。
近いけどばらけた頂点達を1頂点ずつのスナップじゃ時間がかかる。

入力
  1. オブジェクトを複数選ぶ
処理
  1. 頂点取得
  2. 頂点座標に近い頂点を探す
  3. その2点の中間座標を両方に入力
  4. その2点を候補からはずす

1から4を繰り返す

設定

  1. 選択した頂点で処理
  2. ボーダーエッジで処理
  3. 近似値の設定




ボーダーエッジ、アベレージスナップも追加。
別オブジェの頂点をスナップさせたいときに便利。
今後は法線も同じ情報にするかもしれない。
アベレージを無効にすると、はじめに選択したオブジェの頂点にスナップする。
こんなツールがあるかもしれないけど探すより早かったので作った。
s_MayaScriptsにも追加。
頂点選択もしくはオブジェ選択の両方で機能する。


global proc do_VertexSnap()
{
    string $sel[] = `ls -sl -fl`;
    if(!size($sel))return ;

    string $SingleData,$TotalVertex[];
    float $x,$y,$z;

    float $AverageValue = `floatField -q -v vsThresholdField`;


    if(!`gmatch $sel[0] "*.*"`)
    {
        for($SingleData in $sel)
        {
            if(`checkBox -q -v  vsBoEdgeCheck`)
            {
                select $SingleData;
                polySelectConstraint -t 0x0001 -w 1 -bo 1 -m 3;
                string $VertexGroup[] = `ls -sl -fl`;
                $TotalVertex = stringArrayCatenate ($TotalVertex,$VertexGroup);
            }
            else
            {
                string $VertexGroup[] = `ls -fl ($SingleData + ".vtx[*]")`;
                $TotalVertex = stringArrayCatenate ($TotalVertex,$VertexGroup);
            }
        }
        resetPolySelectConstraint;
    }
    else
    {
        $TotalVertex = $sel;
    }
    int $n,$m;
    for ($n=0 ; $n < size($TotalVertex) ; $n++)
    {
        float $VertexValueFirst[] = `pointPosition $TotalVertex[$n]`;
        for($m=0 ; $m < size($TotalVertex) ; $m++)
        {
            if($n != $m)
            {
                //print ($TotalVertex[$m] +"\n");
                float $VertexValueNext[] = `pointPosition $TotalVertex[$m]`;
                if(equivalentTol($VertexValueFirst[0] , $VertexValueNext[0], $AverageValue) && equivalentTol($VertexValueFirst[1] , $VertexValueNext[1], $AverageValue) && equivalentTol($VertexValueFirst[2] , $VertexValueNext[2], $AverageValue))
                {
                    if(`checkBox -q -v VertexSnapAverage`)
                    {
                        $x = ($VertexValueFirst[0] + $VertexValueNext[0]) / 2 ;
                        $y = ($VertexValueFirst[1] + $VertexValueNext[1]) / 2 ;
                        $z = ($VertexValueFirst[2] + $VertexValueNext[2]) / 2 ;
                        move $x $y $z $TotalVertex[$n];
                        move $x $y $z $TotalVertex[$m];
                    }
                    else
                    {
                        $x = $VertexValueFirst[0];
                        $y = $VertexValueFirst[1];
                        $z = $VertexValueFirst[2];
           
                        move $x $y $z $TotalVertex[$m];
                    }
                }
            }
        }
    }
}
global proc yjp_VertexSnap()
{
    if(`window -q -ex yjp_VertexSnapwin`)
    {
        deleteUI yjp_VertexSnapwin ;
    }
    window -wh 140 120 -tb 1 -tlb 0 -t "VertexSnap1.1" yjp_VertexSnapwin ;
    columnLayout -w 130;
    checkBox -l "Average" -v 1 VertexSnapAverage;
    checkBox -l "BorderEdge" -v 1 vsBoEdgeCheck;
    floatField -w 95 -h 22 -v 0.1 vsThresholdField;

    button -w 130 -h 25 -l "Apply" -c do_VertexSnap ;
    button -w 130 -h 25 -l "Close" -c ("deleteUI -window yjp_VertexSnapwin") ;

    setParent..;
    showWindow yjp_VertexSnapwin ;
    window -e -wh 140 120 yjp_VertexSnapwin ;

}