• ベストアンサー

3次元ベクトルをある軸ベクトルで回転させたい

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

  • suffre
  • お礼率76% (2013/2633)

質問者が選んだベストアンサー

  • ベストアンサー
noname#95312
noname#95312
回答No.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 に直します。

suffre
質問者

お礼

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

その他の回答 (3)

  • arrysthmia
  • ベストアンサー率38% (442/1154)
回答No.3

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

suffre
質問者

お礼

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

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.2

簡単なようで結構複雑ですね。 3Dのアフィン変換 http://ft-lab.ne.jp/cgi-bin/wiki.cgi?page=%A5%A2%A5%D5%A5%A3%A5%F3%CA%D1%B4%B9_3DCG が参考になるかと思います。 基本的な移動行列に分解してそれぞれの行列の合成行列として変換行列を考えて見てください。

suffre
質問者

お礼

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

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

平行移動させれば, 中心点は原点だと思ってかまいませんね. ということを前提にして「四元数」で調べるとおいしいかも.

suffre
質問者

お礼

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

関連するQ&A

  • 3Dベクトルを3Dの軸ベクトルに沿って回転させる方法

    3Dベクトルを3Dの軸ベクトルに沿って回転させる方法 ベクトルA(1, 1, 1)をベクトルB(1, 0, 0)を軸に たとえば90度(時計回りに)回転させたいと思った場合 どう計算すれば良いのでしょうか・・?

  • 回転した座標軸と一致させるための回転軸と角度の算出

    こんにちは。お知恵をお借りしたく質問致します。 プログラミング中で出た話題なのですが、計算の問題ですので数学カテゴリが適しているだろうと思い、投稿いたします。 ちょっと説明しにくく図を添付致しましたので併せてご覧いただければと思います。(線がふるえていて申し訳ないです。) 図のように、xyz座標を回転してXYZ座標の向きに一致させたいと考えています。 また、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数があるので、それを活用しようと考えています。α,β,γはコサイン値(方向余弦)です。回転方向は、ベクトルの向きに時計回り…右ネジの法則みたいな感じです。 x軸から見たXの角度(θxX), y軸からのX(θyX), z軸からのX(θzX) 同様にx軸から見たY(θxY),θyY,θzY、θxZ,θyZ,θzZ といったように、それらの角度(コサイン値)は分かっています。 (=xyz座標からみたXベクトルの方向余弦、Yベクトルの方向余弦、Zベクトルの方向余弦が分かっている。) z軸とZ軸の外積を取ったベクトルを回転軸として、θzZが分かっているのでその角度で回転することでZ軸は一致しますけど、XY軸は合いません。(当然ですが…) そのXY軸を合わせるためにまた回転するというのも遠回りで、任意の軸1本を中心に何度か回転するだけ(上記関数を1度使用するだけ)で、必ず向きが一致する解があると思うのですが、その任意軸と角度を算出する方法が分かりません。 一般にどういう計算をするのでしょうか。アドバイスいただければ幸いです。 なお、上記関数を用いない方法でも構いません。 「X軸(Y軸、Z軸)を回転軸としてφ度回転する」という関数もあるので、オイラー角を求める方法でも構いません。 その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。 どうかよろしくお願いいたします。

  • 3次元ベクトル

    (x,y,z)の位置ベクトルをrとすると、 このベクトルをx軸方向から見たときにα、y軸方向から見たときβ、回転させたときのベクトルの成分はどうなるのでしょうか?

  • 3次元のベクトルの回転

    任意の3次元ベクトルrをある角度θ、φだけ回転させた時のベクトルをr’とした場合、どのように求めることができるのでしょうか? 2次元の場合は、 x' = xcosθ + ysinθ y' = -xsinθ + ycosθ として求めることができたのですが、3次元は全くわかりません。 宜しくお願い致します。

  • 2次元な見かけのベクトルから3次元ベクトルを計算

    XY平面に、ベクトルAとベクトルBがあるとします。 ベクトルAとベクトルBの始点は原点で、また2つのベクトルのなす角は90度です。 これをXYZ空間に配置し、2つのベクトル始点を固定した状態でX軸、Y軸方向に回転させます。(AとBのなす角は常に90度) つまり、始点を固定した状態でAとBのなす仮想三角平面が傾きを得たということになります。 これを、原点からZ軸方向に観察した時、観察者にはAとBのx成分とy成分が観察できるはずです。 また同様に、AとBの見かけのなす角も得られるはずです。 そこで、この観察者が得られる情報を使って、AとBのz成分を求めたいと思っています。 AとBのなす各が常に90度であるということがわかっているので、観察者からみた見かけのなす角とAとBのxy成分が分かればz成分もわかると思うのですが、その解き方がわかりません。 内積を使った式を作ってみても、うまく連立させられず、解が出ません。 数学が得意な方、ご教示頂けないでしょうか?

  • 任意の軸に回転するための角度を知りたい

    右手系の直交座標系で基準のベクトル(0,0,1)があったとします。 x軸周り、y軸周り、z軸周りの順番で基準のベクトルを回転してベクトル(x,y,z)にする時、z軸周りの回転角度は決まっていて、残りのx軸とy軸をそれぞれ何度回せばいいのか計算する方法を教えて下さい。

  • 線形代数学 ベクトル(0,1,1)を軸とするθの回転を与える行列

    線形代数学を最近学び始めて、いきずまってしまいました。 任意のベクトル(でいいのかな)を軸とするθの回転を与える行列を求める問題です。 問題として 3次元ユークリッド空間に直交座標x,y,zを入れて考える。 (1)x軸の周りのπ/4だけの回転を表す行列Qを求めよ。 (2)ベクトル(0,1,1)を軸とするθの回転を与える行列Q(-1)Rz(θ)Qを計算せよ。  ※Q(-1)はQの逆行列です。Rz(θ)はz軸の周りのθ回転の行列です。 (2)がわからなくて困っています。 行列Q(-1)Rz(θ)Qという形は対角化の形に似ているのですが、 これは、対角化を考えた時に、ベクトルが(0,1,1)がx軸と直角に交わっているからQが直行行列になるのかな~とか、思うのですが、 θ回転するのに対角行列が出てくる意味が少しわからないので、 (2)でなぜ行列Q(-1)Rz(θ)Qになるのか、解説をお願いします。 ちょっとわかりにくい文章になってしまってるかもしれませんが、 申し訳ありません・・・。

  • 任意軸ベクトル周りの3次元座標回転

    任意軸ベクトル周りの3次元座標回転 任意軸周りの回転について 実はプログラムのバグがどうしてもわからず、相談させていただきます。 結果は期待とおりの結果になりません。 図々しいお願いですが、ぜひ間違いをご指摘願います。 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数学」を参考にしました。

  • 3次元での回転による座標変換

    3次元での回転による座標変換に関して質問があります. X軸,Y軸,Z軸の直交座標系があるとします. この座標系において,ある位置ベクトル(a1,b1,c1)がX軸,Y軸,Z軸と成す角度は,θx,θy,θzは,ベクトルの内積から算出可能だと思います. θx=a1/sqrt(a1^2+b1^2+c1^2) θy=b1/sqrt(a1^2+b1^2+c1^2) θz=c1/sqrt(a1^2+b1^2+c1^2) X,Y,Zの直交座標系を回転させて,この位置ベクトルの向きを基準としたX'軸,Y'軸,Z'軸による新しい直交座標系を設定するには,どのようにすればよいでしょうか? θx,θy,θzと各軸での回転角度は違うものという認識でいいのでしょうか? 元の座標系において,各軸回りに順番に回転させればいいかと思うのですが,どうもイメージがつかみきれません. よろしくお願い致します.

  • 角速度のベクトルの方向は何故回転軸なんでしょうか

    角速度のベクトルの方向は、回転軸になるというのが納得できません。 例えば、極座標系で、ある粒子がZ軸を中心に右周りに半径を変えず回転していたとして、 位置ベクトルが(s,0,z)だとして、 速度ベクトルは(ds/dt, s*(dθ/dt),dz/dt)=(0,s*(dθ/dt),0)になると思うのですが、 この点からしてもZ軸については速度が0のはずです。 粒子が動いているのは勿論θ方向なので、直感的に(0,Ω,0)がしっくりきます。 なのに、速度ベクトルΩが何故(0,0,Ω)になってしまうんでしょうか。。 どなたか分かる方教えてください。よろしくお願いします。