- ベストアンサー
3次元ベクトルをある軸ベクトルで回転させたい
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
先ず、中心点(Sx,Sy,Sz)が原点にくるよう全体を平行移動させます。 (一番最後に元に戻します) 始点(Px,Py,Pz)は、(Px-Sx,Py-Sy,Pz-Sz)に移ります。この座標を(Px',Py',Pz')とします。 次に、回転軸ベクトル(Ax Ay Az)を回転させ、x軸に合致させます。それには二回の 回転変換が必要です。 最初に、ベクトル(Ax Ay Az)と、x軸方向単位ベクトル(1 0 0)のなす平面の法線ベクトルが z軸に合うよう、x軸を回転させます(その角度をφとします)。 すると、回転軸ベクトルはx-y平面上に乗るので、それがx軸に合うよう、z軸を回転させます (その角度をψとします)。 ベクトル(Ax Ay Az)と、x軸方向単位ベクトル(1 0 0)のなす平面の法線ベクトルは、(0 Az -Ay)。 x軸周りにφ回転させると、このベクトルは、 「1 0 0 「 0 =「 0 0 cosφ -sinφ Az Az・cosφ+Ay・sinφ 0 sinφ cosφ」 -Ay」 Az・sinφ-Ay・cosφ」 で、z軸ベクトルに合うので 「 0 =「0 Az・cosφ+Ay・sinφ 0 Az・sinφ-Ay・cosφ」 1」 これから、cosφ=-Ay/(Ay^2+Az^2)、sinφ=Az/(Ay^2+Az^2) ∴ φ=Arctan(-Az/Ay) 回転軸ベクトル(Ax Ay Az)は、 「1 0 0 「Ax =「 Ax =「 Ax =「Ax 0 cosφ -sinφ Ay Ay・cosφ-Az・sinφ Ay・{-Ay/(Ay^2+Az^2)}-Az・{Az/(Ay^2+Az^2)} -1 0 sinφ cosφ」 Az」 Ay・sinφ+Az・cosφ」 Ay・{Az/(Ay^2+Az^2)}+Az・{-Ay/(Ay^2+Az^2)}」 0」 に変換され、x-y平面上に乗ります。これを(Ax' Ay' Az') とします。 つまり、(Ax' Ay' Az')=(Ax -1 0) 始点(Px',Py',Pz')もこの変換を受けるのですが、変換を全部纏めて後、一括変換させます。 今度は、x-y平面上に乗った回転軸ベクトル(Ax' Ay' Az')を、z軸の周りにψ回転させます。 「cosψ -sinψ 0 「Ax' =「Ax'・cosψ-Ay'・sinψ =「Ax・cosψ+sinψ sinψ cosψ 0 Ay' Ax'・sinψ+Ay'・cosψ Ax・sinψ-cosψ 0 0 1」 Az'」 Az' 」 0 」 これが、x軸ベクトルに合うので、 Ax・cosψ+sinψ=1 Ax・sinψ-cosψ=0 これから、cosψ=Ax/(Ax^2+1)、sinψ=1/(Ax^2+1) ∴ ψ=Arctan(1/Ax) 以上の回転の変換の積は、 「cosψ -sinψ 0 「1 0 0 =「cosψ -sinψ・cosφ sinψ・sinφ sinψ cosψ 0 0 cosφ -sinφ sinψ cosψ・cosφ -cosψ・sinφ 0 0 1」 0 sinφ cosφ」 0 sinφ cosφ 」 この変換を始点(Px',Py',Pz')に施します。 「cosψ -sinψ・cosφ sinψ・sinφ 「Px' = 「Px'・cosψ-Py'・sinψ・cosφ+Pz'・sinψ・sinφ sinψ cosψ・cosφ -cosψ・sinφ Py' Px'・sinψ+Py'・cosψ・cosφ-Pz'・cosψ・sinφ 0 sinφ cosφ 」 Pz'」 Py'・sinφ+Pz'・cosφ 」 この点を(Px”,Py”,Pz”)とします。 さて、ここでx軸に合った回転軸ベクトル(1 0 0)周りに(Px”,Py”,Pz”)を角度θ、回転させます。 「1 0 0 「Px” =「 Px” 0 cosθ -sinθ Py” Py”・cosθ-Pz”・sinθ 0 sinθ cosθ」 Pz”」 Py”・sinθ+Pz”・cosθ」 これを(P_x, P_y, P_z)とします。 今度は、回転させた回転軸を元に戻す変換です。 回転の変換の逆行列は、行列各要素の余因子の行と列を入れ替えたものを行列式で割ったもので、 行列式は、(cosψ)^2+(sinψ)^2=1 なので、逆行列は 「 cosψ sinψ 0 -sinψ・cosφ cosψ・cosφ sinφ sinψ・sinφ -cosψ・sinφ cosφ」 これを、(P_x, P_y, P_z)に施します。 「 cosψ sinψ 0 「P_x =「P_x・cosψ+P_y・sinψ -sinψ・cosφ cosψ・cosφ sinφ P_y -P_x・sinψ・cosφ+P_y・cosψ・cosφ+P_z・sinφ sinψ・sinφ -cosψ・sinφ cosφ」 P_z」 P_x・sinψ・sinφ-P_y・cosψ・sinφ+P_z・cosφ」 結局、θ回転後のP点の座標は、 x座標 : P_x・cosψ+P_y・sinψ y座標 : -P_x・sinψ・cosφ+P_y・cosψ・cosφ+P_z・sinφ z座標 : P_x・sinψ・sinφ-P_y・cosψ・sinφ+P_z・cosφ となります。 ここで、置き換えた変数を順次、元に戻します。 P_x、P_y、P_z を Px”、Py”、Pz” に、 Px”、Py”、Pz” を Px’、Py’、Pz’ に、 最後に、平行移動を戻して Px’、Py’、Pz’ を Px、Py、Pz に直します。
その他の回答 (3)
- arrysthmia
- ベストアンサー率38% (442/1154)
軸の方向ベクトルが (Ax, Ay, Az) なのか (Ax-Sx, Ay-Sy, Az-Sz) なのか、 図からは判り難いけど… いずれにせよ、 ソレと直交するベクトルを2個見つけることができれば、 (Sx, Sy, Sz) を原点とし、回転軸を座標軸の一つに持つ 直交座標系が作れるでしょう。その座標系では、 質問の回転は、座標平面内での回転になります。 さあ、成分計算。
お礼
ありがとうございます。外積をつかって直行ベクトルを導き出して回転させることができました。 いろいろと勉強になります。
- info22
- ベストアンサー率55% (2225/4034)
簡単なようで結構複雑ですね。 3Dのアフィン変換 http://ft-lab.ne.jp/cgi-bin/wiki.cgi?page=%A5%A2%A5%D5%A5%A3%A5%F3%CA%D1%B4%B9_3DCG が参考になるかと思います。 基本的な移動行列に分解してそれぞれの行列の合成行列として変換行列を考えて見てください。
お礼
ありがとうございます。これを機に行列を勉強し始めました。 そのような専門書を買って今読んで、いちおうできたとことです。 とても助かりました。
- Tacosan
- ベストアンサー率23% (3656/15482)
平行移動させれば, 中心点は原点だと思ってかまいませんね. ということを前提にして「四元数」で調べるとおいしいかも.
お礼
ありがとうございます。原点に移動してなんとかできそうです。
お礼
とても詳しい御説明をありがとうございます。 専門書でも同じような感じで書いていました(一部専門書に誤字があって???でしたが気づくまで時間かかりました)。 3次元回転は非常に難しいですが、いろいろと勉強していきたいと思います。 この度はとても助かりました。