MAYAメモログ -6ページ目

VLC media player

ネットで配信されている動画などを見る時に、コーデックが無いから見れない、、、。
なんてことがたまにあるけど、VLCにはあらかじめそういうのが入っているらしい。
だからこれを使えばたいてい見ることができるのです。

たとえば .flv なんかも見れます。
見る、という点においてシンプルな設計がされているので、多少壊れているファイルでも見れるとか。
とりあえずこいつで開けば見れるよ、というソフトは結構重要だったり。

インストール不要 フォルダにまとめてファイルを移動させればどこのPCでも使える点もいいですね。

http://www.videolan.org/ ←公式

timeControl スナップの切り替え

---script------------------------------------------
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をつなぐ
fig.1

これもできるな・・・。でもやっぱり負けた気分に・・・。ここでやめればいいのに。

まぁ、、、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 が用意されているからそっちでやろう。楽だし。

<---追記--->
うーむ、どうやら移動値は自分で足さないといけないみたい。 pointMatrixMultvectorProductユーティリティでいうところの 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平面を基準に値を算出する