VLC media player
なんてことがたまにあるけど、VLCにはあらかじめそういうのが入っているらしい。
だからこれを使えばたいてい見ることができるのです。
たとえば .flv なんかも見れます。
見る、という点においてシンプルな設計がされているので、多少壊れているファイルでも見れるとか。
とりあえずこいつで開けば見れるよ、というソフトは結構重要だったり。
インストール不要 フォルダにまとめてファイルを移動させればどこのPCでも使える点もいいですね。
http://www.videolan.org/ ←公式
timeControl スナップの切り替え
if(`timeControl -q -snap $gPlayBackSlider`)
{
timeControl -e -snap 0 $gPlayBackSlider;
};
else
{
timeControl -e -snap 1 $gPlayBackSlider;
};
-------------------------------------------------
$gPlayBackSlider はMayaのインターフェイスの名前が格納されている変数
Mayaが起動時に自動で作っているんだと思う。
切り替えを行うMELは、大体これで事足りる。
if( スイッチのOn Off 判定 )
{
On Off判定とは逆の値になるように設定
setAttr だったり、専用のコマンドだったり
}
else
{
その逆をこちらで設定
}
座標変換 local⇔world
<---追記--->
座標変換は必要ない? 腰のZY平面を基準に全てが決まるため、それを出さないと始まらない。
しかもその平面を基準にするため、ワールドもローカルも関係ないと思われる。
よって書きかけだけど、しばらく放置、、、。
<---以上--->
リグのコントローラーの位置を腰(重心)を中心に左右で入れ替えたい。
つまりはポーズの左右反転がしたい。
しかし、手足のコントローラーはワールド座標にあるので、ミラーリングがそのままでは正しく行われない。
腰のローカル座標でコントローラの変形情報を反転させた後、ワールド座標に戻す必要がある。
そこで、
1.ワールド座標にあるコントローラーの位置Pa(Xa, Ya, Za)を
腰のコントローラーのローカル座標に変換Pb(Xb, Yb, Zb)
2.Pbを左右で入れ替えるPb'(Xb', Yb', Zb')
3.Pb'をワールド座標に変換する
4.Pb'をコントローラーに代入
という手順でミラーを完了させる。
http://d.hatena.ne.jp/hajimeN/20070705/1183600066 参考
というわけで、まずは locator A と B でいろいろと試してみる
━─━─━─━─━─━─━─━─━─━─
1.BをAのローカル座標で表すと?
●Aの座標空間にBを置いてみればいいので、BをAにparent化すればOK
でもなんか負けた気分に・・・。MELで何とかできないものか。
●vectorProductノードのpointProductを使ってみる
matrixにAのinverseMatrixを、input1にBのtranslateをつなぐ
これもできるな・・・。でもやっぱり負けた気分に・・・。ここでやめればいいのに。
まぁ、、、MELの勉強ということで! 次。
●MELでやると
---example1--------------------------------------------------
float $inv[] = `getAttr A.inverseMatrix`;
float $BwsPoint[] = `xform -ws -q -t B`;
float $BloPoint[] = pointMatrixMult ( $BwsPoint, $inv );
//pointMatrixMult
//座標変換をしてくれるコマンド。記述的にはプロシージャだけど・・・?
setAttr result.translateX $BloPoint[0];
setAttr result.translateY $BloPoint[1];
setAttr result.translateZ $BloPoint[2];
-------------------------------------------------------------
こうなります。
pointMatrixMult は、ある点をその空間に変換してくれるというもの。
ちなみに手でやると、下のようになる
---example2-----------------------------------------------------------------
float $inv[] = `getAttr A.inverseMatrix`;
float $BwsPoint[] = `xform -ws -q -t B`;
//ここから変わる////////////////////////////////////////////
matrix $invMat[4][4] = <<
$inv[0],$inv[4],$inv[8],$inv[12];
$inv[1],$inv[5],$inv[9],$inv[13];
$inv[2],$inv[6],$inv[10],$inv[14];
$inv[3],$inv[7],$inv[11],$inv[15]>>;
//float と行列の乗算はできないので、$inv[] を行列に直す
matrix $BwsMat[1][4] = <<$BwsPoint[0], $BwsPoint[1], $BwsPoint[2], 0>>;
matrix $BloMat[1][4] = $BwsMat * $invMat;
//行列の掛け算をするとある空間からある空間に変換できる、らしい
float $BloPoint[] = <<$BloMat[0][0], $BloMat[0][1], $BloMat[0][1]>>;//この行でMaya落ち?!
//ここまで///////////////////////////////////////////////////
setAttr result.translateX $BloPoint[0];
setAttr result.translateY $BloPoint[1];
setAttr result.translateZ $BloPoint[2];
----------------------------------------------------------------------------
でいいはずなんだけど、、、fatal error で Maya が落ちる、、、。なぜ?
あ、はい、、、 float に <<>>で代入しようとしてるからでした。正しくは、
float $testFloat[] = {a, b, c, d}; こう。 {}で! 落ちなくてもいいのにね!?
※落ちない時もある・・・。この時の一時的なものか、PCの機嫌によるものか・・・。
でもスケールと移動しただけなら上手くいくが、回転させるとできません・・・。
ん、pointMatrixMult が用意されているからそっちでやろう。楽だし。
<---追記--->
うーむ、どうやら移動値は自分で足さないといけないみたい。 pointMatrixMult は vectorProductユーティリティでいうところの vectorProduct で、 pointProduct が今回やりたいことに一致する。
↓vectorProductの内部計算はこうなっている(Mayaヘルプ の ノードリファレンス vectorProduct の項)
-------------------------------------------------
Given an input vector (a, b, c) and an input matrix:
A B C D
E F G H
I J K L
M N O P
Then Vector Matrix Product is defined as follows:
x = (a*A) + (b*B) + (c*C)
y = (a*E) + (b*F) + (c*G)
z = (a*I) + (b*J) + (c*K)
And the Point Matrix Product is defined as follows:
x = (a*A) + (b*B) + (c*C) + D
y = (a*E) + (b*F) + (c*G) + H
z = (a*I) + (b*J) + (c*K) + L
-------------------------------------------------
だとさ。赤文字が重要!
というわけで、上のMELを書き換えると、
-----example1fix--------------------------------------------------------
float $inv[] = `getAttr A.inverseMatrix`;
float $BwsPoint[] = `xform -q -t B`;
float $BloVec[] = pointMatrixMult ( $BwsPoint, $inv );//座標変換
//移動値を足す
float $BloPt[] = {$BloVec[0]+$inv[12],
$BloVec[1]+$inv[13],
$BloVec[2]+$inv[14]};
setAttr result.translateX $BloPt[0];
setAttr result.translateY $BloPt[1];
setAttr result.translateZ $BloPt[2];
------------------------------------------------------------------------
上記のようになる。配列のindexは行列の格納順から分かる。すなわち
0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15
という並び。ノードリファレンスによると D、H、L が移動情報。つまり 12、13、14番ということ。
手で乗算したほうも直してみた。
---example2fix-----------------------------------------------------------------
float $inv[] = `getAttr A.inverseMatrix`;
float $BwsPoint[] = `xform -ws -q -t B`;
/*後の計算式を作りやすくするために分かりやすく並べてるだけ
$inv[0],$inv[4],$inv[8],$inv[12]
$inv[1],$inv[5],$inv[9],$inv[13]
$inv[2],$inv[6],$inv[10],$inv[14]
$inv[3],$inv[7],$inv[11],$inv[15]*/
float $BloPt[3];
$BloPt[0] = ($BwsPoint[0] * $inv[0]) + ($BwsPoint[1] * $inv[4]) + ($BwsPoint[2] * $inv[8]) + $inv[12];
$BloPt[1] = ($BwsPoint[0] * $inv[1]) + ($BwsPoint[1] * $inv[5]) + ($BwsPoint[2] * $inv[9]) + $inv[13];
$BloPt[2] = ($BwsPoint[0] * $inv[2]) + ($BwsPoint[1] * $inv[6]) + ($BwsPoint[2] * $inv[10]) + $inv[14];
setAttr result.translateX $BloPt[0];
setAttr result.translateY $BloPt[1];
setAttr result.translateZ $BloPt[2];
-------------------------------------------------------------------------------
これでOKAYだ!
2.左右を入れ替える
左右の入れ替えでこのワールド>ローカル>ワールドの変換が必要なのは translate のみ。
腰のZY平面を基準に値を算出する