- ベストアンサー
3次元ベクトルの回転と行列
3次元ベクトルA, B, Cを仮定します。ここで、AとBは既知のベクトルで、長さが同じとします。 その場合、当然ですがAを回転させるとBになります。 同様の作業をBにすることにより、Cのベクトルが得られます。 このCのベクトルを行列を用いて求めたいと考えているのですが、どうするか忘れてしまいました。 教えていただけるとありがたいです。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#2,#4です。 具体的なデータが与えれれば ↑OA,↑OB,↑OCが決まってきますので |OA|=|OB|=|OC|=a、ベクトル↑OAとZ軸の正方向となす角をθ[rad]とおくと 点A,B,Cは点Q(0,0,a cosθ)を中心とする半径asinθの円周上に存在する。 点Aの座標は(a sinθcos(11π/14),a sinθsin(11π/14),a cosθ) 点Bの座標は(a sinθcos(19π/14),a sinθsin(19π/14),a cosθ) 点Cの座標は(a sinθcos(27π/14),a sinθsin(27π/14),a cosθ) 回転行列はZ軸の周りに4π/7[rad]回転するだけでいいですね。 つまり回転行列はA#2の参考URLの行ベクトルを使用する場合の行列で 表せば、 [ cos(4π/7) sin(4π/7) 0 0 ] [ -sin(4π/7) cos(4π/7) 0 0 ] [ 0 0 1 0 ] [ 0 0 0 1 ] となりますね。 たとえば、 点Aの座標は(a sinθcos(11π/14),a sinθsin(11π/14),a cosθ) の位置ベクトルに [a*sinθcos(11π/14) a*sinθsin(11π/14) a :cosθ 1]に、後から上の回転ベクトルを掛けてやれば点Bの位置ベクトル [a*sinθcos(19π/14) a*sinθsin(19π/14) a*cosθ 1] …(□) が得られるというわけです。 B点の位置ベクトル(□)に上の回転行列を書けるとC点の位置ベクトル [a*sinθcos(27π/14) a*sinθsin(27π/14) a*cosθ 1] が得られます。 上の位置ベクトルの最後の1を取り除きコンマで区切れば、実際の位置ベクトルの座標点A,B,Cの座標になります
その他の回答 (6)
- Tacosan
- ベストアンサー率23% (3656/15482)
らせん運動なら最初からそう言え~. そっちの方が容易に理解できるぞ~. さておき, らせん運動は円運動と直線運動を合成したものなので, この 2つを独立に考えて最後に合成してください.
補足
申し訳ありませんでした。
- nag0720
- ベストアンサー率58% (1093/1860)
ばねの話はよく分からなかったので、最初の質問に戻って回答したいと思います。 「ベクトルA,Bを含む平面に沿ってAを回転させてBにする」 とすれば回転行列(Tとします)は一意に定まります。 そのときの回転角は、 cosθ=(A・B)/(|A||B|) で求まります。 もしベクトルA,Bがxy平面上にあるなら、Tは2次元上の回転行列ですので簡単に算出できます。 なので、ベクトルA,Bを含む平面を回転してxy平面にする回転行列およびその逆行列が分かればTが計算できます。 ベクトルA,Bを含む平面を回転させてxy平面にするには、法線ベクトルA×BがZ軸と重なるように回転させればできます。 (回転角度は、法線ベクトルの座標から算出できます) 以上から、 S:xy平面上での回転角θの回転行列(cosθ=(A・B)/(|A||B|)) U:法線ベクトルA×BをZ軸に重ねる回転行列 V:Uの逆行列 とすれば、 T=VSU
補足
勉強しなおして理解できるよう頑張ります。
- info22
- ベストアンサー率55% (2225/4034)
#2です。 A#2の補足では具体性が十分ではありません。つまり、ベクトルOA,OB,OCを決めるだけの情報が書かれていません。 ばねということですが、ばねというより螺旋状の線輪(コイル)と考えた方が良いかと思えます(伸び縮みは考えて無いようですので)。 螺旋を指定するには、螺旋のピッチと真上から見たときの円断面の半径を指定しないといけませんね。そうしないと螺旋の曲線が確定せず、ベクトルEFなどが決まりません。 不足な情報を捕捉に書いて下さい。
補足
昨日は、あれから忙しく、捕捉をつけれずすみません。 No.6でのご指導ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
おっと, #1 の書き方はっきり「間違い」といえるレベルでした. すみません, 後ろの方の「(1, 1, 0)」とか「(0, 0, 1)」とかは回転の軸を表すと思ってください. つまり, 前者なら「直線 x=y まわりの回転」を, 後者なら「直線 z=0 まわりの回転」を念頭に置いてました. このように, 「どの軸のまわりで回転させるのか」を指定しないと, 問題としては無意味になります. ただ「バネ上を2/7回転移動するごとに、ばね上に点を取っていきます」の意味はちょっと分からないです. そもそも「バネ上を2/7回転移動する」というのがさっぱり分からない. 推測すると「固定した平面上に原点から等距離にある点の集合 (これはもちろん原点からこの平面におろした垂線の足を中心とする円になります) を考え, この円上で (原点からおろした垂線の足を中心として) 一定の角度で移動する」ということかなぁ?
補足
「推測すると、」以降について、理解力が足りなく、理解できませんでした。 別の言葉でいいかえると、 らせん運動している物体を考えた時、その中心の軌跡を考えるとします。らせん運動は円運動と直線運動の和とみなせると思います。円運動の周期をT秒とします。ことのき、(2/7)T秒ごとに座標を取ったとします。 以上のことを、「バネ上を2/7回転移動するごとに、ばね上に点を取っていきます」という文章によって表現しようとしました。 以上です。ありがとうございます。
- info22
- ベストアンサー率55% (2225/4034)
問題が具体性に欠けますので回答できません。 AをBに重ねる為の回転行列は、X,Y,Z座標軸の周りの回転行列の積で与えられます。この行列による変換をアフィン変換といいます。 3次元のアフィン変換の詳細な解説は次の参考URLに載っていますので、勉強しなおして下さい。 http://ft-lab.ne.jp/cgi-bin/wiki.cgi?page=%A5%A2%A5%D5%A5%A3%A5%F3%CA%D1%B4%B9_3DCG
補足
ありがとうございます。アフィン変換は聞いたことがないので、勉強しなおすというよりかは、勉強を始めることになりそうです。 具体性に欠けるということなので、捕捉させていただきますと、 立体空間に浮かぶ、ある程度伸びたバネを想像してください。バネ上を2/7回転移動するごとに、ばね上に点を取っていきます。ある点をDとし、次の点をE、その次の点をF…と置いた場合、|DE|=|EF|=…となります。 ここで Aベクトル=OAベクトル=DEベクトル Bベクトル=OBベクトル=EFベクトル Cベクトル=OCベクトル=FGベクトル と置いた場合、 Aベクトルにある操作を加えてBベクトルにした場合、 その操作をBベクトルに加えると、Cベクトルになるだろうと考えました。 ここで、点Dから点Fまでの座標がわかっている場合には、上で求めたCベクトルを用いて、点Gの座標が求められると考えました。よってそれらを短縮して、はじめの質問を立てました。
- Tacosan
- ベストアンサー率23% (3656/15482)
3次元だと「A を B に移す回転」が一意に決められないですね. 例えば (1, 0, 0) を (0, 1, 0) に移すとしても ・(1, 1, 0) まわりに 180度回転させる ・(0, 0, 1) まわりに 90度回転させる の 2つでは, (0, 1, 0) を移した先が異なります.
補足
No.1の方から捕捉すべきでしたが、あわてており、No.2の方への捕捉を先にしてしまいました。失礼しました。 例を示したわかりやすいご説明ありがとうございます。 私が考えているのは、(0,0,0)周りの回転です。
補足
このような具体的な回答は、大変わかりやすく、ありがたいです。 教養課程の行列は意味がよくわからない一方で、行列は何でも簡単にできるだろうと浅はかに考えていました。 ありがとうございました。