2014年8月26日火曜日

EDGE COLOR EDITOR

会社でのキャラセットアップの仕事の折に、こんな感じのmelを作りました。
選択したオブジェクトに関して、エッジの表示色を変更するmelです。



セットアップなどのとき、コントローラーのCURVEにアトリビュートから色を付けたりしますが、いちいちタブを開けたりなんだり…と、数が多いと面倒っくっさい。。。

このToolを使えば、ワンポチで好きな色を設定できる、というものです。

使用方法:
①melを起動するとウインドウが開くので、スライダーかintFieldからColorIndexを入力。
②オブジェクトを選択して、ボタンを押します。

以下ソース

//------------------------
//SET_EDGE_COLOR
//------------------------
/*
作成日:14/08/26
更新日:--/--/--
解説:
このmelは、選択したオブジェクトのエッジカラーを編集するmelです。
ポリゴンオブジェクトや、CURVEの色を変えるのに便利です、
*/

proc SET_EDGE_COLOR_PROC(){
string $NODE_LIST[] = `ls -sl`;
string $NODE_NAME;
int $COLOR_INDEX = `intField -q -value COLOR_INT`;

for($NODE_NAME in $NODE_LIST){
setAttr ($NODE_NAME + ".overrideEnabled") 1 ;
setAttr ($NODE_NAME + ".overrideColor") $COLOR_INDEX; 
}
}

if(`window -q -exists SET_EDGE_COLOR`) deleteUI SET_EDGE_COLOR;
window -s 0  -t "SET_EDGE_COLOR" SET_EDGE_COLOR;
rowLayout -nc 3;
colorIndexSliderGrp -min 0 -max 32 -value 10 COLOR_INDEX;
intField -value 10 -cc SET_COLOR_INDEX COLOR_INT;
button -w 100 -h 30 -l "SET_COLOR";// -c SET_EDGE_COLOR(`colorIndexSliderGrp -q -value COLOR_INDEX`);
setParent..;
showWindow SET_EDGE_COLOR;
proc SET_EDGE_COLOR(int $COLOR_INDEX){
string $NODE_LIST[] = `ls -sl`;
string $NODE_NAME;

for($NODE_NAME in $NODE_LIST){
setAttr ($NODE_NAME + ".overrideEnabled") 1 ;
setAttr ($NODE_NAME + ".overrideColor") $COLOR_INDEX; 
}
}

proc SET_COLOR_INDEX(){
int $COLOR_INDEX = (`intField -q -value COLOR_INT` + 1);
colorIndexSliderGrp -e -value $COLOR_INDEX COLOR_INDEX;
}

proc SET_COLOR_INT(){
int $COLOR_INT = (`colorIndexSliderGrp -q -value COLOR_INDEX` - 1);
intField -e -value $COLOR_INT COLOR_INT;
}
if(`window -q -exists SET_EDGE_COLOR`) deleteUI SET_EDGE_COLOR;
window -s 0  -t "SET_EDGE_COLOR" SET_EDGE_COLOR;
formLayout;
columnLayout ;//-nc 3 -ct3 left left left;
colorIndexSliderGrp -min 1 -max 32 -value 14 -cc SET_COLOR_INT COLOR_INDEX;
intField -value 13 -cc SET_COLOR_INDEX COLOR_INT;
button -w 100 -h 30 -l "SET_COLOR" -c SET_EDGE_COLOR_PROC;
setParent..;
setParent..;

showWindow SET_EDGE_COLOR;


ウエイト付け補助Tool (3)

ウエイト付け補助Toolの続き。
今回は、ポリゴンノード1で囲んだ範囲の、ポリゴンノード2の頂点を選択するところまで。
現在は、
①選択範囲を指定するポリゴンを選択
②トグルで頂点を選択したいポリゴンを選択
③mel起動
 …で使用します。

前回までに作成した部分はプロシージャにして使用しています。



これはこれだけで、「頂点を立体選択するTool」として使えそうです。
しかし、現状の仕様では、真正面向きに作成した立方体でしか範囲を指定できません。
範囲指定する立体が、少しナナメってたり、いびつな形状では、座標の正確な指定ができません。

最終目標が「ウエイト付け補助Tool」なので、モデルのいびつな形を指定するために、ユーザーは頂点を細かく移動して、範囲を指定したいはず。
てゆか、僕がそうしたい(=m=)。
今後は、範囲指定する立体がいびつな形でも頂点選択できるように改良したいです。

以下ソース

//-----------------------------
//プロシージャ;選択したポリゴンの座標を取得する
global proc vector [] getSelectedPosition()
{
//ソース元:http://www.not-enough.org/abe/manual/maya/mel-tips.html#getPosition

vector $POS_POSITION[];
float $val[];

string $sp[] = `ls -sl`;
string $pos[] = `filterExpand -sm 31 $sp`;
int $i = 0;
for($p in $pos)
{
$pv = `pointPosition $p`;
$val[0] = $pv[0];
$val[1] = $pv[1];
$val[2] = $pv[2];
$POS_POSITION[$i] = <<$val[0],$val[1],$val[2]>>;
//print $pv;
$i++;
}
return $POS_POSITION;
//ここまで、引用して修正
}
//-----------------------------
//プロシージャ;指定されたポリゴンの頂点座標をXYZごとにソートする
proc GET_POS_LIST (string $NODE_NAME,float $VAL_LIST_X[],float $VAL_LIST_Y[],float $VAL_LIST_Z[]){
//内部変数の定義
vector $TARGET_POS_VAL;
float $VAL_X;
float $VAL_Y;
float $VAL_Z;
vector $TARGET_POS[];

select -cl;
select ($NODE_NAME + ".vtx[*]");
$TARGET_POS = `getSelectedPosition`;

//座標をソートする
int $i = 0;
for($TARGET_POS_VAL in $TARGET_POS){
$VAL_X = $TARGET_POS_VAL.x;
$VAL_Y = $TARGET_POS_VAL.y;
$VAL_Z = $TARGET_POS_VAL.z;

$VAL_LIST_X[$i] = $VAL_X;
$VAL_LIST_Y[$i] = $VAL_Y;
$VAL_LIST_Z[$i] = $VAL_Z;
$i++; 
}
$VAL_LIST_X = `sort $VAL_LIST_X`;
$VAL_LIST_Y = `sort $VAL_LIST_Y`;
$VAL_LIST_Z = `sort $VAL_LIST_Z`;
}

//-----------------------------
//選択したポリゴンの頂点リストを取得する。
//--------------------------
//変数群の宣言
string $TAGET_NODE; 
string $NODE_LIST[];
string $NODE_NAME ;
string $TARGET_VTX_LIST[];
string $TARGET_VTX;
vector $TARGET_POS_VAL;

string $SELECT_VTX_LIST[];
vector $SELECT_POS[];

float $VAL_LIST_X[];
float $VAL_LIST_Y[];
float $VAL_LIST_Z[];

float $MIN_VAL_X;
float $MIN_VAL_Y;
float $MIN_VAL_Z;
float $MAX_VAL_X;
float $MAX_VAL_Y;
float $MAX_VAL_Z;
//--------------------------
clear $NODE_LIST;
clear $TARGET_VTX_LIST;
clear $SELECT_VTX_LIST;
clear $SELECT_POS;
clear $VAL_LIST_X;
clear $VAL_LIST_Y;
clear $VAL_LIST_Z;
//--------------------------
//選択したオブジェクトごとに処理実行
$NODE_LIST = `ls -sl`;
$NODE_NAME = $NODE_LIST[0];
$TARGET_NODE = $NODE_LIST[1];

  GET_POS_LIST($NODE_NAME,$VAL_LIST_X,$VAL_LIST_Y,$VAL_LIST_Z); //囲むポリゴンメッシュの座標リストの取得

//座標の最大値」・最小値を整理
$MIN_VAL_X =  $VAL_LIST_X[0];
$MAX_VAL_X =  $VAL_LIST_X[`size $VAL_LIST_X`-1];
$MIN_VAL_Y =  $VAL_LIST_Y[0];
$MAX_VAL_Y =  $VAL_LIST_Y[`size $VAL_LIST_Y`-1];
$MIN_VAL_Z =  $VAL_LIST_Z[0];
$MAX_VAL_Z =  $VAL_LIST_Z[`size $VAL_LIST_Z`-1];

print ($MIN_VAL_X + "," + $MAX_VAL_X + "\n");
print ($MIN_VAL_Y + "," + $MAX_VAL_Y + "\n");
print ($MIN_VAL_Z + "," + $MAX_VAL_Z + "\n");

//ターゲットメッシュの頂点から範囲内の頂点を抜き出す、
select ($TARGET_NODE + ".vtx[*]");
$TARGET_VTX_LIST = `ls -sl`;
$TARGET_VTX_LIST = `filterExpand -sm 31 $TARGET_VTX_LIST`;

int $i = 0;
for ($TARGET_VTX in $TARGET_VTX_LIST){
//print $TARGET_VTX;
$TARGET_POS_VAL = `pointPosition $TARGET_VTX`;

if($TARGET_POS_VAL.x >= $MIN_VAL_X && $TARGET_POS_VAL.x<= $MAX_VAL_X){
if($TARGET_POS_VAL.y >= $MIN_VAL_Y && $TARGET_POS_VAL.y <= $MAX_VAL_Y){
if($TARGET_POS_VAL.z >= $MIN_VAL_Z && $TARGET_POS_VAL.z <= $MAX_VAL_Z){
$SELECT_VTX_LIST[$i] = $TARGET_VTX;
$i++;
}

}
}

}

select -cl;

select $SELECT_VTX_LIST;
//おわり

2014年8月11日月曜日

ウエイト付け補助Tool (2)

ウエイト付けToolの続きです。

ひとまず、選択したポリゴンの頂点を取得してリスト化するところまでやってみました。


以下ソース

//---------------------------------------------------------

//選択ポリゴンノードの頂点座標のリストを取得する

//------------------------------------------------------------------------
//選択した頂点の座標を取得する
global proc vector [] getSelectedPosition()
{
//ソース元:http://www.not-enough.org/abe/manual/maya/mel-tips.html#getPosition

vector $POS_POSITION[];
float $val[];

string $sp[] = `ls -sl`;
string $pos[] = `filterExpand -sm 31 $sp`;
int $i = 0;
for($p in $pos)
{
$pv = `pointPosition $p`;
$val[0] = $pv[0];
$val[1] = $pv[1];
$val[2] = $pv[2];
$POS_POSITION[$i] = <<$val[0],$val[1],$val[2]>>;
//print $pv;
$i++;
}
return $POS_POSITION;
}
/*
ここまでのプロシージャは、以下サイト様よりソースをコピー、変数をいじらせていただきました。
http://www.not-enough.org/abe/manual/maya/mel-tips.html#getPosition
いつも(勝手ながら)勉強させていただいているサイト様です。
*/
//------------------------------------------------------------------------
//選択したポリゴンの頂点リストを取得し、選択する
//変数群の宣言
string $NODE_LIST[];
string $NODE_NAME ;
vector $TARGET_POS[];

//選択したオブジェクトのノード名を取得する
$NODE_LIST = `ls -sl`;
for ( $NODE_NAME in $NODE_LIST){
$NODE_NAME = ($NODE_NAME + ".vtx[*]");
select $NODE_NAME;

$TARGET_POS = `getSelectedPosition`;
print $TARGET_POS;
}

//おわり
select -cl;
//------------------------------------------------------------------------



ども、ほっさんといいます。
今月から新しい職場になり、仕事で主にmelを使用した作業用Toolを作成する機会が増えました。

もともと、私は生粋のグラフィックアーティストだったもんで、プログラムの勉強など一切してきませんでした。 ただ、前職で必要にかられてVBAとmelを独学しました。
でも、JavaやC言語は触ったことがないので、全くもってプログラムは初心者といえるでしょう。

そんな私ですが、こうして仕事で主にmeプログラミングを触っていくことになったわけで、日ごろあれやこれや勉強を積み重ねていこうと思うわけです。

そんな徒然を、こちらのブログでは書いてゆければいいかと思っています。

主に掲載するのは、ソースや、もしくは私が作成したmelToolなどになると思います。


ご縁があれば、何卒よろしくお願いいたします。

ウエイト付け補助Tool (1)

melプログラムの練習がてら、スムーススキンでバインドした後のウエイトづけを補助するToolを考えて見ようと思います。

仕様は以下の通り。
1)~1500くらいのローポリゴンモデルでの作業を想定
2)ジョイントに対応したラティス様のものが生成されて、ウエイトの範囲を指定する。
 ※このラティスは分割数などを指定できるといい。
3)任意の範囲を各々ラティスで囲んだら、「実行」ボタンをクリック
4)各々ジョイントに対応したラティスで囲まれた範囲のウエイトが100%でついている。

実用に向くかどうかはおいておいて(笑)。あくまで練習です。


処理順としては、以下を想定してみました。
----------------------------------------------------------
①ジョイントに対応したポリゴンノードか、カーブオブジェクトを作成する。

ユーザーが実行ボタンを押す

②オブジェクトの頂点リストを取得し、X、Y、Z値のMax,minを求め、オブジェクトで囲んだ範囲を定義する。。

③ウエイト付けの対象から頂点のリストを取得する。
 ウエイト付け対象の頂点リストのうち、②で求めたオブジェクトの範囲外の頂点を無視。
 ※もしくは、指定範囲内の頂点のみを選択する

④範囲内の頂点に特定ジョイントのウエイトを設定する
----------------------------------------------------------

時間のある時に、つらつらやってみようと思います。