• 締切済み

任意点を中心とした回転

 3Dで、任意の点を中心としたXYZ軸回転を行列で行うにはどうしたらよいでしょうか?

みんなの回答

  • usatan2
  • ベストアンサー率37% (163/436)
回答No.3

任意点を中心とした回転では、原点が原点に対応しませんので、行列で表現するのは不可能です。 行列で変換する限り、原点(0,0,0)は必ず(0,0,0)に変換されます。 そこで、次元をあげて、3次元の点(x,y,z)を4次元の点(x,y,z,1)として扱うと、行列で表現することができるようになります。 「同次座標系」というキーワードで検索してみてください。

tomonori7
質問者

お礼

 ありがとうございます。  クォータニオンを使用して、上手くいきました。  回答ありがとうございました。

  • 10ken16
  • ベストアンサー率27% (475/1721)
回答No.2

平行移動と回転移動を組み合わせるしかありません。 (4×4の行列で可能です)

参考URL:
http://www.ceres.dti.ne.jp/~ykuroda/oyaj/bone/basic3d.html
tomonori7
質問者

お礼

 ありがとうございます。  クォータニオンを使用して、上手くいきました。  回答ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「平行移動で中心点を原点に移してから原点中心の回転を行い, 最後にもう 1度平行移動して中心点を戻す」という操作をがんばって行列で書く.

tomonori7
質問者

お礼

 ありがとうございます。  クォータニオンを使用して、上手くいきました。  回答ありがとうございました。

関連するQ&A

  • 任意軸回転行列の、回転量を少し減らしたいのですが…

    皆様、いつもお世話になっております。 任意軸回転行列関係でひとつ疑問が出たので質問させていただきます。 3D物理シミュレータで物体の回転を扱うときに出た疑問です。 「アクセル」という行列に、単位行列を初めとして、さまざまな任意軸回転行列を、左から掛けていきます。 これが終わると「アクセル」はある回転行列になるはずです。 次に、問題があります。「ベロシティ」という行列に、「アクセル」という回転行列を、左からそのまま掛けるのではなく、回転量をちょっと少なくした、弱い回転を、しかしながら回転軸は同じものを、掛けたいのです。 -- ・まず思いついた解決策: 回転角と回転軸を保持しておいて、ベロシティに「回転軸」と「デルタ×回転角」を掛ける、という方法。 =>しかしアクセルの時点で、行列を左から掛けていきたいので、この過程で回転角と回転軸を更新し続ける手法がわかりません。そもそも存在するのでしょうか。 ・次に思いついた方法: アクセルで左から任意軸回転行列をかけていった完成品は、これもまた任意軸回転行列のはずですから、この完成した行列から回転軸と回転角を逆算して、ベロシティに掛ける行列を「回転軸」と「デルタ×回転角」から再構成する、という方法。 =>任意軸回転行列から回転角と回転軸を逆算する方法がわかりません。 ・次に思いついた方法: 任意軸回転行列から角度と軸を逆算しなくとも、任意軸回転行列に、何かしら手を加えると、回転角度に定数を掛け、回転量を調節することができる。 =>どんな方法があるのだろうか -- これらの推測はしましたが、どれも解答にたどり着けませんでした。 どうかよろしくお願い致します。 不明な点がございましたら随時補足いたします。

  • 独楽の中心も回転しているのでしょうか。

    独楽の軸は回転していることは分かりますが、軸の中心も回転しているのでしょうか。数学でいう点を想像すると回転していてもわからないだけなのかとも思うのですが、点の回転というのはあり得ないことなのでしょうか。もしそうだとすると、中心だけは別に考えるのでしょうか。

  • 任意軸回転を、XYZ軸回転の組み合わせに分解する?

    こんにちは、私は今DirectXを使って物理シミュレーションを行おうとしております。 そこで物体を任意軸回転させて表示したいのですが、どういった方法を用いれば実現できますか? http://marupeke296.com/DXGSmp_No10_Quaternion.html このサイトで解説されているようにクォータニオンを使うのでしょうか? ただこのサイトで示されているサンプルでは、玉ひとつひとつが回転しているわけではなく、位置がある軸に関して回転させた位置へ「並進させる」ということを行っています。 私は物体を回転させるときに、任意軸回転を使いたいなと思っています。 -- D3DXMatrixRotationX(&Rot_X, angle); D3DXMatrixMultiply(&World, &World, &Rot_X); -- 以上はX軸回転を行う行列をワールド座標変換行列に掛けるコマンドですが、この勢いで任意軸回転行列を作成・掛けるといったことはできますか? 知識が足りなく稚拙な表現で申し訳ありませんが・・・ 任意軸回転をXYZ軸回転の組み合わせに分解できれば D3DXMatrixRotationX(YやZ)とD3DXMatrixMultiply関数のみを使って簡単にできちゃうのですがそのような数学的手法は存在しますか? それとも、任意軸回転関数を自前で既に作ってあるので D3DXMATRIX型の変数にその値を手動で注入(構造体の中身を知る必要あり)、D3DXMatrixMultiply関数で掛けるといった操作でいけちゃうでしょうか? あとでちょっとやってみます。すみません。しかしD3DX~系の用意された関数の域を出て気持ちよくはないですが。

  • 任意の点を原点を中心に回転させたときの座標を求め…

    任意の点を原点を中心に回転させたときの座標を求める式は? 質問がちょっと場違いかもしれませんが・・・。 ガスダンパーの選定の助けとなる簡単なソフトを作ろうと思っているのですが、その過程で下記の事がわかりません。解る方がいらっしゃったら教えてください。 座標(A、B)の点を、原点を中心にθ(rad)回転させた時の座標(X、Y)を求める式を教えてください。

  • 回転中の独楽の理想的中心(点)は回転していますか

    以前にも同じような質問をさせていただいたかもしれませんが、やはり釈然としない気持ちになっています。回っている独楽は確かに回っていますが、中心(点)というのは回転していてもわからないものなのか。現実の独楽は軸の先端で位置を変えている部分は中心ではないように思えるのですが、どのように考えたらよいのかご教示いただければ幸いです。

  • 3D回転ツールの3D中心点(Z:)について

    WindowsでFlashCS5を使用しています。 どうぞ、よろしくお願いいたします。 3D回転ツールを使って、 ムービークリップを、 モーショントゥイーンを使い、 Y軸で回転するアニメーションを作りたいです。 モーショントゥイーンを使って、Y軸で回転させる際ですが、 ムービークリップのZ座標と、 3D中心点のZ座標を、異なる値に設定することは、 仕様上、可能でしょうか? ※惑星の周りをまわる衛星のアニメーションを作るようなイメージです。 ※モーショントゥイーンを使わず、  ムービークリップのZ座標と、3D中心点のZ座標が異なる状態で、  ムービークリップをY軸で回転させるだけなら、  出来ることは確認できました。  ですが、これではアニメーションが出来ません。 下記の手順で、モーショントゥイーンを使ったアニメーションを試してみましたが、 上手くいきませんでした。 1.ムービークリップを1つ作成。 2.ステージに配置。 3.ムービークリップを配置したタイムラインを、10フレームまで延ばす。 4.そのタイムラインに、モーショントゥイーンを設定する。 5.「変形」パネルの「3D中心点」の「Z:」に、100を入力する。 6.3D回転ツールで、Y軸で回転させる。 3D回転ツールで、表示された円をドラッグしている間は、 ムービークリップのZ座標と、3D中心点のZ座標が、異なる値に設定された状態で、 回って表示されています。 ※衛星のような軌道です。 しかし、ドラッグを終えると、 ムービークリップのZ座標と、3D中心点のZ座標が、同じ値の場合の結果と なってしまいます。 ※その場で回り続ける惑星のようです。 Q1. これは、モーショントゥイーンでは、3D中心点のZ:に値を設定することが 出来ない、という意味でしょうか? Q2. また、希望するアニメーションを実現する方法は、ありますでしょうか? ※ムービークリップに、衛星のような軌道を進ませるアニメーションです。 ご教示のほど、どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 任意軸周りの回転について

    任意軸周りの回転について 実はプログラムのバグがどうしてもわからず、相談させていただきます。 結果は期待とおりの結果になりません。 図々しいお願いですが、ぜひ間違いをご指摘願います。 3次元座標上に数個の点があり、それを線分で結びます。 ある点をPiとするとしたとき線分(Pi-1,Pi)と(Pi,Pi+1)のなす 角度を180度にしたいのです。そしてPiをデータの並びから 外します。つまりPiでの曲げをキャンセルというイメージです。 任意の軸に対する回転の座標を変換の公式を使用しています。 以下のurlにソースがあります。 http://1st.geocities.jp/kanna_sakura_hana/rotation/header.cpp http://1st.geocities.jp/kanna_sakura_hana/rotation/draw.cpp 実行したい変換のイメージは http://1st.geocities.jp/kanna_sakura_hana/rotation/sample.jpg に図示してあります。 FormCreateのイベント関数に座標変換部分のソースが書かれて います。 ぜひご教授願います。 なお、任意軸周りの回転行列は「ゲーム3D数学」を参考にしました。

  • 回転の中心を求める!非常に難しい!

    教えて下さい。 求めたいものは、回転の中心点(Rx,Ry)です。 半径Rの円があります。中心は平面上(Cx,Cy)にある。 この円を(Rx,Ry)を中心に回転させる。 回転させた角度θが0~nのときのX座標との交点を(Mx(0~n),0)とする。(実際には交点は2点あるが1点側のみが分かっていて、もう一点はわからない)。 この中で既知のものは、 角度(0~n) X軸との交点(Mx(0-n),0) 半径R 以上である。 円の中心(Cx,Cy)は、わからないが求めなくてもかまわないものとする。 この条件の中で回転中心(Rx,Ry)を求めたい。 私には、非常に難しいです。 Inputされる情報が少ない為、投票をなどしてデータを擬似的に作ってみたがうまくいきませんでした。 どなたか、この問題をとくことが可能な方教えて下さい。 よろしくお願いします。

  • 3次元座標を原点中心に回転したい

    任意のゼロでないベクトル(a,b,c)を原点中心に回転し、z軸に合致させるとする。同じ回転移動を3次元座標上の任意の点(x,y,z)に対して行った時の移動後座標が知りたいのです。 計算と結果を教えて下さい。

  • 任意点を中心にした3次元回転について

    点(x,y,z)を中心にした点(a,b,c)を回転させたいのです。 過去ログを調べましたら、『クォータニオン』という方法で解決された方がおられるようですが、具体的には、どのような数式なのでしょうか?

専門家に質問してみよう