- ベストアンサー
任意軸回転行列の回転量を少し減らす方法は?
- 任意軸回転行列の回転量を少し減らす方法について質問します。3D物理シミュレータで物体の回転を扱う際、アクセルという行列に任意軸回転行列を左から掛けていきます。しかし、回転量を少し減らしたい場合にどのような方法があるのかわかりません。解決策として回転軸と回転角を保持し、ベロシティに回転軸とデルタ×回転角を掛ける方法や、完成した任意軸回転行列から回転軸と回転角を逆算してベロシティに掛ける行列を再構成する方法を考えましたが、具体的な方法がわかりません。どなたか教えていただけますか?
- アクセルという行列に任意軸回転行列を掛けていく際、回転量を少し減らしたいと考えています。具体的な方法がわからず困っています。回転軸と回転角を保持しておいて、ベロシティに回転軸とデルタ×回転角を掛ける方法や、完成した任意軸回転行列から回転軸と回転角を逆算してベロシティに掛ける行列を再構成する方法を考えましたが、うまく解決できません。どなたかアドバイスをいただけないでしょうか?
- 任意軸回転行列の回転量を少し減らす方法について質問です。アクセルという行列に任意軸回転行列を左から掛けていきますが、回転量を弱める方法がわかりません。回転軸と回転角を保持しておいて、ベロシティに回転軸とデルタ×回転角を掛ける方法や、任意軸回転行列から回転軸と回転角を逆算してベロシティに掛ける行列を再構成する方法を考えましたが、うまく動作しません。解決策を教えていただけないでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
まず、行列は回転は表現できても、回転量は表現できません。 たとえば、x軸を中心に2π回転したことを表す行列というのは単位行列になります。 そこから回転量をちょっと少なくしても単位行列から変化しないことは理解できると思います。 つまり、必然的に回転量={回転軸+角度}という形で管理しなければならないということです。 回転軸+角度をを行列に反映する方法はわかると思います。 あとは回転量の合成ですが、それにはクォータニオンを利用します。 クォータニオンには下記の特徴があります。 ・回転軸と角度からクォータニオンを作ることができる。 ・クォータニオンから回転軸と角度を得ることができる。 ・2つのクォータニオン同士の積は、2つの回転量を合成した回転量を表す。 上記を利用すると、回転量の合成が出来ることがわかると思います。 注意が必要なのは、クォータニオンも行列と同様に ある軸を中心に2πの回転を表すクォータニオン == ある軸を中心に0の回転を表すクォータニオン ということです。 これの対策としては、回転量の合成を行う前にスケーリングして正規化し、合成後の回転量に逆の変換を行うことで正しい結果を得ることが出来ます。
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
本題とは外れたところからいきますが, 純粋に回転角を記憶しておくのでなければ「デルタ×回転角」という方法はやめた方がいいと思います. 回転を行列や四元数のような形で記憶していると 360° の倍数の情報が消えてしまうので, うまく計算できない可能性があります. 四元数からは回転角や回転軸の情報も (わりと簡単に) 取り出せるんでできないこともないですが, 上に書いたように「360° の倍数の情報」は消えてしまいます.
お礼
そうなんですよね。 「半分回す」を行うとき、時計回りか反時計回りかで半分掛けた回転先が変わるので気づきました。
- ki073
- ベストアンサー率77% (491/634)
アフィン変換を用いるのが分かりやすいように思います。 例えば、 http://imagingsolution.blog107.fc2.com/blog-entry-105.html のあたりを参考に まず、回転軸が特定の軸(例えばz軸)になるように回転させます。任意回転軸上の2点の座標を基準に考えると理解しやすいです。 (1)Z軸上に回転軸が重なるように移動 X軸周りに回転→Y軸周りに回転(ここまででZ軸と平行になるように)→平行移動(z軸上に) (2)z軸を中心に回転 (3)先の(1)の逆でもとにもどす 平行移動→Y軸周りに回転→X軸周りに回転 以上を4行4列の変換行列だけを計算すれば良いので計算量は多くはありません。軸周りの回転を変えるときには(2)だけを変えることで可能です。 二次元の例ですが、以前回答したものです(プログラムも載せています) http://okwave.jp/qa/q8038779.html また物質の回転軸が固定されている(独楽)のような場合や、回転中心が固定されているなどの場合は(1)からではなく(2)から始める方が楽なことがあります。その例 http://yahootv.okwave.jp/qa7872743.html
お礼
回転を行う際の1メソッドということでしょうか? ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
3次元空間中の回転については, 行列を使うほかに「四元数」を使う方法が考えられます.
補足
クォータニオンを勉強すればこの問題は解決されるでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
ど~しても行列じゃないとだめですか?
補足
どういう代替案をお持ちか検討がつかないので「行列でなくてもよいですよ」と申し上げておきます。 迅速なお返事ありがとうございます。助かります。。
お礼
qwertfk様、わかりやすい解説ありがとうございます。 クォータニオンならば回転軸と角を復元できるのですね。 > 回転量の合成を行う前にスケーリングして正規化し、合成後の回転量に逆の変換を行うことで正しい結果を得ることが出来ます。 こちらも参考にさせていただきます。 自分の質問について間違いがありました。 ・任意軸回転行列同士の積は必ずしも任意軸回転行列ではない。なぜなら任意の姿勢に持っていくためには回転は最低でも二度必要だからだ。 という点です。 よって(クォータニオンではなく、任意軸回転行列の場合)出来上がった行列から角度と軸を1つだけ抽出することはできないという結論に至りました。 1日悩んだ結果、この解法として、自分がやりたいのは積としての回転行列の回転量にdtを掛けるということだったので、あらかじめ回転量にdtを掛けた回転行列達の積をとることを思いつきました。 これが予期する動作を見せるか全く検討がつきません。 将来的にはこちらでご回答いただいたクォータニオンやスケーリングのお話を参考にさせていただくことになると思います。 ありがとうございました。
補足
お礼の「任意軸回転行列同士の積は必ずしも任意軸回転行列ではない。なぜなら任意の姿勢に持っていくためには回転は最低でも二度必要だからだ。」 やっぱりこれ間違ってますよね。一度でいけますよね。XYZではなく任意軸ならば。 角度と軸を抽出するならクォータニオンがよいということですよね。失礼いたしました。