MEL Archives
2009年08月29日
spreadObjectsOnSurface
spreadObjectsOnSurface( "pSphere1", "pPlane1", 100 )
↑配置 ↑地面 ↑数
global proc spreadObjectsOnSurface(string $object, string $surface, int $duplicateNb) {
// Get surface size
float $surfaceMinX = `getAttr ($surface+".boundingBoxMinX")`;
float $surfaceMaxX = `getAttr ($surface+".boundingBoxMaxX")`;
float $surfaceMinY = `getAttr ($surface+".boundingBoxMinY")`;
float $surfaceMaxY = `getAttr ($surface+".boundingBoxMaxY")`;
float $surfaceMinZ = `getAttr ($surface+".boundingBoxMinZ")`;
float $surfaceMaxZ = `getAttr ($surface+".boundingBoxMaxZ")`;
for ($n = 0; $n < $duplicateNb; $n++) {
string $duplicatedObject[] = `duplicate $object`;
// Set random value and place the duplicated object
float $randomX = `floor(rand($surfaceMinX, $surfaceMaxX))`;
float $randomY = `floor(rand($surfaceMinY, $surfaceMaxY))`;
float $randomZ = `floor(rand($surfaceMinZ, $surfaceMaxZ))`;
move $randomX $randomY $randomZ $duplicatedObject;
// Could add random rotation and scale task here (apply it to $duplicatedObject)
// Aim the object to the surface
string $geometryConstraintNode[] = `geometryConstraint $surface $duplicatedObject`;
string $normalConstraintNode[] = `normalConstraint -aim 0 1 0 -wut "object" $surface $duplicatedObject`;
// Activate this line if you want to delete the constraints nodes keeping the object pose. So as too manipulate it easier after placing. Note normal constraint node prevent to rotate objects.
// delete $geometryConstraintNode $normalConstraintNode;
}
}
2008年09月15日
clipsChooser 1.2.0
Clips chooser, tool for animatiors
Clip の管理に便利なMELのようです。
2008年06月18日
displayLayer の順番を変えたい
LayerのAttributesを開いて、
ExtraAttributesのDisplayOrderを変更する。
あるいは、MELコマンドで
setAttr layer1.do 2;
setAttr layer2.do 3;
setAttr layer3.do 1;
等で変更します。
そのままでは反映されないので、
レイヤーを新規に作(って捨て)るか、
ファイルを保存して再読み込みする。
関連MEL
Displaylayer Manager
レイヤーをフォルダー化できるようになります。
フォルダーに入れるにはレイヤーをフォルダーへ中ドラッグで。
作者は困っていらっしゃるようですが。。。
2008年06月16日
Digital Hardware Store
Davvey's tools の紹介。
階段やエスカレーター、ナット、ネジなどを生成するMELコマンド。
2008年06月14日
MEL Fractal Generator
便利MEL2種類の紹介
フラクタルジェネレーター
migFractal.mel
ノーマルツール
migNormalTools
2008年05月27日
Rivet (button) 1.0
服のボタンを固定する時に便利なMel。
2008年01月13日
Load & Save Pose mel に機能追加
Load & Save Pose mel に機能追加しました。
あまり頻繁に更新するのは好きではないんですけれども、
これはやはりあった方が便利かなということで更新します。
名前の通りポーズをセーブ・ロード出来ます。
ジョイントでPinningする機能を追加しました。
以前のものをお使いいただいていた方は、
MELファイルを上書きしていただくだけでOKです。
使い方は、以前と変わりません。
キャラクターのポーズデータをディレクトリ内に保存し、
いろんなシーンでポーズを使いまわすことが出来ます。
また、ジョイント名(構造)が同じ他キャラにもポーズをロード可能です。
※オリエントジョイントも揃っていることが必要です。

◎インストール方法
load&save_pose.rarを解凍すると、
load&save_poseディレクトリが作成されます。
その中のscripts、prefs/iconsそれぞれのディレクトリ内にあるファイルを
お使いのMayaディレクトリ内の同名のディレクトリに移動してください。
Windowsの場合
C:\Documents and Settings\USER\My Documents\maya\8.5\scripts
C:\Documents and Settings\USER\My Documents\maya\8.5\prefs\icons
Mayaを起動後、
スクリプトエディターを開いて、
MM_loadSavePose 1;
と入力し、Ctrl+Enterを押すとパネルが開きます。
このコマンドをシェルフに登録しておくと便利です。

◎ポーズの保存の仕方
ルートジョイントを選択して、パネルの
ボタンを押すか、
Pose Space 内で右クリックをしてポップアップメニューから Save Pose を選択します。
プロンプトダイアログが表示されますので、
名前を入力してSaveを押します。
するとPose Space リスト内に名前が追加されます。
◎ポーズのロードの仕方
ジョイントを何も選択していない状態で、
リスト内のポーズ名をダブルクリックします。
すると、ポーズがロードされます。
◎Pinning(V1.2)
固定したいジョイントを選択します。
次に、Pinボタンを押します。
すると、テキストフィールドにジョイント名が入力されます。
対象キャラクターのルートジョイントを選択し、
パネル内のPose spaceのポーズ名をダブルクリックします。
※何も選択せずにポーズをロードした場合は、
Pinningは機能しません。
◎ちょっと便利な使い方
ジョイント構造が同じ場合、
他のキャラクターのルートジョイントを選択して、
リスト内のポーズをダブルクリックすることで、
違うキャラクターにもポーズがロードできます(ロードには若干時間がかかります)。
◎ちょっと便利な使い方2
選択箇所以下の階層にロードされますので、
部分的なポーズのロードが可能です。
手足のジョイントを選択後、ポーズ名をダブルクリックすると、
選択ジョイント以降にポーズがロードされます。
◎ちょっと便利な使い方3
キャラクターのルートジョイントを複数選択して一度に保存できます。
※ただし読み込みに時間がかかるようになります。
ネームスペースが入っているもの同士でも、
右部の名前が揃っていればロード可能です。
セーブしたファイルはプロジェクトディレクトリ内の任意のディレクトリ
(保存先はディレクトリスペースで作成できます)に拡張子.paファイルとして保存されます。
中身はアスキーファイルですので、テキストエディタで編集が可能です。
ファイルフォーマットは
//ヘッダー部分
//createPose
jointname tx ty tz rx ry rz sx sy sz
・
・
・
// End of ファイル名
となっています。
tx・・・translate
rx・・・rotate
sx・・・scale
Fix first translate のチェックを入れると、
ポーズロード時にキャラの位置を固定できます。
Fixed Plane で固定する平面を指定します。
※noneの場合は、移動しません。
※Pinningが有効の場合は、この機能は無視されます。

ミラー機能も付いています。

設定部分は、ディレクトリネームはポーズを保存するディレクトリの初期値です。
ニュートラルポーズはスキニングしていない時でも初期状態を保存出来ます。
セーブニュートラルで保存し、ロードニュートラルで元に戻せます。
gotoBindPoseはジョイントの全てのRotateをゼロにリセットします。
保険的な機能です。※ただし、位置情報は含まれません。
パネルは伸縮自在です。
2008年01月12日
FBIK用小粒MEL GotoStanceParts
コマンド FBIK_GotoStanceParts;
FBIKリグのパーツをスタンスポーズに戻します。
※スタンスポーズに戻るわけではなく、
ローテートを初期化しているだけです。
なので、Hipsで実行すると、その場でスタンスポーズになります。
手足の指がぐちゃぐちゃになったとき戻すのに便利です。
使い方
FBIKエフェクターを選択
FBIK_GotoStanceParts;
で、そのエフェクターから先が初期化されます。
指などの先端エフェクターをざくっと選択して、
コマンドのシェルフを押すという具合に使うと便利です。
FBIK関係のMELはFBIKUtilityToolsとして、
1つのパネルに纏めようと思います。
2008年01月11日
FBIK用小粒便利ツールをいくつか
モーションの編集をする時に、
これが要るなぁというコマンドを作ってみました。
他のリグで使えるかはわかりませんが、
FBIKRIGをお使いの方にはお勧めかもです。
スクリプトディレクトリに放り込んで、
FBIK_KeyCopy;
FBIK_KeyPaste;
FBIK_allKeyOffset;
これらをシェルフに登録すると便利です。
FBIK_KeyCopy.mel
FBIKキーのコピー
FBIKエフェクターを選択。
キーのあるタイムライン上で
コマンド FBIK_KeyCopy;
でコピーします。
FBIK_KeyPaste.mel
FBIKキーのペースト
上のエフェクターを選択したまま、フレームをペーストしたいタイムラインへ移動。
コマンド FBIK_KeyPaste;
反応が悪いのか、2回実行するのがいいようです。
FBIKキーのオフセット
エフェクターを選択
キーの打ってあるタイムライン上で
エフェクターを移動・回転させます。
コマンド FBIK_allKeyOffset;
これで、すべてのキーが移動・回転分オフセットされます。
昨日のもついでに
MM_simpleAnimCurveCP.mel
アニメーション元のルートオブジェクトを選択
転送させたい先のルートオブジェクトをシフト選択
コマンド MM_simpleAnimCurveCP;
で、アニメーションカーブが転送されます。
2008年01月10日
アニメーションカーブのコピペ
同一サイズ・リグ構造のキャラ間で、アニメーションカーブをコピペするMELです。
非常にシンプルですので、このままシェルフに登録しておくだけで使えるかと思います。
使い方は、アニメーション元のルートオブジェクトを選択、
続いて、シフト選択で転送先のルートオブジェクトを選択(複数可)
で、下のコマンドを実行します。
{
string $sel[] = `ls -sl`;
int $i = 0;
for ($s in $sel) {
select -hi $s;
if($i == 0){
copyKey;
}
else {
pasteKey;
}
$i++;
}
}
いろいろオプションをつけていると非常に重くなってしまいましたので、
もっともシンプルな形にしてみました。動作も軽快です。
複雑な物はバイナリーで。。。そのうち。
2008年01月08日
Load & Save Pose mel を少し修正
Load & Save Pose mel を少し修正しました。
名前の通りポーズをセーブ・ロード出来ます。
7.0以前のミラー・ポーズの不具合の修正と、
位置の固定が出来るようになりました。
以前のものをお使いいただいていた方は、
MELファイルを上書きしていただくだけでOKです。
使い方は、以前と変わりません。
キャラクターのポーズデータをディレクトリ内に保存し、
いろんなシーンでポーズを使いまわすことが出来ます。
また、ジョイント名(構造)が同じ他キャラにもポーズをロード可能です。
※オリエントジョイントも揃っていることが必要です。

◎インストール方法
load&save_pose.rarを解凍すると、
load&save_poseディレクトリが作成されます。
その中のscripts、prefs/iconsそれぞれのディレクトリ内にあるファイルを
お使いのMayaディレクトリ内の同名のディレクトリに移動してください。
Windowsの場合
C:\Documents and Settings\USER\My Documents\maya\8.5\scripts
C:\Documents and Settings\USER\My Documents\maya\8.5\prefs\icons
Mayaを起動後、
スクリプトエディターを開いて、
MM_loadSavePose 1;
と入力し、Ctrl+Enterを押すとパネルが開きます。
このコマンドをシェルフに登録しておくと便利です。

◎ポーズの保存の仕方
ルートジョイントを選択して、パネルの
ボタンを押すか、
Pose Space 内で右クリックをしてポップアップメニューから Save Pose を選択します。
プロンプトダイアログが表示されますので、
名前を入力してSaveを押します。
するとPose Space リスト内に名前が追加されます。
◎ポーズのロードの仕方
ジョイントを何も選択していない状態で、
リスト内のポーズ名をダブルクリックします。
すると、ポーズがロードされます。
◎ちょっと便利な使い方
ジョイント構造が同じ場合、
他のキャラクターのルートジョイントを選択して、
リスト内のポーズをダブルクリックすることで、
違うキャラクターにもポーズがロードできます(ロードには若干時間がかかります)。
◎ちょっと便利な使い方2
選択箇所以下の階層にロードされますので、
部分的なポーズのロードが可能です。
手足のジョイントを選択後、ポーズ名をダブルクリックすると、
選択ジョイント以降にポーズがロードされます。
◎ちょっと便利な使い方3
キャラクターのルートジョイントを複数選択して一度に保存できます。
※ただし読み込みに時間がかかるようになります。
ネームスペースが入っているもの同士でも、
右部の名前が揃っていればロード可能です。
セーブしたファイルはプロジェクトディレクトリ内の任意のディレクトリ
(保存先はディレクトリスペースで作成できます)に拡張子.paファイルとして保存されます。
中身はアスキーファイルですので、テキストエディタで編集が可能です。
ファイルフォーマットは
//ヘッダー部分
//createPose
jointname tx ty tz rx ry rz sx sy sz
・
・
・
// End of ファイル名
となっています。
tx・・・translate
rx・・・rotate
sx・・・scale
Fix first translate のチェックを入れると、
ポーズロード時にキャラの位置を固定できます。
Fixed Plane で固定する平面を指定します。
※noneの場合は、移動しません。

ミラー機能も付いています。

設定部分は、ディレクトリネームはポーズを保存するディレクトリの初期値です。
ニュートラルポーズはスキニングしていない時でも初期状態を保存出来ます。
セーブニュートラルで保存し、ロードニュートラルで元に戻せます。
gotoBindPoseはジョイントの全てのRotateをゼロにリセットします。
保険的な機能です。※ただし、位置情報は含まれません。
パネルは伸縮自在です。
2008年01月07日
おちゃめなMaya6 挙動のおかしいsubstituteAllString
文字列処理用のコマンドのsubstituteAllStringの挙動がおかしいです。
{
string $text = "|Hips|Spine|Spine1|Spine2|Spine3|LeftShoulder|LeftArm";
$text = substituteAllString($text, "Left", "Right");
print $text;
}
が、期待通りの動作をしてくれません。
おかしいのは7.0まで
8.0以降は直っているようです。
回避コードを書くべきか、そのままにしておくか、うーむ。
一応回避コード
{
string $buffer[];
string $text = "|Hips|Spine|Spine1|Spine2|Spine3|LeftShoulder|LeftArm";
int $numTokens = `tokenize $text "Left" $buffer`;
int $i;
for($i=1;$i<$numTokens;$i++){
$text = `substitute "Left" $text "Right"`;
}
print $text;
}
変換文字でtokenizeした数-1回substituteする。
こちらもまともに動いていないみたいなんですけど、
得られる結果は期待していたものなので良とします。
2007年10月13日
CGarena | Free Magazine
CGarena の リリースする Free Magazine 2007年10月号です。
DLするにはCGarenaでアカウントを取る必要があります。
2007年10月09日
Visual Mel Studio
視覚的にUIを構築できるMELのようです。
MELでカスタムUIを作るのが面倒な人にはオススメです。
2007年10月07日
SS Maya Heaven 1.0.0
便利機能満載のMELスクリプト MayaHeaven
FBIKより、これでRig作った方が簡単かも知れません。
2007年08月13日
Rubiks Cube
ルービック・キューブを作ってみました。
Rig組をいろいろと試してみましたが、
最終的にexpressionで26個のキューブを制御するという方法に行き着きました。
キーを打ったりなんなりするなら、結局この方が便利だということで。
ただ、expressionでRotationを制御する場合、
ジンバルロックにはまってしまうために、
自前でその回避コードを一個一個検証しながら書いていかなければなりませんでした。
とかなんとかやってたら、膨大な行数になってしまった。
3600行くらい。
読み込みにすごい時間がかかります。
rubikscube.ma(8.5maファイル)
注意点:
再生速度が速いと正常に動きません。
まれにブロックが崩れます。
フレーム1で元に戻ります。
2007年08月10日
Expressionでローテーションの怪
Expressionでローテーションを仕込むとジンバルロックに嵌ってしまう。
これはどうにか回避できない物なんだろうか?
自分で回避コードを書くのは辛過ぎるっす。
2007年07月21日
catch と catchQuiet
エラーが出ても処理を続けられる「Mel言語のキーワード」だそうです。
使い方が今一わからなかったので検証。
catchQuiet ( `underConstruction` );
// Result: 1 //
catch ( `underConstruction` );
// Error: line 1: Cannot find procedure "underConstruction". //
// Result: 1 //
catchはエラー表示も返すが処理は続ける。
catchQuietはエラー表示も出さず処理を続ける。
ということのようです。
で、catch ( `<ここに>` );
プロシージャを入れると、そのプロシージャが存在するかどうかで判定するみたい。
プロシージャ内で発生するエラーをチェックしたいんだけど、
これを判定する方法がわからないっす。
既存のプロシージャを使った時にエラーが出る場合はどうやって回避すればいいのかなぁ?
2007年07月20日
Load & Save Pose mel
load&save_pose.rar
※プログレスバーの一部不具合を修正しました。(16:48修正)
※済みません。リンクが間違っておりました。(11:57修正)
Load & Save Pose mel というMELスクリプトを作りました。
名前の通りポーズをセーブ・ロード出来ます。
キャラクターのポーズデータをディレクトリ内に保存し、
いろんなシーンでポーズを使いまわすことが出来ます。
また、ジョイント名(構造)が同じ他キャラにもポーズをロード可能です。
※オリエントジョイントも揃っていることが必要です。

◎インストール方法
load&save_pose.rarを解凍すると、
load&save_poseディレクトリが作成されます。
その中のscripts、prefs/iconsそれぞれのディレクトリ内にあるファイルを
お使いのMayaディレクトリ内の同名のディレクトリに移動してください。
Windowsの場合
C:\Documents and Settings\USER\My Documents\maya\8.5\scripts
C:\Documents and Settings\USER\My Documents\maya\8.5\prefs\icons
Mayaを起動後、
スクリプトエディターを開いて、
MM_loadSavePose 1;
と入力し、Ctrl+Enterを押すとパネルが開きます。
このコマンドをシェルフに登録しておくと便利です。

◎ポーズの保存の仕方
ルートジョイントを選択して、パネルの
ボタンを押すか、
Pose Space 内で右クリックをしてポップアップメニューから Save Pose を選択します。
プロンプトダイアログが表示されますので、
名前を入力してSaveを押します。
するとPose Space リスト内に名前が追加されます。
◎ポーズのロードの仕方
ジョイントを何も選択していない状態で、
リスト内のポーズ名をダブルクリックします。
すると、ポーズがロードされます。
◎ちょっと便利な使い方
ジョイント構造が同じ場合、
他のキャラクターのルートジョイントを選択して、
リスト内のポーズをダブルクリックすることで、
違うキャラクターにもポーズがロードできます(ロードには若干時間がかかります)。
◎ちょっと便利な使い方2
選択箇所以下の階層にロードされますので、
部分的なポーズのロードが可能です。
手足のジョイントを選択後、ポーズ名をダブルクリックすると、
選択ジョイント以降にポーズがロードされます。
◎ちょっと便利な使い方3
キャラクターのルートジョイントを複数選択して一度に保存できます。
※ただし読み込みに時間がかかるようになります。
ネームスペースが入っているもの同士でも、
右部の名前が揃っていればロード可能です。
セーブしたファイルはプロジェクトディレクトリ内の任意のディレクトリ
(保存先はディレクトリスペースで作成できます)に拡張子.paファイルとして保存されます。
中身はアスキーファイルですので、テキストエディタで編集が可能です。
ファイルフォーマットは
//ヘッダー部分
//createPose
jointname tx ty tz rx ry rz sx sy sz
・
・
・
// End of ファイル名
となっています。
tx・・・translate
rx・・・rotate
sx・・・scale

ミラー機能も付いています。

設定部分は、ディレクトリネームはポーズを保存するディレクトリの初期値です。
ニュートラルポーズはスキニングしていない時でも初期状態を保存出来ます。
セーブニュートラルで保存し、ロードニュートラルで元に戻せます。
gotoBindPoseはジョイントの全てのRotateをゼロにリセットします。
保険的な機能です。※ただし、位置情報は含まれません。
パネルは伸縮自在です。
2007年05月11日
WireFrameRender v0.1
Mayaで簡単にワイヤーフレーム画像をレンダリングするためのMEL。
2007年05月02日
Meltris v1.01
Mayaでテトリス
MELで書かれているそうです。
最近見つけたのですが、
リリース自体は古いものです。
コードの参考ということで。
2007年03月27日
Quick easy corrective blendshapes using. Video demonstraition.
Quick easy corrective blendshapes using. Video demonstraition.
ブレンドシェイプを簡単に登録できるMel。
ビデオで使い方を解説しています。
なかなか便利です。
今後も開発を進める予定だそうです。
2007年02月04日
expressionでスプラインダイナミクス

Goalオブジェクトに追従させる先日のダイナミクスでは動きがあまり芳しくなかったので、
簡単なダイナミクスのMELを書いてみました。
ダイナミクスといいつつ動きを少し遅らせるくらいのシンプルな物です。
スプラインカーブにソフトボディを適用し、
そのパーティクルにexpressionで仕込んでいます。
両翼40本ともなると複雑なことはしてないのに
FPSが3以下と再生スピードがとっても遅いのが残念です。
バイナリー化するとどれくらい速くなるのかな?
2007年02月01日
セットアップをMELで自動化
左右で40本の羽に同じ仕込をする必要がありますから、
羽1本1本に仕込んでいくのが面倒なので、
簡単なMELを組んでみました。
for文の単純な繰り返し作業です。
後からの修正するにも一から再構築するにも大変便利です。
{
//ミラーボーン
for($i=1; $i<=20;$i++){
string $obj = "LeftWingSkl|LeftWing" + $i;
select -r $obj ;
mirrorJoint -mirrorYZ -mirrorBehavior -searchReplace "Left" "Right";
}
}
{
//スプラインIK
for($i=1; $i<=20;$i++){
string $obj = "LeftWingSkl|LeftWing" + $i + "|LeftWingm1.rotatePivot";
string $obj2 = "LeftWingSkl|LeftWing" + $i + "|LeftWingm1|LeftWingm2|LeftWingm3|LeftWingm4|LeftWingm5.rotatePivot";
select -r $obj ;
select -add $obj2 ;
ikHandle -sol ikSplineSolver;
}
for($i=1; $i<=20;$i++){
string $obj = "RightWingSkl|RightWing" + $i + "|RightWingm1.rotatePivot";
string $obj2 = "RightWingSkl|RightWing" + $i + "|RightWingm1|RightWingm2|RightWingm3|RightWingm4|RightWingm5.rotatePivot";
select -r $obj ;
select -add $obj2 ;
ikHandle -sol ikSplineSolver;
}
}
{
//リビルドカーブ
for($i=1; $i<=40;$i++){
string $obj = "curve" + $i;
select -r $obj ;
rebuildCurve -ch 1 -rpo 1 -rt 0 -end 1 -kr 0 -kcp 0 -kep 1 -kt 0 -s 2 -d 3 -tol 0.01 $obj;
}
}
{
//ソフトボディ
for($i=1; $i<=40;$i++){
string $obj = "curve" + $i;
select -r $obj ;
dynCreateSoft 0 0 1 0.5 0;
}
}
{
//パーティクルウェイト設定
float $fv[5] = {1.0, 0.9, 0.8, 0.7, 0.5};
for($i=1; $i<=40;$i++){
for($j=1; $j<=4;$j++){
string $obj = "curve" + $i + "ParticleShape";
particle -e -or $j -at goalPP -fv $fv[$j] $obj ;
}
}
}
{
//ダイナミクスウェイト値設定
for($i=1; $i<=40;$i++){
string $obj = "curve" + $i + "ParticleShape.dynamicsWeight";
setAttr $obj 0.1;
}
}
{
//コンサーブ値設定
for($i=1; $i<=40;$i++){
string $obj = "curve" + $i + "ParticleShape.conserve";
setAttr $obj 0.8;
}
}
{
//羽のスムースバインド
//Left
for($i=1; $i<=20;$i++){
string $obj = "LeftWingGroup|LeftWingPoly" + $i;
string $skl = "LeftWingSkl|LeftWing" + $i;
select -r $obj;
select -tgl $skl;
SmoothBindSkin;
}
//Right
for($i=1; $i<=20;$i++){
string $obj = "RightWingGroup|RightWingPoly" + $i;
string $skl = "RightWingSkl|RightWing" + $i;
select -r $obj;
select -tgl $skl;
SmoothBindSkin;
}
}
2006年12月14日
Jointのアップ方向をvectorで返すMEL
Jointの向いている方向をvectorで返してくれます。
説明書き
// DIRECTIONS: select an aligned joint, then run DetermineAxis()
// RETURNED: aim vector is -X
// // Result: -X -1 << -1 0 0 >> << 0 0 1 >> //
Jointを選択してDetermineAxis() を実行すると、
// Result: -X -1 << -1 0 0 >> << 0 0 1 >> //
が返ります。
結構便利かも、と思ったんですが、軸がずれている場合にはエラーを返します。
なもんであんまり意味は無いなぁと。。。改良すればいいわけですが。。。
ちとがっかりしたんですが、
MELを読むとロケーターを作ってParent Constrainしています。
考えることは一緒ですねぇ。なるほど。
2006年12月12日
whatIs コマンド
「コマンド」、「MELプロシージャ」、「スクリプト」、「変数」のいずれであるかを返します。
これを使うとスクリプトがどこにあるのかを教えてくれます。
whatIs プロシージャ名;
で、そのプロシージャが記述されているスクリプト名を返してくれます。
参考にしたいMELを読む時に便利です。
2006年12月11日
MELでファイル操作2
ちなみに、ディレクトリーを作る方法
workspace -create $myDir;
or
sysFile -makeDir $myDir;
or
system("mkdir \"" + $myDir + "\"");
3番目はシステムに依存するコマンドなので、
linuxやMacでは違うかもしれません。
2006年12月10日
MELでファイル操作
意外と骨が折れたのがこれ
ディレクトリーの削除
見つけるまで相当時間がかかりました。
疲れた。
//ファイルorディレクトリパスを取得
string $name = (`workspace -q -rootDirectory` + "/" + $one);
//ディレクトリかどうかの判定
if(`filetest -d $name`){
//ディレクトリ削除 パスを""で囲うところがミソ \で回避してます
system("rmdir /s /q \"" + $name + "\"");
}
else {
//ファイルの削除
if (`exists $name`){
sysFile -delete $name;
}
}
この判定順序が違うと動かない。
。。。これはWindowsしか動かないのかな?
2006年12月09日
Visor の Projects タブで表示されるディレクトリの変更
デフォルトのままだと、デフォルトのプロジェクトディレクトリが表示されます。
C:/Documents and Settings/Administrator/My Documents/maya/projects/default/
これではあんまり意味が無いので、少し修正。
C:\Program Files\Alias\Maya7.0\scripts\others
visorPanel.mel の 977行目と1741行目の
string $projectsDir = `internalVar -userWorkspaceDir`;
を
// string $projectsDir = `internalVar -userWorkspaceDir`;
string $projectsDir = `workspace -q -rootDirectory`;
に修正します。
これで現在のプロジェクトディレクトリの内容を表示してくれます。
2006年11月25日
House generator & House painter
Bonus Tools の Paint Geometry Tool を使った町並みの景観を作るチュートリアルです。
でもまぁGoogleEarthがあれば(ry
2006年11月22日
今まで損をしていたMayaの使い方
モデルパネルを表示するMEL。
string $window = `window`;
paneLayout;
modelPanel;
showWindow $window;
フローティングのモデルパネルが開きます。
今まで知らなかった。。。
勿体ない使い方をしていました。
試しにいくつ表示できるのかやってみました。
。。。27枚。。。まだまだいけそうですが、もう飽きました。
2006年11月20日
MM_mirrorPoseを少し修正

オプションを増やしました。
OrientJointに合わせた形となっています。
2006年11月19日
Xスケールに-1をかけた行列をオイラーに戻すと 0 0 -180
Xスケールに-1をかけた行列をオイラー角に戻すと 0 0 -180 で返されます。
先日見つけた公式がそう返しおるんですが、
なるほどと。
スプーンに映る自分の顔。。。みたいな感じでしょうか?
なんでやねーんっ!と突っ込みを入れたくなりますが、
天地逆になってしまうのをなんとか補正をつけないといけないなぁと思います。
//テストMEL locator1のスケールを-1にセットしてこのMELを実行します。
float $nx, $ny ,$nz;
float $ma[16];
$ma = `xform -q -m locator1`;
//変換公式
if(($ma[2] < 1.0) && (($ma[2] > -1.0))){
$ny = -asind($ma[2]);
$c = cosd($ny);
$nx = atan2d(($ma[6])/$c, $ma[10]/$c);
$nz = atan2d($ma[1]/$c, $ma[0]/$c);
}
else {
$nx = atan2d(-$ma[9],$ma[5]);
$ny = -atan2d($ma[2],0.0);
$nz = 0.0;
}
print $nx;
print " ";
print $ny;
print " ";
print $nz;
print "\n";
2006年11月17日
※記事の訂正
の変換公式に誤り(というか不具合)がありました。
こちらの方がより正常に動作すると思います。
//変換公式
if(($ma[2] < 1.0) && (($ma[2] > -1.0))){
$ny = -asind($ma[2]);
$c = cosd($ny);
$nx = atan2d($ma[6]/$c, $ma[10]/$c);
$nz = atan2d($ma[1]/$c, $ma[0]/$c);
}
else {
$nx = atan2d(-$ma[9],$ma[5]);
$ny = -atan2d($ma[2],0.0);
$nz = 0.0;
}
記事の方も訂正をしています。
参考にされていた方には誤った情報を流してしまいまして
誠に申し訳ございませんでした。
コワザ其の一 オイラー角を-90〜90°の範囲にする方法
意地でもラジアンを使わない根性で編み出した小技。
if($nx > 90) {
$nx = $nx - 180;
}
else if($nx < -90) {
$nx = $nx + 180;
}
if($ny > 90) {
$nx = -$nx;
$ny = $ny - 180;
}
else if($ny < -90) {
$nx = -$nx;
$ny = $ny + 180;
}
if($nz > 90) {
$nx = -$nx;
$ny = -$ny;
$nz = $nz - 180;
}
else if($nz < -90) {
$nx = -$nx;
$ny = -$ny;
$nz = $nz + 180;
}
数値を入れるとこんな感じでMayaが動作するのを見て
真似て作りました。
コードに入れ込んでみたらあんまり役に立たなかった。
ちっ!
これだと半分だけなので残り半分をカバーできるように改良せねばなりません。
2006年11月16日
おちゃめなMaya4 シビアすぎるアークサイン
asind()を使っておりますと、ときーどき
// Error: line ***: Invalid argument(s) for asind.
のエラーを返します。
debug用にprintをかまして数値を読んでも 1 のはずなのに、
しかもif文を前にかましているのに。。。if($hoge < 1.0) =(等号)付けてないのに。。。
そんな時のTips、
asind(`min 1.0 $hoge`);
これで通りました。えぇ
1.0000024
とか値が入ってるんでしょうか。
厳格なMayaさん。
つーか、その前のif文通すなっつーの。
2006年11月15日
matrixの生成
なんとなく回転行列の使い方がわかり始めた今日この頃
4×4の行列変換が結構便利だということがわかりました。
しかし、理屈はわからないまま答えがポンと出てくるので、とても気持ち悪いです。
//ポイントと角度とスケールからマトリックスを生成
proc float[] _makeMatrix(float $point[], float $theta[], float $scale[]) {
float $ma[16];
float $px = $point[0];
float $py = $point[1];
float $pz = $point[2];
float $rx = $theta[0];
float $ry = $theta[1];
float $rz = $theta[2];
float $sx = $scale[0];
float $sy = $scale[1];
float $sz = $scale[2];
$ma[0] = $sx * cosd($ry)*cosd($rz);
$ma[1] = $sx * cosd($ry)*sind($rz);
$ma[2] = $sx * -sind($ry);
$ma[3] = 0;
$ma[4] = $sy * (sind($rx)*sind($ry)*cosd($rz) - cosd($rx)*sind($rz));
$ma[5] = $sy * (sind($rx)*sind($ry)*sind($rz) + cosd($rx)*cosd($rz));
$ma[6] = $sy * sind($rx)*cosd($ry);
$ma[7] = 0;
$ma[8] = $sz * (cosd($rx)*sind($ry)*cosd($rz) + sind($rx)*sind($rz));
$ma[9] = $sz * (cosd($rx)*sind($ry)*sind($rz) - sind($rx)*cosd($rz));
$ma[10] = $sz * cosd($rx)*cosd($ry);
$ma[11] = 0;
$ma[12] = $px;
$ma[13] = $py;
$ma[14] = $pz;
$ma[15] = 1;
return $ma;
}
//_makeMatrix({1.0, 2.0, 3.0}, {30.0, 60.0, 45.0}, {-1.0, 1.0, 1.0});
matrix関連のノードを見かけるので、APIには実装しているはずなんですが、
MELコマンドがないですねぇ。MELではやらんだろうということなのかな?
2006年11月14日
matrix関数がない
MELには実装されてないのでしょうか?
libを書くのが面倒です。
//逆matrix
proc float[] _reMatrix(float $ma[])
{
float $am[16];
//マトリックスの掛け算
$am[0] = $ma[0];
$am[1] = $ma[4];
$am[2] = $ma[8];
$am[3] = $ma[12];
$am[4] = $ma[1];
$am[5] = $ma[5];
$am[6] = $ma[9];
$am[7] = $ma[13];
$am[8] = $ma[2];
$am[9] = $ma[6];
$am[10] = $ma[10];
$am[11] = $ma[14];
$am[12] = $ma[3];
$am[13] = $ma[7];
$am[14] = $ma[11];
$am[15] = $ma[15];
return $am;
}
//座標変換
proc float[] _matrixRotate(float $pi[], float $sita[])
{
float $nx, $ny ,$nz;
float $me[16];
string $lo[] = `spaceLocator -p 0 0 0`;
rotate -r -os $pi[0] $pi[1] $pi[2];
$ma = `xform -q -m $lo`;
string $lo2[] = `spaceLocator -p 0 0 0`;
rotate -r -os $sita[0] $sita[1] $sita[2];
$mb = `xform -q -m $lo2`;
select -r $lo;
delete;
select -r $lo2;
delete;
$me = _matrixTimes($ma, $mb);
//変換公式
if(($ma[2] < 1.0) && (($ma[2] > -1.0))){
$ny = -asind($ma[2]);
$c = cosd($ny);
$nx = atan2d($ma[6]/$c, $ma[10]/$c);
$nz = atan2d($ma[1]/$c, $ma[0]/$c);
}
else {
$nx = atan2d(-$ma[9],$ma[5]);
$ny = -atan2d($ma[2],0.0);
$nz = 0.0;
}
※訂正 2006 11/18 変換公式を訂正しました。
return {$nx, $ny, $nz};
}
//逆変換
proc float[] _matrixReRotate(float $pi[], float $sita[])
{
float $nx, $ny ,$nz;
float $me[16];
string $lo[] = `spaceLocator -p 0 0 0`;
rotate -r -os $pi[0] $pi[1] $pi[2];
$ma = `xform -q -m $lo`;
string $lo2[] = `spaceLocator -p 0 0 0`;
rotate -r -os $sita[0] $sita[1] $sita[2];
$mb = `xform -q -m $lo2`;
select -r $lo;
delete;
select -r $lo2;
delete;
$mb = _reMatrix($mb);
$me = _matrixTimes($ma, $mb);
//変換公式
if(($ma[2] < 1.0) && (($ma[2] > -1.0))){
$ny = -asind($ma[2]);
$c = cosd($ny);
$nx = atan2d($ma[6]/$c, $ma[10]/$c);
$nz = atan2d($ma[1]/$c, $ma[0]/$c);
}
else {
$nx = atan2d(-$ma[9],$ma[5]);
$ny = -atan2d($ma[2],0.0);
$nz = 0.0;
}
※訂正 2006 11/18 変換公式を訂正しました。
return {$nx, $ny, $nz};
}
matrixを取るのにいちいちロケイターを作ってるのがカッコ悪いんですが。。。
数値から生成してくれないものか知らん?
2006年11月13日
オイラー角をオイラー角で変換した後のオイラー角
proc float[] _matrixTimes(float $pi[], float $sita[])
{
float $nx, $ny ,$nz;
string $lo[] = `spaceLocator -p 0 0 0`;
rotate -r -os $pi[0] $pi[1] $pi[2];
$ma = `xform -q -m $lo`;
string $lo2[] = `spaceLocator -p 0 0 0`;
rotate -r -os $sita[0] $sita[1] $sita[2];
$mb = `xform -q -m $lo2`;
select -r $lo;
delete;
select -r $lo2;
delete;
//マトリックスの掛け算
float $xx = $ma[0]*$mb[0] + $ma[1]*$mb[4] + $ma[2]*$mb[8] + $ma[3]*$mb[12];
float $xy = $ma[0]*$mb[1] + $ma[1]*$mb[5] + $ma[2]*$mb[9] + $ma[3]*$mb[13];
float $xz = $ma[0]*$mb[2] + $ma[1]*$mb[6] + $ma[2]*$mb[10] + $ma[3]*$mb[14];
float $xw = $ma[0]*$mb[3] + $ma[1]*$mb[7] + $ma[2]*$mb[11] + $ma[3]*$mb[15];
float $yx = $ma[4]*$mb[0] + $ma[5]*$mb[4] + $ma[6]*$mb[8] + $ma[7]*$mb[12];
float $yy = $ma[4]*$mb[1] + $ma[5]*$mb[5] + $ma[6]*$mb[9] + $ma[7]*$mb[13];
float $yz = $ma[4]*$mb[2] + $ma[5]*$mb[6] + $ma[6]*$mb[10] + $ma[7]*$mb[14];
float $yw = $ma[4]*$mb[3] + $ma[5]*$mb[7] + $ma[6]*$mb[11] + $ma[7]*$mb[15];
float $zx = $ma[8]*$mb[0] + $ma[9]*$mb[4] + $ma[10]*$mb[8] + $ma[11]*$mb[12];
float $zy = $ma[8]*$mb[1] + $ma[9]*$mb[5] + $ma[10]*$mb[9] + $ma[11]*$mb[13];
float $zz = $ma[8]*$mb[2] + $ma[9]*$mb[6] + $ma[10]*$mb[10] + $ma[11]*$mb[14];
float $zw = $ma[8]*$mb[3] + $ma[9]*$mb[7] + $ma[10]*$mb[11] + $ma[11]*$mb[15];
float $wx = $ma[12]*$mb[0] + $ma[13]*$mb[4] + $ma[14]*$mb[8] + $ma[15]*$mb[12];
float $wy = $ma[12]*$mb[1] + $ma[13]*$mb[5] + $ma[14]*$mb[9] + $ma[15]*$mb[13];
float $wz = $ma[12]*$mb[2] + $ma[13]*$mb[6] + $ma[14]*$mb[10] + $ma[15]*$mb[14];
float $ww = $ma[12]*$mb[3] + $ma[13]*$mb[7] + $ma[14]*$mb[11] + $ma[15]*$mb[15];
//変換公式
if(($ma[2] < 1.0) && (($ma[2] > -1.0))){
$ny = -asind($ma[2]);
$c = cosd($ny);
$nx = atan2d($ma[6]/$c, $ma[10]/$c);
$nz = atan2d($ma[1]/$c, $ma[0]/$c);
}
else {
$nx = atan2d(-$ma[9],$ma[5]);
$ny = -atan2d($ma[2],0.0);
$nz = 0.0;
}
※訂正 2006 11/18 変換公式を訂正しました。
return {$nx, $ny, $nz};
}
お試しコマンド
オイラー{0.0, 30.0, 0.0}を{30.0, 0.0, 0.0}回転させた時
_matrixTimes({0.0, 30.0, 0.0}, {30.0, 0.0, 0.0});
// Result: 33.690068 25.658906 16.102114 //
cheers!
2006年11月11日
おちゃめなMaya3 xformの謎
getAttr locator1.translate;
// Result: 4.549147 81.970932 -2.348332 //
xform -q -os -t locator1;
// Result: 70.437177 -40.261024 -12.770951 //
位置情報を取りたい時、上のように記述すると、
getAttr と xform で違う値を返すことがあります。
※正しい値は getAttr の方です。
これは一体どういうことなんでしょうか?
謎です。全然わからない。
何かクリアしなければならないものがあるんでしょうか?
今まで xform を多用してたのですが、
この所為で、うまく動かなかった。。。
なんでかなぁ?
とりあえず、今後は getAttr を使うことにします。
参ったっす。Mayaさん。。。
2006年11月09日
デプスマップシャドウで影の減衰を表現する方法
mixiでも昨年頃話題になっていた手法を用いてやってみました。

やっていることは、Light Infoにオブジェクトをコネクトして
それをライトのFilter Sizeにつなげています。
rampとmultiplyDivideは値の調整です。
影色にもついでにコネクトしています。
オブジェクト位置から離れると影がぼけるという考え方です。
しかし、これでは1つのオブジェクトしか対応できません。
ということで、困った時のレイヤーテクスチャで、
複数のオブジェクトをレイヤーで重ねてDarkenで合成しています。
これでFilter Sizeのマップを作るという感じでしょうか。
しかし、これでは不都合な場合が出てくることが判明。
影のボケ足近くに他のオブジェクトが重なった場合、
重なっているところの影がクリアになったりと。
う〜ん、最初から考え直さないといけないなぁ。

こちらがデプスマップシャドウ レンダリング時間は1分と速く、仕上がりもなかなか綺麗なのですが。。。

こちらがレイトレース レンダリング時間 2分53秒。重い。。。
課題
オブジェクトが重なる場合の影の処理。
デプスマップシャドウではトランスペアレンシーで抜きたいところの影が抜けません。
これは何か方法はないのでしょうか?
以前日記でも紹介した事があるのですが、私が見つけた方法は、
ジオメトリを切り抜くというものでした。
しかし余りにも力技なのでもう少しまともな方法はないものかと。
それから、メンタルレイを使った場合、
トランスペアレンシーの切り抜きは可能なのですが、
カスタムアトリビュートのShadowMap の所の
Softnessで影のぼかしがLight Infoでは効きません。
どうも、また違ったシェーディングネットワークを組む必要がありそうです。
ご興味のある方はどうぞ
softshadow_depthmap.ma
2006年10月19日
知識よりも発想と思い知る
ミラーポーズのScriptを作ったのはいいけれど、
微妙にずれるところが許せない。
なんて思いながらいろいろアルゴリズムを考えていたわけですが、
力技くさい方法を思いつきました!!!
//反転後のオイラー角読取方法
locatorを作成。
ジョイントへオリエントコンストレイン。
その角度を(-x、180-y、-z)//角度の反転
これで反転後のlocatorのオイラー角(ワールド座標値)がわかります。
それをワールドスペースで反対側へ代入。
これをコード化すれば、どんなジョイントもほぼ完璧にミラー可能っす!
面倒なオプションは要りません(面倒な計算もいりません。。。orz)。
コンストレインって便利だなぁ〜。
2006年10月18日
クォータニオンとオイラー角の相互変換
Mayaにはマトリックスの合成が簡単に行えるような関数群が用意されています。
ですから、知識さえあれば簡単にクォータニオンとオイラー角の相互変換が行える。。。はずなんですが、
悲しいかな、私にはそこんところの知識が足りません。
実際に回転させてから読むしかないかなぁ。
調べていてできた副産物
//任意のポイントを原点でθ角回転させた時のポイント座標
proc float[] _pointMatrix(float $point[], float $sita[]) {
//locator作成
string $lo[] = `spaceLocator -p 0 0 0`;
//locatorをθ角に回転
rotate -r -os $sita[0] $sita[1] $sita[2];
//変換マトリックス作成
$ma = `xform -q -m $lo`;
//作ったlocatorを削除
select -r $lo;
delete;
$po = pointMatrixMult($point, $ma);
return $po;
}
わしゃぁ角度が知りたいんじゃ。。。
2006年10月17日
ミラーポーズMEL
とてもシンプルなミラーポーズのMELです。
どうぞ使ってやってください。
インストール方法
melファイルをscriptディレクトリに入れてください。
使い方は、
ルートジョイントを選択して、
コマンド MM_mirrorPose(0);
コマンド MM_mirrorPose(1);でウインドウが開きます。
シェルフに登録しておくと便利です。
注意点
スキニング前にジョイントオリエントをしておかないとうまく動作しません。
また、ジョイントオリエントしていても、
ジョイントオリエントの軸がx軸とずれていると、微妙にずれます。
テストした結果では、ジョイントオリエント"none"が最も正確に動作しました。
便利な使い方
選択したところから下の階層がミラーされますので、
腕だけとか、足だけ、手だけのミラーができます。
両方の手首を選択して実行すると、手のポーズがスワップします。
FBIK用にと考えていましたが、
何にでも使えると思います。
おちゃめなMaya2 オイラーはロール・ピッチ・ヨー
さらに深部に入り込んでしまった感が。。。
もう何が何やら、
オイラーの定義にしても、いろいろあるようで、
どれを信じれば良いのかわかりません。
こういうときはツールにしたがってMayaの流儀で行こう。
Mayaの場合、3軸を使って回転しています。
これってロール・ピッチ・ヨー?
よくわからないので、その辺は考えないように。。。
ただ、
rotate -r -os 30.0 0 0 ;
rotate -r -os 0 30.0 0 ;
rotate -r -os 0 0 30.0 ;
こうした時と、
rotate -r -os 30.0 30.0 30.0 ;
これの結果が違うのは何故なんでしょうか?
オイラーじゃないのかい?
2006年10月15日
未だに謎のジョイントオリエントの怪
ベクトルということで、一応の理解は得られたのですが、
ジョイントの持つJointOrientがやはりとても厄介なのです。
このJointOrientとジョイントの向き(つまりベクトル)がずれていた時の計算式がわかりません。
ベクトルの変換はどれもベクトル計算なので、
角度に再計算する方法がわからないんです。
この辺はどの辺りを探ればいいのでしょうか?
モーメント?
私にとっては未知の領域だ。
探求の旅は続く。。。
2006年10月14日
アハ体験
|
\ __ /
_ (m) _ピコーン
|ミ|
/ `´ \
('A`)
ノヽノヽ
くく
なんか私、勘違いしていたようです。
コンストレインをヒントにあれこれ試してましたら、
謎が解けました。
ジョイントはベクトル
なにを今更と言われそうですが、
これがわかっていなかった。
そもそもベクトルを理解していなかったと思います。
何か難しく考えすぎていました。
yz平面に対して、左右対称にするには、
RotateX * -1
RotateY * -1
RotateZ
でよかったんです。
アホだった。
悩み抜いた3日間。。。長かった。。。orz
ヒントをくださったその日暮さんありがとうございました。
2006年10月13日
ジョイントに含まれる厄介な情報
まず、手始めにポーズのミラーリングをと思いまして、
MELを組んでみているのですが、FKベースで考えると、
キャラクターごとにうまくいったりいかなかったり。
これは何故かなぁ〜と試行錯誤しておりましたが、
どうもJointOrientが怪しいということになりました。
ジョイントはローカル座標値を持っているので、
回転軸はその座標系に依存するということで、
それを補完した形のコードを組まないといけません。
これが、もう厄介なことこの上ない。
※座標系に強い人ならなんてことはないんでしょうけど。。。
座標変換てどうするんだっけ?
そんでもってyz平面に対して対象となる角度というと。。。
とか考えてたら頭がわれそうに痛くなってきました。
かんちージョイントのセットアップがこんなところで仇になるとは。。。もうギブ。
2006年10月12日
retarget あやしいコマンドを発見
MELのリファレンスマニュアルを少しづつ調べておりましたら、
こんなコマンドを見つけてしまいました。
////////////////////////////////////////////////////////////
コマンド名
retarget
移動: 戻り値。 関連コマンド。 フラグ。 サンプル。
書式
retarget [-lowerBody string] [-lowerScale string] [-lowerScaleFactor double] [-upperBody string] [-upperScale string] [-upperScaleFactor double] [-scaleHandsFrom string] [-startFrame int] [-endFrame int] [-maintainOffset toggle] [-useExistingKeys toggle] [-restPoseFrame int] [select... ]
このコマンドは取り消しはできますが、照会および編集はできません。
このコマンドを使用して、キャラクタからモーションをテイクし、サイズの異なる別のキャラクタに再ターゲットを行います。
////////////////////////////////////////////////////////////
。。。実は実装してる???
なんで表立ってこのコマンドを使えるようにしてないのかと。
動かないのかなぁ。
当方、未検証です。
会社内部もぐちゃぐちゃなのかもとか勘ぐってしまう。どうなってんだよ〜。
2006年10月11日
MELのリファレンスがいい加減な件
いざ、MELを組み始めようかとした時に、
マニュアルのMELリファレンスを見ながらコマンドを試しているのですが、
これがかなりいい加減なんです。
あての外れた戻り値だったり、
コマンド自体機能しなかったり、
このマニュアルでは逆引きもできないしと、
かなりの手探り状態で、少々根を上げています。
プロジェクトディレクトリを取得するコマンドって、
string $myScriptDir = `internalVar -userWorkspaceDir`;
のはずなんですが、
実際にはデフォルトのプロジェクトディレクトリを返します。
で、あれやこれや探ってみて
string $myScriptDir = `workspace -q -rootDirectory`;
これで何とか得られた訳ですが、
こんなやり方であってるんでしょうか?
得られたら文句言うなとか言われそうですが、
いちいちこれでは先が思いやられる。
おかしいぞ、MEL。マニュアルの記述がおかしすぎる!
廃止になったコマンドとかも全然整理できてないし。
海外サイトも調べてみましたけれど載ってないですねぇ。
しょうがないけど、
動いているファイルの中を探るしかないですねぇ。
ほしい機能を使っていそうな部分のMELを見て読み取ると。。。
なかなか手強いス。
2006年10月09日
clipEditor -q -sc がまともに動かない
クリップのアニメーションカーブの情報を取得しようとしていて躓いたのがコレ。
このコマンド、調べてみると、6.0辺りから使えなくなったみたいです。
代わりのMELはこちら
//クリップを選択
string $selClips[] = `ls -sl -type animClip`;
string $clip;
for( $clip in $selClips){
//ソースクリップ名を取得
string $source[] = stringArrayRemoveDuplicates(`listConnections -d false $clip`);
//ライブラリ名を取得
string $library[] = stringArrayRemoveDuplicates(`listConnections -type clipLibrary $source`);
//カーブを取得
string $animCurve[] = `ls -type animCurve (stringArrayRemoveDuplicates(listConnections($library)))`;
print ($clip + "\n");
print $animCurve;
clear($source);
clear($library);
clear($animCurve);
}
参考
http://www.melscripting.com/forums/index.php?s=fb1f2cb5c40c0f96a2bf0c4a22244891&act=ST&f=3&t=362
http://lwplugdev.seesaa.net/article/15393434.html
2006年10月02日
ライブラリー化に際しての課題
折角モーション付けを行ってライブラリー化しているのだから、
このモーションをいろんなキャラクターに使いまわしたい。
そんな風に考えている人も多いのでは無いでしょうか?
しかし、いろいろ調べてみましたが、
今のところそれが実現できるのはMBくらいのようで、
Maya8でできるようになっているのかなぁ?と淡い期待を抱きながら、
今度(10/6)のセミナーを楽しみにしつつ、
なんとかできないものかとMELのコマンドと睨めっこしながらアルゴリズムを考えております。
ClipをTransferできるMELとか作ったら売れるかなぁ?
//キャラクターセットのアトリビュートを集めるMEL
//キャラクターセットを選択してMELを実行します。
//サブキャラクターの要素も拾います。
//選択項目の収集
string $sel[] = `ls -sl`;
//選択されているかチェック
if (size($sel) == 0) {
error("Select a character.");
}
//キャラクタータイプかチェック
string $id = `nodeType $sel[size($sel)-1]`;
if ($id != "character") {
error("Select a character.");
}
string $member;
string $members[] = `character -int $sel[size($sel)-1]`;
for ($member in $members) {
//サブキャラクターのチェック
int $b = MMnodeTypecheck($member);
if($b) {
string $tmp = `getAttr $member`;
print ($member+" = "+$tmp+"\n");
}
}
//選択し直し
for ($se in $sel) {
select $se;
}
//帰納的にチェックするのでprocに
proc int MMnodeTypecheck(string $char)
{
string $id = `nodeType $char`;
if ($id == "character") {
string $member;
//選択しないとメンバーを返してくれない?
select $char;
string $members[] = `character -int $char`;
for ($member in $members) {
int $b = MMnodeTypecheck($member);
if($b) {
string $tmp = `getAttr $member`;
print ($member+" = "+$tmp+"\n");
}
}
return 0;
}
else {
return 1;
}
}



