※ 注意 ※
この記事のリグは失敗例です。
記事のとおり作ると、記事の通り失敗します。
それでもよいという天の邪鬼な方に向けておくる、”Mayaで作る車輪リグ考察(失敗編)
最終目標はこういうヤツ↓
簡単そうに見えて、意外と奥が深いのでは、と思いまして。
作りたいのは、”進んだ分だけ正確に車輪が回るリグ”。
”正確さ”が欲しいので、Expressionを使って計算させたいと思います。
下絵のように、車輪の移動距離と円弧の部分が一致するような回転角を求めることができれば問題は解決するように思います。(下絵の赤い円周と青い距離の部分)
では移動した距離から、正確に回転角を求めるにはどうすればよいでしょうか?
移動距離と弧の長さは一致させるのだから、弧の長さに対応した回転角が分かればよいと思います。
弧の長さから回転角を求めるには、弧度法(radian)を使うのが一般的だと思います。
弧度法(radian)というのは、円の半径と円周の比で定義される角度、とでも言いましょうか。
普段使っている角度(degree)とはまた別の角度単位になります。弧度法(radian)を使った方が角度計算がいろいろ楽なので、大抵の角度計算は弧度法(radian)で行います。
詳しくは参照URLにゆずるとして、
弧度法(radian)を使って弧の長さから、角度を求める式は次のようになります。
角度(radian) = 弧の長さ / 半径
ちょいとMayaでコレを実装してみます。(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_sampleEXP01" exp = "$r = 5;n" exp += "$a = rad_to_deg(CTR.translateX / $r);n" exp += "ROT.rotateZ = -$a;n" pm.expression(string = exp, name = expName)
上記pymelを実行すると、Expressionの組まれた車輪オブジェクトが作成されます。
肝心のExpressionは最後の方のexpとかそのあたり。
Expressionだけみるとこんな感じ。
$r = 5; $a = rad_to_deg(CTR.translateX / $r); ROT.rotateZ = -$a;
1行目は車輪の半径です。(半径5の車輪を作ったので5)
2行目で移動距離と半径から回転角を求めています。
3行目で求めた角度で回転させてます。
さて、サンプルを動かしてみるとそれっぽいのですが・・・!
これX軸方向に進んだ分しか、車輪が回転してくれません。
たしかに、Expressionでは”$a = rad_to_deg(CTR.translateX / $r)“とX軸移動だけ使って角度を計算しているので、それ以外の方向に移動すると回転しません。
これは・・・失敗ですね(。・ ω<)ゞ
どの向きだろうと進行方向に進んだら、車輪が回転してくれなきゃ。
なので次回はそのあたりに絞って改善を。切り替えて、次!
(ここだけの話、私はリグが嫌いなのです。難しいから)
Wheelリグ 参考URL
http://underearth.wordpress.com/2009/09/05/auto-rotation-of-tyrewheel-in-maya/
弧度法 参考URL
http://www.s-yamaga.jp/nanimono/sonota/kodoho.htm
http://dic.nicovideo.jp/a/%E5%BC%A7%E5%BA%A6%E6%B3%95
コメント