※ 注意 ※
この記事のリグは失敗例です。
記事のとおり作ると、記事の通り失敗します。
それでもよいという天の邪鬼な方に向けておくる、”Mayaで作る車輪リグ考察(失敗編2)
まずは前回の失敗から。
一方向の移動にしか、車輪の回転が実行されませんでした。
原因は計算に使ったのがX軸方向の移動距離だけだったからです。
他の軸も考慮に入れなければ・・・。
そこで管理人、思った。
「これは、大変そうだなぁ~」
できれば「前回のExpressionをちょっと書き直したらできちゃった」が望ましい。
そこで管理人、まじめに思った。
「オブジェクトスペースで座標が取得できれば、うまくいきそうだ」
オブジェクトスペースというのは、オブジェクト固有の座標のことです。
Moveツールでオブジェクト軸で動かせると思うのですが、あれです。
オブジェクトスペースで、移動距離が得られるなら車輪の向きが変わっても対応できそうです。
それにこれなら、前回のExpressionを少し修正するだけで出来そうです。
オブジェクトスペースで座標を取得するには”xform”を使えば可能です。
xform -q -os -t Object;
実装してみました(pymelです)
import pymel.core as pm #車輪オブジェクト作成 oObj = pm.polyCylinder(n="Wheel_GEO", r=5, h=1,sz=1)[0] oObj.rotate.set(90,0,0) #回転制御用グループ作成 oRot_Gp = pm.group(n="ROT") #コントロールグループ作成 oCTR_Gp = pm.curve( d=1, p=[(-5, 6, -2.5), (0, 6,-2.5), (0 ,6 ,-5), (7 ,6 ,0), (0 ,6 ,5), (0, 6 ,2.5), (-5, 6 ,2.5), (-5, 6 ,-2.5)], k=[ 0,1,2,3,4,5,6,7] ,n="CTR") pm.parent(oRot_Gp, oCTR_Gp) expName = "Wheel_sampleEXP02" exp = "$r = 5;n" exp += "float $t[] = `xform -q -os -t CTR`;n" exp += "$a = rad_to_deg($t[0] / $r);n" exp += "ROT.rotateZ = -$a;n" pm.expression(string = exp, name = expName) $r = 5; float $t[] = `xform -q -os -t CTR`; $a = rad_to_deg($t[0] / $r); ROT.rotateZ = -$a;
変更点は後半のExpressionの部分です。そこだけ抽出するとこんな感じ。
$r = 5; float $t[] = `xform -q -os -t CTR`; $a = rad_to_deg($t[0] / $r); ROT.rotateZ = -$a;
1行目で車輪の半径を指定。
2行目でオブジェクトスペースで座標を取得しています。
3行目で回転角を求め、
4行目で回転させています。
動かしてみましょう。
前回のものとは挙動が少し違っています。
今回のものはコントローラにキーフレームを打たないとViewで確認出来ません。
xformを使ったのと、Expressionの評価タイミングのためと思われます。
おしいっ。
方向転換時に車輪が回転してしまっています。それ以外は良さげなのに。
調べてみると、原因はオブジェクトスペースで位置を取得したことにあるようです。
上手く言葉で表せないので原因解説は割愛してしまいます。
期待していたものと、Mayaのオブジェクトスペースがちょっと違うようでした。
他にもこういう動きでエラーが起きます。
カーブに沿ってモーションパスを設定したものです。
他にもいろいろ、おかしな動きが見受けられました。
どうやら、このやり方も駄目なようです。
今回も失敗です。
次は、手法を変えて面倒がらずにチャレンジしてみます。
切り替えて、次!
コメント