先ず、中心点(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次元回転は非常に難しいですが、いろいろと勉強していきたいと思います。 この度はとても助かりました。