- 締切済み
ベクトルの回転について
はじめまして。 以下のような問題について大学1年生の弟から質問されたのですが、 答えに自信がありません。どうか皆様のお力をお貸しください。 三次元空間上にベクトルA(ax,ay,az)、B(bx,by,bz)がある。 このAがBと平行になるような計算をしたい。 自分なりの考えは以下の通りです。 1.z座標を無視して、xy平面上のベクトルとして考え、成す角θzを求める θz=ArcCos{<A,B>/|A||B|} |A|=√ax^2+ay^2 |B|=√bx^2+by^2 <A,B>=ax×bx+ay×by 2.x座標を無視して、xy平面上のベクトルとして考え、成す角θxを求める θx=ArcCos{<A,B>/|A||B|} |A|=√ay^2+az^2 |B|=√by^2+bz^2 <A,B>=ay×by+az×bz 3.y座標を無視して、xy平面上のベクトルとして考え、成す角θyを求める θy=ArcCos{<A,B>/|A||B|} |A|=√ax^2+az^2 |B|=√bx^2+bz^2 <A,B>=ax×bx+az×bz 4.z軸回転させる。このとき、z軸回転させた座標をzAx、zAyとする。 zAx=ax Cosθz-ay Sinθz zAy=ax Sinθz + ay Cosθz 5.次にx軸回転させる。このとき、x軸回転させた座標をxAy、xAzとする。 xAy=zAy Cosθx-az Sinθx xAz=zAy Sinθx + az Sinθx 6.次にy軸回転させる。このとき、y軸回転させた座標をyAx、yAzとする。 yAz=xAz Cosθy-zAx Sinθy yAx=xAz Sinθy + zAx Cosθy 7.求まったyAx、zAy、yAzを成分とする、ベクトルはBと平行である。(終了) うろ覚えですが、軸回転は順番によって全く違った回転をしてしまうというのを昔勉強したような気がするのですが、今回の場合は特にそういった問題は関係ないのでしょうか? また、それぞれの平面ごとになす角を求め、3つのなす角を使った回転を行ないましたが、 θ=ArcCos{<A,B>/|A||B|} |A|=√ax^2+ay^2+az^2 |B|=√bx^2+by^2+bz^2 <A,B>=ax×bx+ay×by+az×bz といった風に、一気に求めたθを用いて回転させる方法はありませんでしょうか? (AとBの外積で出てくる値が回転軸になるような・・・・?) 宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- alice_44
- ベストアンサー率44% (2109/4759)
A×B を軸とした回転を成分計算で行うには、 A×B, A, (A×B)×A を座標軸の方向とする正規直交系へ 座標変換して考えればよいです。 A×B/|A×B|, A/|A|, (A×B)×A/|(A×B)×A| を列として並べた 行列 P の逆行列が表す一次変換で座標を変換すれば、 そのような回転は、 1 0 0 0 cosθ -sinθ 0 sinθ cosθ という行列 R で表されます。 この回転の一次変換を、もとの座標系で表す行列は、 P R (P^-1) だということになります。 P R (P^-1) A が B と平行になるように、θ を決めてやればよい。
- nag0720
- ベストアンサー率58% (1093/1860)
1~7の操作をしてもベクトルAとBは平行にはなりません。 例えば、A(1,0,0)、B(1,1,1)とすると、 θz=ArcCos{1/√2}=45° θx=ArcCos{0}=90° θy=ArcCos{1/√2}=45° zAx=1/√2 zAy=1/√2 xAy=0 xAz=1/√2 (xAz=zAy Sinθx + az Cosθx の間違いでしょうか) yAz=0 yAx=1 (yAx,zAy,yAz)=(1,1/√2,0)はベクトルBとは平行ではありませんよね。 x,y,z軸を回転軸とした場合は、多くても2回転すればどんなベクトルとでも平行にできます。 つまり、角度の算出は2つだけで十分です。(質問欄にかかれている算出法とはちょっと違いますが) 書かれているように、AとBの外積ベクトルを回転軸にすれば1回の回転でベクトルAをBと平行にすることができますが、回転軸自体もx,y,z軸と平行ではないので結局は同じことです。
- Tacosan
- ベストアンサー率23% (3656/15482)
「AがBと平行になるような計算をしたい」の意味が分かりません. 無理に解釈しようとすると「A と B に同じ計算をして, 結果として得られるベクトル同士を平行にしたい」ということになりますが, それでいいですか? もしそうなら, 「自分なりの考え」は全く無意味です. それとも, あなたのやっていることから推測すると「B に対して何らかの処理をして A に平行になるようにしたい」ということですか? もしそうなら, どのような操作が可能なのか (あるいは得られるベクトルがどのような条件を満たさなければならないのか) を書かないと意味がありませんよ. 「B など捨ててしまって A をそのまま使えばいい」ということになってしまいます.
補足
回答ありがとうございます。 ベクトルAに対して、何かしらの計算処理を行い、 ベクトルBと平行になるようにしたいということです。 何に使うか詳しく聞いてみたところ、 向きがバラバラの車の3Dモデルの向きを合わせるプログラムを組んでいるそうで、 モデルの頂点から向き修正用ベクトル求め(前後のバンパーの中点をつないだベクトル)、 あらかじめ用意した向きの基準となるベクトルと平行にさせることで同じ向きにしたいそうです。 説明不足でした。申し訳ございません・・・。