- ベストアンサー
回転した座標軸と一致させるための回転軸と角度の算出
- xyz座標を回転してXYZ座標の向きに一致させたいと考えています。回転軸と回転角度を求める方法について教えてください。
- xyz座標からみたXベクトルの方向余弦、Yベクトルの方向余弦、Zベクトルの方向余弦が分かっています。XY軸を一致させるための回転軸と角度を算出する方法を教えてください。
- XYZ座標に一致させるために、xyz座標を回転させる必要があります。回転軸と回転角度を求める方法を教えてください。
- みんなの回答 (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 だから,この係数行列がそのまま座標回転行列。 座標回転行列は実直交行列なので,この転置行列が逆行列。
その他の回答 (7)
- 中村 拓男(@tknakamuri)
- ベストアンサー率35% (674/1896)
さらにもうひとつ。 回転軸の方向余弦が求まれば ロドリゲスの公式から cosθとsinθが 求まりますね。 #θ:回転角
お礼
とりあえず、オイラー角を使った方法で無事に解決できました。 1回の軸回転(任意軸回転)による方法についてはまだ出来ていませんが、たくさんのアドバイスを頂戴しましたので、後は自分で調べるなりして分かりそうです。 3度回転するよりも1度で終わればやはり美しいので、この方法も十分に理解して実装できるよう頑張ってみます。 この度はアドバイスしていただき、本当にありがとうございました。 大変参考になりました。
補足
何度もありがとうございますm(_ _)m そういえば、色々調べてたらその公式の記述も見かけました。 色々な方法があるようで面白いです。 それも試してみようと思います。 そろそろ回答締め切ります。
- 中村 拓男(@tknakamuri)
- ベストアンサー率35% (674/1896)
ANO6 です。もうちょっと考えてみました。 回転軸は回転によって変化しないから 回転行列をM 回転軸を W とすれば MW=W=EW (E:単位行列) (M-E)W=0 なので、W は M-E のうち、一次独立な行ベクトルを2本選び 外積をとれば得られます。適当に2本選んで外積とって 零ベクトルになっちゃったら、別の2本を選ぶでよろしいかと。 角度は前に示した方法で求まりますが、もっと簡単な方法は無いかな?
お礼
お一人にしかポイントを付与できないのが残念ですが、ベストアンサーと同じくらい助かりました。 この度は貴重な時間を割いてまでいろいろと教えていただき、大変ありがとうございますm(_ _)m
- 中村 拓男(@tknakamuri)
- ベストアンサー率35% (674/1896)
ANO5です。 回転軸を回転しても長さは変わりませんから固有値=1の固有ベクトルということに なりますね。 とすると固有方程式を解くまでもないので、固有ベクトルは簡単にもとまります。 回転軸に対する回転量は、回転軸に垂直なベクトルを用意すれば計算できます。 もっとスマートな方法があるかもしれませんが・・・
お礼
回転行列Rの固有ベクトルは(m32 - m23, m13 - m31, m21 - m12)で、良さそうな感じです。 角度については、行列のトレースが固有値の総和であることからtrace[R] = 1 + 2cosθ よって、θ=ArcCos((trace[R] - 1) / 2) で、求まるという記述がありました※。実際に実装して動作確認できました。 なぜそういう求め方で良いのか、自分にはまだよく分かりませんが…(^-^;) もっと勉強してがんばって理解します。 ※引用 http://www.rugbysensor.com/motion_cluc..html
- 中村 拓男(@tknakamuri)
- ベストアンサー率35% (674/1896)
ちゃんとした答を示せませんが 回転軸方向のベクトルは 回転で変化しないから 回転行列の固有ベクトル ですよね。
補足
回答ありがとうございますm(_ _)m なるほど、固有ベクトルという言葉は初めて知りました。いま調べて理解しました。 計算方法等もちらほら見かけることができるので、参考になりそうです。 勉強になりました。
- hitokotonusi
- ベストアンサー率52% (571/1086)
いや,座標回転行列が直接得られるのでオイラー角なんていらないんじゃない?という意味なんですが。サブルーチンなんか使わずに直接行列計算したらいいんじゃないの。まあ,詳細がわからないのでなんともいえませんが。
補足
あ、そういうことですか。 回転行列が分かっても動かせないんです。説明不足でした。 OpenGLとかDirectXとかなら、自分で回転行列使って回せますけど、別の開発環境になっていまして、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数とか、限られたものしか、無いんですよ~(;_;) あとさっきの補足に書いた回転行列は縦と横が逆だったかもということは気づいています(^-^;) 回答助かりますm(_ _)m
- hitokotonusi
- ベストアンサー率52% (571/1086)
やったことないけど, (オイラー角を使った回転行列の11要素) = cos(θxX) みたいなのが9個あるんでしょ。 これを解いて三つのオイラー角が一意に決まるんじゃないの?
補足
あ、θxXってそういうことなんですか…。 ちょっと、高校数学IIB+α程度の知識しか無く行列に不慣れで…。 まだよく分かってませんが連立すれば解けそうな気はしました。 少し時間をください。
- transcendental
- ベストアンサー率51% (28/54)
点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 回答していただいた内容は理解できました。 回転行列が分かると、オイラー角を算出するのは簡単そうだというのが分かってきました。 もう少し時間をください。
お礼
オイラー角を使った方法により無事に解決できました。 この度はアドバイスしていただき、本当にありがとうございました。 大変参考になりました。
補足
ありがとうございます。 分かりました、回転行列さえ分かれば、そこからオイラー角を求めるのは簡単なのは理解しました。 http://www7.atwiki.jp/lucifer/pages/13.html で、その回転行列は、単純に (θxX, θyX, θzX) (θxY, θyY, θzY) (θxZ, θyZ, θzZ) である…。 最初に知りたがってた任意軸回転の解についても、オイラー角が求まれば、そこから任意軸回転を求められそうです。 とりあえずこれで解決しそうですが、まだ自分の勘違いがあるかもなのでプログラム上でも完全に動作したことを確認してから締め切ります。(明日以降になりそうです)