質問: |zx zy zz 0|zx,zy,zz・・・z軸の単位ベクトルを変換した場合のベクトル |lx ly lz 1|lx,ly,lz・・・平行移動量ベクトル というのは分かるのですが、 x軸、y軸、z軸の単位ベクトルを変換した後のベクトルから x軸、y軸、z軸にそれぞれ何度ずつ回転させたかを求めるにはどのようにすればよいのでしょうか? つまり、x軸に対して30度、y軸に対して45度、z軸に対して60度回転させた後の |xx xy xz 0| |yx yy yz 0| |zx zy zz 0| |lx ly lz 1| の値からx軸に対して30度、y軸に対して45度、z軸に対して60度回転している事を導きたいのです。 分かる方教えてください。 お願いします。 (質問に関して、 http://www.ceres.dti.ne.jp/~ykuroda/oyaj/bone/basic3d.html を参考にさせていただきました。)
回答: 3次元回転は非可換のため 各軸に対する回転の順序を1通りに決めて 各軸1回ずつの回転として 移動拡大縮小は一切しないと しない限り結果行列から各軸に対する回転角度は 求められません。 x軸に対しての回転角t y軸に対しての回転角u z軸に対しての回転角v (z軸周回転行列)*(y軸周回転行列)*(x軸周回転行列)の順序で左から 縦ベクトル (x) (y) (z)に対して x軸周回転,y軸周回転,z軸周回転の順序で回転行列を乗じるもの とすると回転行列は (cosv,-sinv,0)(cosu,0,-sinu)(1, 0, 0) (sinv, cosv,0)( 0,1, 0)(0,cost,-sint) ( 0, 0,1)(sinu,0, cosu)(0,sint, cost) = (cosvcosu,-cosvsinusint-sinvcost,-cosvsinucost+sinvsint) (sinvcosu,-sinvsinusint+cosvcost,-sinvsinucost-cosvsint) ( sinu, cosusint, cosucost) = (a_xx,a_xy,a_xz) (a_yx,a_yy,a_yz) (a_zx,a_zy,a_zz) となり [ (a_xx)^2+(a_yx)^2+(a_zx)^2=1 (a_zx)^2+(a_zy)^2+(a_zz)^2=1 (a_xy){1-(a_zx)^2}+(a_xx)(a_zx)(a_zy)+(a_yx)(a_zz)=0 (a_xz){1-(a_zx)^2}+(a_xx)(a_zx)(a_zz)=(a_yx)(a_zy) (a_yy){1-(a_zx)^2}+(a_yx)(a_zx)(a_zy)=(a_xx)(a_zz) (a_yz){1-(a_zx)^2}+(a_yx)(a_zx)(a_zz)+(a_xx)(a_zy)=0 ]の条件のとき y軸に対しての回転角 u=arcsin(a_zx) z軸に対しての回転角 v=arccos[a_xx/√{1-(a_zx)^2}] x軸に対しての回転角t t=arccos[a_zz/√{1-(a_zx)^2}]