dポイントプレゼントキャンペーン実施中!

3Dのプログラミングを行っていますが、ある物体から得た回転行列から、ラジアンの角度を得たいと思っています。

物体はx軸・y軸・z軸にそれぞれ未知の値で回転させられており、
この物体から得られる回転行列Rは3×3の行列として
|r11 r12 r13|
|r21 r22 r23|
|r31 r32 r33|
と与えられています。ここから、x軸・y軸・z軸にそれぞれ何度回転させられているのかを算出するにはどのようにすればいいでしょうか?

参考資料が少ないため、ご教授お願いいたしますm(_ _)m

A 回答 (4件)

先ほどの回答はアルゴリズムが複雑なのでもっと簡単な方法を考えてみました。


|r11 r12 r13|
|r21 r22 r23|=A
|r31 r32 r33|
として固有ベクトル v、固有値 λに対して
(A-λE)v=0
なので固有値λ=1のときvは軸の方向なので、
|r11-1 r12  r13 |
|r21  r22-1 r23 |・v=0
|r31  r32  r33-1|
なので(ri1-1 ri2  ri3) (i=1~3)は軸の方向を向いたベクトルとvと直交します。
そこで、0でないベクトルを取ります(ここではaとします)。
この軸と直交したベクトルを行列Aで回転させて、b=Aa とします。
もとのベクトルaとbが成す角度を求めます。
b・a = |a|^2 cosθ、|b×a| = |a|^2 sinθなので、
θ=atan2(|b×a|, b・a)が求める角度になります。

どうでしょう。
    • good
    • 2
この回答へのお礼

アルゴリズムまで考えていただきありがとうございます^^;
やはり3Dプログラミングは難しいですね・・・
今まで学んだ行列の知識をフル活用しています笑

さっそく、ご提示いただいたアルゴリズムを試してみたいと思います!
ご解答、ありがとうございました。

お礼日時:2009/12/29 15:30

|1  0   0 |


|0 cosθ -sinθ|
|0 sinθ cosθ|
の固有値を求めると1, exp(ix), exp(-ix)になると思います。
適当な方向に回転の軸を向けるためにこの行列をユニタリ変換で適当に基底を変えても固有値は変わらないと思います(簡単に証明できます)。
ということで、1でないどちらかの固有値の複素数としての偏角から角度が得られると思います。(もちろん2π×自然数の自由度と、軸のどちらから眺めるか=正負の自由度がありますが)

プログラミングでこの計算をするのはしんどいと思われますが、わたしなら、以下のようにやるでしょう。
|r11 r12 r13|
|r21 r22 r23|=A
|r31 r32 r33|
として固有方程式
0=det(A-xE)≡ax^3+bx^2+cx+d
の係数を求めます。
さらに一つの解は1と分かっているので
(x-1)(xの2次式)=0とできるはずです。係数の関係を求めるために
ax^3+bx^2+cx+d=(x-1)(sx^2+tx+u)=sx^3+(t-s)x^2+(u-t)x-u
とすると
s=a
t=b+a
u=c+b+a=-d (!本当?)
という関係がえられて、このs,t,uから2次方程式の解を求めて、偏角をもとめればよいかと思います。
    • good
    • 0

回転前の各軸の基底ベクトルを回転行列にかけて、変換後の基底方向を計算して角度算出しては?



例えばx軸はn1=(1,0,0)なので
n1'=|L|(n1)
を計算して内積(n1',n1)=cosαから角度計算する。ここで|L|は回転行列です。
    • good
    • 0
この回答へのお礼

なるほど、基底ベクトルから回転角度を算出するのですか。
早速試してみます!ご解答いただきありがとうございました。

お礼日時:2009/12/29 15:28

1つ


>物体はx軸・y軸・z軸にそれぞれ未知の値で回転させられており、
x軸、y軸の2つの軸の周りの回転だけで十分任意の位置に回転できるので
z軸の周りの回転は冗長です。言い換えれば回転行列Rから2つの軸の周りの回転角の情報しか得られません。

2つ
>2軸の周りの回転の回転の順序を変えると回転行列Rが同じになりません。
つまり、回転行列Rだけの情報では、2軸の周りの回転角が一意的に決まりません。なので一意的に決まる為には、2軸の周りの回転の順序などを指定しないといけないでしょう。

まず、具体的な簡単な例を作って、その回転行列を求めて、その回転行列から回転角が決定できるかをやってみてください。
そうすれば、上述の2つの冗長性のアドバイスのことが理解できるかと思います。その結果、回転角を決定するには、どんな条件を付け加えれば良いか、目処が立つかと思います。

参考URL
http://ft-lab.ne.jp/cgi-bin/wiki.cgi?page=%A5%A2 …
    • good
    • 0
この回答へのお礼

ご解答ありがとうございます!!
実際に例で試してみるのがよさそうですね^^;早速やってみます!
ありがとうございました。

お礼日時:2009/12/29 15:27

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