アプリ版:「スタンプのみでお礼する」機能のリリースについて

3次元ベクトルの求め方を教えてください。

下記図のように始点を軸ベクトルでθ(度)だけ回転したときの?の位置を求めたいのです。
これはどのような計算方法になるのでしょうか?なかなか思いつかなくて非常に悩んでいます。
アドバイスや回答をいただけたら助かります。よろしくお願いします。

「3次元ベクトルをある軸ベクトルで回転させ」の質問画像

A 回答 (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 に直します。
    • good
    • 1
この回答へのお礼

とても詳しい御説明をありがとうございます。
専門書でも同じような感じで書いていました(一部専門書に誤字があって???でしたが気づくまで時間かかりました)。
3次元回転は非常に難しいですが、いろいろと勉強していきたいと思います。
この度はとても助かりました。

お礼日時:2009/08/02 18:38

軸の方向ベクトルが


(Ax, Ay, Az) なのか (Ax-Sx, Ay-Sy, Az-Sz) なのか、
図からは判り難いけど… いずれにせよ、
ソレと直交するベクトルを2個見つけることができれば、
(Sx, Sy, Sz) を原点とし、回転軸を座標軸の一つに持つ
直交座標系が作れるでしょう。その座標系では、
質問の回転は、座標平面内での回転になります。
さあ、成分計算。
    • good
    • 0
この回答へのお礼

ありがとうございます。外積をつかって直行ベクトルを導き出して回転させることができました。
いろいろと勉強になります。

お礼日時:2009/08/02 18:36

簡単なようで結構複雑ですね。


3Dのアフィン変換
http://ft-lab.ne.jp/cgi-bin/wiki.cgi?page=%A5%A2 …
が参考になるかと思います。
基本的な移動行列に分解してそれぞれの行列の合成行列として変換行列を考えて見てください。
    • good
    • 0
この回答へのお礼

ありがとうございます。これを機に行列を勉強し始めました。
そのような専門書を買って今読んで、いちおうできたとことです。
とても助かりました。

お礼日時:2009/08/02 18:35

平行移動させれば, 中心点は原点だと思ってかまいませんね.


ということを前提にして「四元数」で調べるとおいしいかも.
    • good
    • 0
この回答へのお礼

ありがとうございます。原点に移動してなんとかできそうです。

お礼日時:2009/08/02 18:33

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