- ベストアンサー
空間での座標回転角度の求め方
- 空間上にある点Aを回転させた点Bを元の位置に戻すための回転角度(θx、θy、θz)を求める方法について。
- 回転角度を求めるためにはtanや内積を使用するが、多少の誤差が生じる場合がある。
- 正確な回転角度を求めるためには内積の式からcosθを求め、acos(cosθ)で求める。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
4×4行列を使って回転や平行移動の座標変換が出来ます。 逆行列を求めて同じ側から逆にかけてやれば、元に戻せます。 参考URLに詳しく載っています。 X,Y,Z軸の順に回転移動する行列もその順にかけてやれば [x,y,z]・A・B・C=(x,y,z)・M=[x1,y1,y2] M=A・B・C AはX軸の周りの回転行列、BはY軸の周りの回転行列、 CはZ軸の周りの回転行列 とすれば、Mは一気に3軸の周りの回転を行う行列になります。 [x1,y1,z1]は回転移動後の座標です。 逆にMの逆行列N=M^-1を[x1,y1,z1]にかけてやれば元の座標に戻す事が出来ます。 [x,y,z]=[x1,y1,z1]・N また、A,B,Cの逆行列をD=A^-1,E=B^-1,F=C^-1とおけば N=M^-1=F・E・Dの関係にあります。つまり、 [x,y,z]=[x1,y1,z1]・N=[x1,y1,z1]・F・E・D という関係にあると言うことですね。 逆順に逆行列を掛けてやれば元の座標が得られますは、 一回一回逆行列を求める手間を省くには M=A・B・C を求めておいて、その逆行列N N=M^-1 を移動後の点の座標行列(座標ベクトル)に掛けてやれば元に戻せるという事ですね。 [x,y,z]=[x1,y1,z1]・N の計算で正確に元に戻せますよ。 僕はこの行列演算をMapleなどの数式処理ソフトを使ってやっていますが、すぐに座標変換がすぐ出てきます。 三次元プロットすると移動の過程も確認できます。
その他の回答 (3)
- info22
- ベストアンサー率55% (2225/4034)
> Mを求めると > [cosθy*socθz cosθy*sinθz -sinθy] > [sinθx*sinθy*cosθz-cosθx*sinθz sinθx*sinθy*sinθz+cosθx*cosθy sinθx*cosθy] >[cosθx*sinθy*cosθz+sinθx*sinθz cosθx*sinθy*sinθz-sinθx*cosθz cosθx*cosθy] の2行2列要素に転記ミスがありますので確認下さい。 sinθx*sinθy*sinθz+cosθx*cosθz > このθx,θy,θzがそれぞれ同じ場合はできると思いますが、 >バラバラな場合の一度に戻るイメージがどうしてもわきません。 イメージがわかなければ具体的な分かりやすいケースを幾通りか当てはめて確認するのが良いと思います。 僕は点(x,y,z)のベクトルをA#1の参考URLにあるようにベクトル(x,y,z,1)にして4行4列の行列で扱って確認していますが、平行移動が伴わない場合は、A#1~A#3で扱っているように点ベクトルを(x,y,z),回転行列を3行3列で扱って構わないでしょう。 なお、行列A,B,C,D,E,F,M,Nの行列式の値は全て1になります。
- info22
- ベストアンサー率55% (2225/4034)
補足はこのサイトだけでなく、ネット上のGoogle他、多数の検索エンジンから検索がかかりますので、このサイトだけで使っている、このサイトのニックネームが公開されてしまいますので、解答欄や補足の中にニックネームを書かないことが常識のマナーです。これから私だけでなく、他の回答者のニックネームは書き込まないようにして下さい。指定する場合はNo1さんとか、#2 さんのA#2の回答中…のように引用下さい。 本題に帰って、A#1の参考URLの中の各軸の周りの回転行列の逆行列を求めていただけば、元の回転行列のθを「-θ」に下だけのものになりますし、平行移動の行列の逆行列も移動量がマイナスになるだけです。 あえて計算で出すなら、回転角θ'の逆行列Fと元の回転の行列Aの回転角θとして、行列要素を全て等しいとおけば、 -sinθ'=sinθ、cosθ'=cosθ という関係式が出てきます。これを満たすθ'は θ'=-θ という結果が出てくるだけです。 難しい式を解かないと出てこないという先入観をお持ちではないでしょうか?
補足
ANo.3様 ご回答ありがとうございます。 まず、ニックネームについて大変申し訳ございません。 自分の事ばかり先行し、気付けていませんでした。 これからこのような事が決してない様にします。 本当にすみませんでした。 本題なのですが、 [x,y,z]・A・B・C=(x,y,z)・M=[x1,y1,y2] とした場合でも(θA、θB、θCはそれぞればらばらです) [x,y,z]=[x1,y1,z1]・N N=(F・E・D) Mを求めると [cosθy*socθz cosθy*sinθz -sinθy] [sinθx*sinθy*cosθz-cosθx*sinθz sinθx*sinθy*sinθz+cosθx*cosθy sinθx*cosθy] [cosθx*sinθy*cosθz+sinθx*sinθz cosθx*sinθy*sinθz-sinθx*cosθz cosθx*cosθy] となると思います。 このθx,θy,θzがそれぞれ同じ場合はできると思いますが、 バラバラな場合の一度に戻るイメージがどうしてもわきません。
- info22
- ベストアンサー率55% (2225/4034)
#1です。 >たとえば、[x,y,z]を A(θx=30°) B(θy=45°) C(θz=60°)で >回転させてできた[x1,y1,z1]を >F(A^-1),E(B^-1),D(C^-1) の順番にかけて[x,y,z]とする際に必要 >な回転角度θが > 分からないとなると、計算して求めないといけないと思います。 > そのθを求める方法がどう考えてもわからないのです。 角度はマイナスをつけてD(θz=-60°),E(θy=-45°),F(θx=-30°) の順にすれば良いですね。符号が変わるだけで求める必要ないですね。 ちゃんと逆行列を計算すれば分かる事です。解答を読むだけでなく少しは手を動かして逆行列を計算してみてください。(#そうすればつまらない質問をしたりしなくて済みますよ。) > それともθは関係なく、Mの逆行列であるN(M^-1)で求められるのでしょうか? 勿論、求まります。 > 数式処理ソフトなどを使わずにプログラミング(C言語)で計算したいのです。 > 回転の式(これは理解しました)と角度を求める式(???) > が分かればプログラムを書く事はできるのですが・・・。 角度はマイナスの符号をつけるだけですから角度を求める式は あえて言えば θ'=-θ ですね。
補足
info22 様 続けてご回答ありがとうございます。 言い方がおかしかったようで、すみません。 今は回転の式や手順を理解するために、自分で各θの値を入れて計算しています。 最終的には A=[x,y,z] B=[x1,y1,z1] この2つの点があるとします。 この点Bを平行移動や回転をして、点Aと同じ場所に持ってきたいと考えています。 (AとBの各成分がイコールとなり、空間上で重ねたいです。) となると、各回転角度(θ)は入力していないため(わからないため)、計算して求めないといけないと思います。 そこで回転角度となる各θを求める方法について質問させていただきました。 回答者様のおっしゃるとおり、同じ各θで逆回転させれば、プログラムでもエクセルでもまったく同じ座標を求める事 ができることは以前からわかっています。 ですので、[x,y,z]を A(θx) B(θy) C(θz)で回転させできた[x',y',z']を 逆回転となるD(-θx) ,E(-θy),F(-θz)の各θを計算により求めることができればいいのですが・・・。
補足
info22 様 ご回答ありがとうございます。 そうですね、確かにその方法で行えば元に戻ると考えています。 しかしその際に必要なsin・cosのθ(回転する角度)が 分かっていると実行できると思うのですが・・・(もしかして私は勘違いしてるのでしょうか?) たとえば、[x,y,z]を A(θx=30°) B(θy=45°) C(θz=60°)で回転させてできた[x1,y1,z1]を F(A^-1),E(B^-1),D(C^-1) の順番にかけて[x,y,z]とする際に必要な回転角度θが 分からないとなると、計算して求めないといけないと思います。 そのθを求める方法がどう考えてもわからないのです。 それともθは関係なく、Mの逆行列であるN(M^-1)で求められるのでしょうか? 数式処理ソフトなどを使わずにプログラミング(C言語)で計算したいのです。 回転の式(これは理解しました)と角度を求める式(???) が分かればプログラムを書く事はできるのですが・・・。