プロが教えるわが家の防犯対策術!

3次元のシミュレーションの勉強をしています。

3次元の座標変換で
x,y,z:変換前の座標;
x',y',z':変換後の座標;
θ:回転する角度;
lx,ly,lz:平行移動量;
としたとき、

X軸に関する回転
             |10   0    0|
             |0cosθ sinθ 0|
[x' y' z' 1] = [x y z 1]|0-sinθ cosθ0|
             |00   0   1|
Y軸に関する回転
             |cosθ0-sinθ0|
             |0   10   0|
[x' y' z' 1] = [x y z 1]|sinθ0cosθ0|
             |0   00   1|
Z軸に関する回転
             |cosθ sinθ 00|
             |-sinθcosθ00|
[x' y' z' 1] = [x y z 1]|0   0   10|
             |0   0   01|
平行移動
             |10 0 0|
             |01 0 0|
[x' y' z' 1] = [x y z 1]|00 1 0|
             |lxly lz 1|

物体の姿勢を表現するときは
[物体の姿勢の変換行列] = [Z軸の回転行列][X軸の回転行列][Y軸の回転行列][平行移動]
 |XX XY XZ 0|XX,XY,XZ・・・X軸の単位ベクトルを変換した場合のベクトル
 |YX YY YZ 0|YX,YY,YZ・・・Y軸の単位ベクトルを変換した場合のベクトル
= |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/ba …
を参考にさせていただきました。)

A 回答 (1件)

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}]
    • good
    • 0
この回答へのお礼

なるほど。回答ありがとうございます。
3次元回転は非可換なので、
各軸に対する回転の順序を1通りに決めて各軸1回ずつの回転として
移動拡大縮小は一切しないという制約が必要なんですね。
詳しい説明まで書いてくださってありがとうございました。

お礼日時:2010/12/06 18:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!