とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

wxMaximaで3D数学を少々

はじめに

wxMaximaを使用してみました。
その時の簡単なまとめです、数学は苦手なので間違いあると思います、ご注意を。

3D系の行列(4x4行列)を計算してみました。


画面


まずは基本

平行移動


T:matrix([1,0,0,Tx],[0,1,0,Ty],[0,0,1,Tz],[0,0,0,1]);

スケール


S:matrix([Sx,0,0,0],[0,Sy,0,0],[0,0,Sz,0],[0,0,0,1]);

X軸回転


RX:matrix([1,0,0,0],[0,cos(x),-sin(x),0],[0,sin(x),cos(x),0],[0,0,0,1]);

Y軸回転


RY:matrix([cos(x),0,sin(x),0],[0,1,0,0],[-sin(x),0,cos(x),0],[0,0,0,1]);

Z軸回転


RZ:matrix([cos(x),-sin(x),0,0],[sin(x),cos(x),0,0],[0,0,1,0],[0,0,0,1]);

回転行列の組み合わせ(その1)

Rx.Ry.Rz


matrix([cos(x)^2,-cos(x)*sin(x),sin(x),0],[cos(x)*sin(x)^2+cos(x)*sin(x),cos(x)^2-sin(x)^3,-cos(x)*sin(x),0],[sin(x)^2-cos(x)^2*sin(x),cos(x)*sin(x)^2+cos(x)*sin(x),cos(x)^2,0],[0,0,0,1])

Rx.Rz.Ry


matrix([cos(x)^2,-sin(x),cos(x)*sin(x),0],[sin(x)^2+cos(x)^2*sin(x),cos(x)^2,cos(x)*sin(x)^2-cos(x)*sin(x),0],[cos(x)*sin(x)^2-cos(x)*sin(x),cos(x)*sin(x),sin(x)^3+cos(x)^2,0],[0,0,0,1])

Ry.Rx.Rz


matrix([sin(x)^3+cos(x)^2,cos(x)*sin(x)^2-cos(x)*sin(x),cos(x)*sin(x),0],[cos(x)*sin(x),cos(x)^2,-sin(x),0],[cos(x)*sin(x)^2-cos(x)*sin(x),sin(x)^2+cos(x)^2*sin(x),cos(x)^2,0],[0,0,0,1])

Ry.Rz.Rx


matrix([cos(x)^2,sin(x)^2-cos(x)^2*sin(x),cos(x)*sin(x)^2+cos(x)*sin(x),0],[sin(x),cos(x)^2,-cos(x)*sin(x),0],[-cos(x)*sin(x),cos(x)*sin(x)^2+cos(x)*sin(x),cos(x)^2-sin(x)^3,0],[0,0,0,1])

Rz.Rx.Ry


matrix([cos(x)^2-sin(x)^3,-cos(x)*sin(x),cos(x)*sin(x)^2+cos(x)*sin(x),0],[cos(x)*sin(x)^2+cos(x)*sin(x),cos(x)^2,sin(x)^2-cos(x)^2*sin(x),0],[-cos(x)*sin(x),sin(x),cos(x)^2,0],[0,0,0,1])

Rz.Ry.Rx


matrix([cos(x)^2,cos(x)*sin(x)^2-cos(x)*sin(x),sin(x)^2+cos(x)^2*sin(x),0],[cos(x)*sin(x),sin(x)^3+cos(x)^2,cos(x)*sin(x)^2-cos(x)*sin(x),0],[-sin(x),cos(x)*sin(x),cos(x)^2,0],[0,0,0,1])

回転行列の組み合わせ(その2)

Rx.Rx


matrix([1,0,0,0],[0,cos(2*x),-sin(2*x),0],[0,sin(2*x),cos(2*x),0],[0,0,0,1])

Rx.Ry


matrix([cos(x),0,sin(x),0],[sin(x)^2,cos(x),-cos(x)*sin(x),0],[-cos(x)*sin(x),sin(x),cos(x)^2,0],[0,0,0,1])

Rx.Rz


matrix([cos(x),-sin(x),0,0],[cos(x)*sin(x),cos(x)^2,-sin(x),0],[sin(x)^2,cos(x)*sin(x),cos(x),0],[0,0,0,1])

Ry.Ry


matrix([cos(2*x),0,sin(2*x),0],[0,1,0,0],[-sin(2*x),0,cos(2*x),0],[0,0,0,1])

Ry.Rx


matrix([cos(x),sin(x)^2,cos(x)*sin(x),0],[0,cos(x),-sin(x),0],[-sin(x),cos(x)*sin(x),cos(x)^2,0],[0,0,0,1])

Ry.Rz


matrix([cos(x)^2,-cos(x)*sin(x),sin(x),0],[sin(x),cos(x),0,0],[-cos(x)*sin(x),sin(x)^2,cos(x),0],[0,0,0,1])

Rz.Rz


matrix([cos(2*x),-sin(2*x),0,0],[sin(2*x),cos(2*x),0,0],[0,0,1,0],[0,0,0,1])

Rz.Rx


matrix([cos(x),-cos(x)*sin(x),sin(x)^2,0],[sin(x),cos(x)^2,-cos(x)*sin(x),0],[0,sin(x),cos(x),0],[0,0,0,1])

Rz.Ry


matrix([cos(x)^2,-sin(x),cos(x)*sin(x),0],[cos(x)*sin(x),cos(x),sin(x)^2,0],[-sin(x),0,cos(x),0],[0,0,0,1])

狭義のオイラー

Z-X-Zの回転を狭義のオイラー角というそうです。
こちらもwxMaximaで試そうと思いましたが、使ったことないのでやめときました。

狭義のオイラー角についてはこちらを
http://d.hatena.ne.jp/cherub/20080415

最後に

行列の次にQuaternion(四元数クォータニオン)を試そうとしたんですが、グーグル先生によると色々手続きがめんどくさそうなので今回は諦めました。
wxMaxima上で「行列・Quaternion」の式を整理したり、デバッグが出来れば便利だと思うのでもう少し試してみます。