Xangle/Yangle 02 - オイラー角を変換しよう
Wikipedia 回転行列より転載
上からX軸回転、Y軸回転、Z軸回転です。
XYZオイラー角はあるベクトルrを用いて
Rzr
→RyRzr
→RxRyRzr
このようにZ→Y→X軸回転を行いますから、計算すると回転行列RxRyRzは、、、
Y1X2Y3オイラー角はY①X②Y③とします。
例1
cos② = cosα*cosγ - sinα*sinβ*sinγ
ここで注意。MUGENでの回転方向は全て左ねじ方向です。普通は右ねじ方向なのでしょうか、上記のα、β、γ、①、②、③は全て符号マイナス"-"がつきます。ここで、
cos(-x) = cosx
sin(-x) = -sinx
ですから、②は
② = -arccos[cosα*cosγ + sinα*sinβ*sinγ]
となります。これは簡単。
例2
(2,1)÷(2,3)に注目です
-tan③ = (cosα*sinγ + cosγ*sinα*sinβ) / (-cosβ*sinα)
→α、β、γ、①、②、③全てに符号マイナス"-"をつけて、、、
→③ = arctan[(-cosα*sinγ + cosγ*sinα*sinβ) / (cosβ*sinα)]
θをarctanから求めるとします。ここで、
tan(θ/2) = sin(θ/2)/cos(θ/2)
=[sin(θ/2)*cos(θ/2)]/[cos(θ/2)*cos(θ/2)]
=[(1/2)*sinθ]/cos^2(θ/2)
=sinθ/[2*cos^2(θ/2)]
=sinθ/[2*(1/2)(1 + cosθ)]
=sinθ/[1 + cosθ]
=(y/r)/[1 + (x/r)]
=y/(r + x)
=y/[√(x^2 + y^2) + x]
→θ/2 = arctan【y/[√(x^2 + y^2) + x]】
ここで、tanθ = y/x
tan③ = (cosα*sinγ + cosγ*sinα*sinβ) / (-cosβ*sinα)なら
x = (-cosβ*sinα)
y = (cosα*sinγ + cosγ*sinα*sinβ)
です。これより、
③ = 2*arctan【(cosα*sinγ + cosγ*sinα*sinβ)/[((-cosβ*sinα)^2 + (cosα*sinγ + cosγ*sinα*sinβ)^2)**.5 + (-cosβ*sinα)]】
ところで、θの式を見るとyが0でxが負のとき分子分母が0になりバグります。直角三角形で考えるとtanθは"y/x"ですが、ここでxが負になるとθが180°ズレるのが分かると思います。よって
例えばこんな感じにすればバグらなくなります
記述する際は、sin,cos,tanは弧度法しか扱えず、結果は度数法で欲しいので、
③ = 2*arctan【(cos(α*(pi/180))*sin(γ*(pi/180)) + cos(γ*(pi/180))*sin(α*(pi/180))*sin(β*(pi/180)))/[)((-cos(β*(pi/180))(*sin(α*(pi/180)))^2 + (cos(α*(pi/180))*sin(γ*(pi/180)) + cos(γ*(pi/180))*sin(α*(pi/180))*sin(β*(pi/180)))^2)**.5 + (-cos(β*(pi/180))*sin(α*(pi/180)))]】*(180/pi)
こうなります。なんじゃこりゃ
"*"や"+"を使いすぎてる?せいでこれを1行で記述するとエラー落ちします。varで分割しましょう
実はarccosも全ての角度を返さないはずなのですが、何かうまくいきます。なんでだろうね
以上まとめ
① = -2*atan((cosβ*sinγ)/(((-sinα*cosγ + cosα*sinβ*sinγ)**2 + (cosβ*sinγ)**2)**.5 - sinα*cosγ + cosα*sinβ*sinγ))
② = -acos(cosα*cosγ + sinα*sinβ*sinγ)
③ = 2*atan((-cosα*sinγ + sinα*sinβ*cosγ)/(((sinα*cosβ)**2 + (-cosα*sinγ + sinα*sinβ*cosγ)**2)**.5 + sinα*cosβ)) + 180
α = 2*atan((sin②*cos③)/(((cos①*cos②*cos③ - sin①*sin③)**2 + (sin②*cos③)**2)**.5 + (cos①*cos②*cos③ - sin①*sin③)))
β = -asin(-cos①*sin③ - sin①*cos②*cos③)
γ = 2*atan((sin①*sin②)/(((sin①*sin②)**2 + (cos①*cos③ - sin①*cos②*sin③)**2)**.5 + cos①*cos③ - sin①*cos②*sin③))
α:XYZオイラー角のX軸回転
β:XYZオイラー角のY軸回転
γ:XYZオイラー角のZ軸回転
①:Y1X2Y3オイラー角のY1軸回転
②:Y1X2Y3オイラー角のX2軸回転
③:Y1X2Y3オイラー角のY3軸回転
③について。+180がついています。正直よく分かっていないのですが、+180をつけないといけないようです。
多分tanθ = y/xのxとyの符号を逆にしてしまったせい
その他、特異点に注意
[Xangle/Yangle 01](→
Xangle/Yangle 01 - 簡単なエフェクトを作ろう - MUGEN製作のメモ置き場
)や公開している(XYangle_SankouYou_kfm.zip)をDLして[state 300]と見比べてみてください。これはMUGENの解説記事なのか。。。?
計算間違ってたらゴメンナサイ