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

ある空間上のベクトルをある単位ベクトル周りに回転する方法(3x3行列)を探しており、
以下の「任意軸に対する回転行列」のサイトにたどり着きました。

http://www.laksmido.com/3010.html

大変申し訳ありませんが、この行列の導出方法を教えていただけないでしょうか?
(理由: 現在、上記の単位ベクトル周りの回転後のベクトルを算出するプログラムを
 VBAで書いていますが、数学的な裏づけ(理解)がしたかったため。)

高校・大学教養レベルの線形代数のレベルでも導出できますか?
ちなみに当方、大卒(物理学科)です。

以上、よろしくお願いします。

ちなみに、作者殿に半月前にメールで問い合わせたのですが、回答頂けませんでしたので
こちらに質問しました。

A 回答 (3件)

v=t(v_x,v_y,v_z) (t()は()の転置行列とする)


|v|^2=(v_x)^2+(v_y)^2+(v_z)^2=1
v_x=cosψcosθ
v_y=cosψsinθ
v_z=sinψ
となる ψ,θ がある
u=t(-sinθ,cosθ,0)
w=t(-v_z*cosθ,-v_z*sinθ,cosψ)
とすると
(v,u)=(v,w)=(u,w)=0
|u|^2=|w|^2=|v|^2=1
v,u,w は互いに垂直な単位ベクトルとなる
A=(v,u,w)
任意のベクトルpに対して
p=(p,v)v+(p,u)u+(p,w)w
t((p,v),(p,u),(p,w))=tAp
v軸のまわりに点 p を α 回転した点を q
S=((1,  0,   0),
  (0,cosα,-sinα),
  (0,sinα, cosα))
R=AS(tA) とすると
q=(p,v)v+((p,u)cosα-(p,w)sinα)u+((p,u)sinα+(p,w)cosα)w=Rp

R=(v_x,-sinθ,-v_z*cosθ)(1,  0,   0)(    v_x,   v_y,  v_z)
 (v_y, cosθ,-v_z*sinθ)(0,cosα,-sinα)(   -sinθ,  cosθ,  0)
(v_z,  0,   cosψ)(0,sinα, cosα)(-v_z*cosθ,-v_z*sinθ,cosψ)

=(  (v_x)^2*(1-cosα)+cosα,v_x*v_y*(1-cosα)-v_z*sinα,v_z*v_x*(1-cosα)+v_y*sinα)
(v_x*v_y*(1-cosα)+v_z*sinα,  (v_y)^2*(1-cosα)+cosα, v_y*v_z(1-cosα)-v_x*sinα)
(v_z*v_x*(1-cosα)-v_y*sinα,v_y*v_z*(1-cosα)+v_x*sinα,   v_z^2*(1-cosα)+cosα)
    • good
    • 1

方法はいろいろあるとは思うけど、その1つとして。




点V(Vx,Vy,Vz)をZ軸で回転させて、YZ平面上に移動させる回転行列をU、
さらにそれをX軸で回転させて、Z軸上に移動させる回転行列をVとします。
また、Z軸でθ回転する回転行列をRとします。

そうすると、ベクトル(Vx,Vy,Vz)を軸として回転する回転行列Tは、
T=U’V’RVU
となります(U’、V’はU、Vの逆行列)。

U=((cosφ, -sinφ, 0), (sinφ, cosφ, 0), (0, 0, 1))
U’=((cosφ, sinφ, 0), (-sinφ, cosφ, 0), (0, 0, 1))
V=((1, 0, 0), (0, cosψ, -sinψ), (0, sinψ, cosψ))
V’=((1, 0, 0), (0, cosψ, sinψ), (0, -sinψ, cosψ))
R=((cosθ, -sinθ, 0), (sinθ, cosθ, 0), (0, 0, 1))

cosφ=Vy/√(Vx^2+Vy^2)
sinφ=Vx/√(Vx^2+Vy^2)
cosψ=Vz
sinψ=√(Vx^2+Vy^2)

なので、これからTを計算すれば求めるものになるはずです。
    • good
    • 0

http://www5d.biglobe.ne.jp/~noocyte/Programming/ …

検索してみた.
外積を使って,二次元のケースに落とすのがポイントです.
このサイトはベクトルで表現しているけど
それを成分に直して行列の形にすれば所望の回転行列がでてくるでしょう
向きについては適宜調整してください.
    • good
    • 0

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