Xangle/Yangle 02 - オイラー角を変換しよう

XYZオイラー角をYXYオイラー角に変換します。

X○○オイラー角なら画面X軸回転が可能、○○Zオイラー角ならその回転体軸中心の回転が可能、
Y○○オイラー角なら画面Y軸回転が可能、○○Yオイラー角ならSff登録時に方向ベクトル(0,-1,0)とすればねじれ回転が可能です。とても便利

Wikipedia 回転行列より転載
R_{x}(\theta )={\begin{bmatrix}1&0&0\\0&\cos \theta &-\sin \theta \\0&\sin \theta &\cos \theta \\\end{bmatrix}}R_{y}(\theta )={\begin{bmatrix}\cos \theta &0&\sin \theta \\0&1&0\\-\sin \theta &0&\cos \theta \\\end{bmatrix}}R_{z}(\theta )={\begin{bmatrix}\cos \theta &-\sin \theta &0\\\sin \theta &\cos \theta &0\\0&0&1\end{bmatrix}}
上からX軸回転、Y軸回転、Z軸回転です。
XYZオイラー角はあるベクトルrを用いて
Rz
→RyRz
→RxRyRz

このようにZ→Y→X軸回転を行いますから、計算すると回転行列RxRyRzは、、、
Wikipedia Euler anglesより転載
X_{1}Y_{2}Z_{3}={\begin{bmatrix}c_{2}c_{3}&-c_{2}s_{3}&s_{2}\\c_{1}s_{3}+c_{3}s_{1}s_{2}&c_{1}c_{3}-s_{1}s_{2}s_{3}&-c_{2}s_{1}\\s_{1}s_{3}-c_{1}c_{3}s_{2}&c_{3}s_{1}+c_{1}s_{2}s_{3}&c_{1}c_{2}\end{bmatrix}}
こうなります。cはcos、sはsinです。同様に、YXYオイラー角では
 
Y_{1}X_{2}Y_{3}={\begin{bmatrix}c_{1}c_{3}-c_{2}s_{1}s_{3}&s_{1}s_{2}&c_{1}s_{3}+c_{2}c_{3}s_{1}\\s_{2}s_{3}&c_{2}&-c_{3}s_{2}\\-c_{3}s_{1}-c_{1}c_{2}s_{3}&c_{1}s_{2}&c_{1}c_{2}c_{3}-s_{1}s_{3}\end{bmatrix}}
こうなります。これを互いに変換します。

 
XYZオイラー角の角度1,2、3とYXYオイラー角の角度1,2,3は違うので文字を変えます。X1Y2Z3オイラー角はXαYβZγとしましょう。
Y1X2Y3オイラー角はYXY③とします。
 
例1
YXYオイラー角の2行2列【以降(2,2)と表記します】とXYZオイラー角の(2,2)は同じはずなので、
cos② = cosα*cosγ - sinα*sinβ*sinγ
→② = arccos[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は"-π/2 ~ π/2"までしか返しません。それ以上広げると値が一意に定まらないからです。そこで、ちょっと工夫します。

θを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 = arctany/[√(x^2 + y^2) + x]】
θ = 2*arctany/[√(x^2 + y^2) + x]】
arctan"-π/2 ~ π/2"までしか返しませんが、2倍しているのでθは"-π ~ π"を返します。よって全ての角度を返せます。
ここで、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°ズレるのが分かると思います。よって
(xが正の場合) θ =  2*arctany/[√(x^2 + y^2) + x]】
(xが負の場合) θ =  180 - 2*arctany/[√(x^2 + y^2) - x]】

例えばこんな感じにすればバグらなくなります

記述する際は、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の解説記事なのか。。。?
 
計算間違ってたらゴメンナサイ
 
 
Wikipediaから転載した内容の著作権Wikipediaのライセンスに従います
 
MUGEN製作のメモ置き場
 
 
MUGENキャラの製作状況
現在:
沢田綱吉を製作中(家庭教師ヒットマンREBORN!

プッチ神父を公開中(AI付き)
岸辺露伴の外部AIを公開中
ジョナサン(旧)の外部AIを公開中
仗助の外部AIを公開中
エンポリオの外部AIを公開中
1部ディオを公開中(AI付き)
スティーリーダンを公開中(AI付き)
ステージ2つ公開中

あとたまにMUGEN1.1上で3Dモデル組み立てて遊んでいるので興味ある方はどうぞ
https://0011-mugen.hatenablog.com/archive/category/MUGEN%E5%B0%8F%E3%83%8D%E3%82%BF%E6%8A%80%E8%A1%93

公開先
https://onedrive.live.com/redir?resid=7C0630D7E27F52C3!569&authkey=!ALvVjJz8aRCBjXc&ithint=folder%2czip
Twitter(連絡先)
https://twitter.com/xyz_0011
一応メール
w0eleven@yahoo.co.jp