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

こんにちは。お知恵をお借りしたく質問致します。
プログラミング中で出た話題なのですが、計算の問題ですので数学カテゴリが適しているだろうと思い、投稿いたします。

ちょっと説明しにくく図を添付致しましたので併せてご覧いただければと思います。(線がふるえていて申し訳ないです。)

図のように、xyz座標を回転してXYZ座標の向きに一致させたいと考えています。
また、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数があるので、それを活用しようと考えています。α,β,γはコサイン値(方向余弦)です。回転方向は、ベクトルの向きに時計回り…右ネジの法則みたいな感じです。

x軸から見たXの角度(θxX), y軸からのX(θyX), z軸からのX(θzX)
同様にx軸から見たY(θxY),θyY,θzY、θxZ,θyZ,θzZ
といったように、それらの角度(コサイン値)は分かっています。
(=xyz座標からみたXベクトルの方向余弦、Yベクトルの方向余弦、Zベクトルの方向余弦が分かっている。)

z軸とZ軸の外積を取ったベクトルを回転軸として、θzZが分かっているのでその角度で回転することでZ軸は一致しますけど、XY軸は合いません。(当然ですが…)

そのXY軸を合わせるためにまた回転するというのも遠回りで、任意の軸1本を中心に何度か回転するだけ(上記関数を1度使用するだけ)で、必ず向きが一致する解があると思うのですが、その任意軸と角度を算出する方法が分かりません。

一般にどういう計算をするのでしょうか。アドバイスいただければ幸いです。
なお、上記関数を用いない方法でも構いません。
「X軸(Y軸、Z軸)を回転軸としてφ度回転する」という関数もあるので、オイラー角を求める方法でも構いません。

その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。
どうかよろしくお願いいたします。

「回転した座標軸と一致させるための回転軸と」の質問画像

A 回答 (8件)

というかそのままでいいのか。

バカだ。。。。

回転前の基底ex, ey, ez,回転後の基底eX, eY, eZとして

eX = cos(θxX) ex + cos(θyX) ey + cos(θzX) ez
eY = cos(θxY) ex + cos(θyY) ey + cos(θzY) ez
eZ = cos(θxZ) ex + cos(θyZ) ey + cos(θzZ) ez

だから,この係数行列がそのまま座標回転行列。
座標回転行列は実直交行列なので,この転置行列が逆行列。

この回答への補足

ありがとうございます。

分かりました、回転行列さえ分かれば、そこからオイラー角を求めるのは簡単なのは理解しました。
http://www7.atwiki.jp/lucifer/pages/13.html

で、その回転行列は、単純に
(θxX, θyX, θzX)
(θxY, θyY, θzY)
(θxZ, θyZ, θzZ)
である…。

最初に知りたがってた任意軸回転の解についても、オイラー角が求まれば、そこから任意軸回転を求められそうです。

とりあえずこれで解決しそうですが、まだ自分の勘違いがあるかもなのでプログラム上でも完全に動作したことを確認してから締め切ります。(明日以降になりそうです)

補足日時:2014/07/04 13:47
    • good
    • 0
この回答へのお礼

オイラー角を使った方法により無事に解決できました。

この度はアドバイスしていただき、本当にありがとうございました。
大変参考になりました。

お礼日時:2014/07/06 15:50

さらにもうひとつ。


回転軸の方向余弦が求まれば
ロドリゲスの公式から
cosθとsinθが
求まりますね。

#θ:回転角

この回答への補足

何度もありがとうございますm(_ _)m

そういえば、色々調べてたらその公式の記述も見かけました。
色々な方法があるようで面白いです。

それも試してみようと思います。

そろそろ回答締め切ります。

補足日時:2014/07/06 15:32
    • good
    • 0
この回答へのお礼

とりあえず、オイラー角を使った方法で無事に解決できました。
1回の軸回転(任意軸回転)による方法についてはまだ出来ていませんが、たくさんのアドバイスを頂戴しましたので、後は自分で調べるなりして分かりそうです。

3度回転するよりも1度で終わればやはり美しいので、この方法も十分に理解して実装できるよう頑張ってみます。

この度はアドバイスしていただき、本当にありがとうございました。
大変参考になりました。

お礼日時:2014/07/06 15:55

ANO6 です。

もうちょっと考えてみました。

回転軸は回転によって変化しないから

回転行列をM 回転軸を W とすれば

MW=W=EW (E:単位行列)

(M-E)W=0

なので、W は M-E のうち、一次独立な行ベクトルを2本選び
外積をとれば得られます。適当に2本選んで外積とって
零ベクトルになっちゃったら、別の2本を選ぶでよろしいかと。

角度は前に示した方法で求まりますが、もっと簡単な方法は無いかな?
    • good
    • 1
この回答へのお礼

お一人にしかポイントを付与できないのが残念ですが、ベストアンサーと同じくらい助かりました。
この度は貴重な時間を割いてまでいろいろと教えていただき、大変ありがとうございますm(_ _)m

お礼日時:2014/07/06 15:59

ANO5です。



回転軸を回転しても長さは変わりませんから固有値=1の固有ベクトルということに
なりますね。

とすると固有方程式を解くまでもないので、固有ベクトルは簡単にもとまります。
回転軸に対する回転量は、回転軸に垂直なベクトルを用意すれば計算できます。

もっとスマートな方法があるかもしれませんが・・・
    • good
    • 0
この回答へのお礼

回転行列Rの固有ベクトルは(m32 - m23, m13 - m31, m21 - m12)で、良さそうな感じです。

角度については、行列のトレースが固有値の総和であることからtrace[R] = 1 + 2cosθ
よって、θ=ArcCos((trace[R] - 1) / 2)
で、求まるという記述がありました※。実際に実装して動作確認できました。
なぜそういう求め方で良いのか、自分にはまだよく分かりませんが…(^-^;)

もっと勉強してがんばって理解します。

※引用
http://www.rugbysensor.com/motion_cluc..html

お礼日時:2014/07/07 20:20

ちゃんとした答を示せませんが


回転軸方向のベクトルは
回転で変化しないから
回転行列の固有ベクトル
ですよね。

この回答への補足

回答ありがとうございますm(_ _)m

なるほど、固有ベクトルという言葉は初めて知りました。いま調べて理解しました。
計算方法等もちらほら見かけることができるので、参考になりそうです。

勉強になりました。

補足日時:2014/07/05 10:44
    • good
    • 0

いや,座標回転行列が直接得られるのでオイラー角なんていらないんじゃない?という意味なんですが。

サブルーチンなんか使わずに直接行列計算したらいいんじゃないの。まあ,詳細がわからないのでなんともいえませんが。

この回答への補足

あ、そういうことですか。
回転行列が分かっても動かせないんです。説明不足でした。

OpenGLとかDirectXとかなら、自分で回転行列使って回せますけど、別の開発環境になっていまして、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数とか、限られたものしか、無いんですよ~(;_;)

あとさっきの補足に書いた回転行列は縦と横が逆だったかもということは気づいています(^-^;)

回答助かりますm(_ _)m

補足日時:2014/07/04 15:58
    • good
    • 0

やったことないけど,



(オイラー角を使った回転行列の11要素) = cos(θxX)

みたいなのが9個あるんでしょ。
これを解いて三つのオイラー角が一意に決まるんじゃないの?

この回答への補足

あ、θxXってそういうことなんですか…。
ちょっと、高校数学IIB+α程度の知識しか無く行列に不慣れで…。

まだよく分かってませんが連立すれば解けそうな気はしました。
少し時間をください。

補足日時:2014/07/04 13:08
    • good
    • 0

点P(x、y、z)を各座標軸を軸として、ある角度Φだけ回転したときのPの移る先の座標を計算するには、3行3列の行列R(Φ)を使います。

すなわち、x軸のまわりにΦだけ回転するときR(Φ)は1行目、2行目、3行目の順に書くと、
A=(1 0 0)、(0 cosΦ -sinΦ)、(0 sinΦ cosΦ)
となります。

y軸中心に回転するときは、
B=(cosΦ 0 ーsinΦ)、(0 1 0)、(sinΦ 0 cosΦ)

z軸中心に回転するときは、
C=(cosΦ ーsinΦ 0)、(sinΦ cosΦ 0)、(0 0 1)

となり、点Pをx軸のまわりにΦ、さらにy軸のまわりにψだけ回転すると、
B(AP)=(B・A)P
を計算します。

この回答への補足

回答ありがとうございますm(_ _)m
回答していただいた内容は理解できました。

回転行列が分かると、オイラー角を算出するのは簡単そうだというのが分かってきました。
もう少し時間をください。

補足日時:2014/07/04 13:31
    • good
    • 0
この回答へのお礼

無事に解決できました。

この度はアドバイスしていただき、本当にありがとうございました。
大変参考になりました。

お礼日時:2014/07/06 15:49

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