空間での座標回転角度の求め方

このQ&Aのポイント
  • 空間上にある点Aを回転させた点Bを元の位置に戻すための回転角度(θx、θy、θz)を求める方法について。
  • 回転角度を求めるためにはtanや内積を使用するが、多少の誤差が生じる場合がある。
  • 正確な回転角度を求めるためには内積の式からcosθを求め、acos(cosθ)で求める。
回答を見る
  • ベストアンサー

空間での座標回転角度の求め方とは

空間上にある点A(x,y,z)をX,Y,Zを基準として(θx、θy、θz)で回転させます。この回転でできた点をBとします。 そのBを同じ様にX,Y,Zで回転させて元へ戻したい場合、 X,Y,Zの順番で回転させているので、 戻すにはZ,Y,Xの順番に回転させればB=Aとなると思います。 tanや内積などを使い、回転角度を考えその角度で回転させることを考えました。 しかし、tanを用いた場合も内積で考えた場合も多少誤差が生じます。(θx=60度になるはずが、計算すると57度になったりする) 正しく回転角度(θx、θy、θz)を求めたい場合はどうすればいいのでしょうか? 一応回転の式はグラフィックス関係の本から調べました。 また自分でθx、θy、θzを入力した場合A=Bとなるので、 式は問題ないと考えています。 現状ではBを逆回転する際のθzを tan(√(Bx^2+By^2)/√(Bz^2))=θz Z軸逆回転したものをB'とすればθyは tan(√(Bx'^2+Bz'^2)/√(By'^2))=θy さらにY軸逆回転したものをB~とすればθyは tan(√(By~^2+Bz~^2)/√(Bx~'^2))=θx となりこれで求める事ができると考えています。 内積で考えた場合は内積の式からcosθを求め、acos(cosθ)で求めています。 長々とすみませんが、よろしくお願いします。

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

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

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などの数式処理ソフトを使ってやっていますが、すぐに座標変換がすぐ出てきます。 三次元プロットすると移動の過程も確認できます。

参考URL:
http://www.ceres.dti.ne.jp/~ykuroda/oyaj/bone/basic3d.html
FD3S-R
質問者

補足

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言語)で計算したいのです。 回転の式(これは理解しました)と角度を求める式(???) が分かればプログラムを書く事はできるのですが・・・。

その他の回答 (3)

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

> 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)
回答No.3

補足はこのサイトだけでなく、ネット上のGoogle他、多数の検索エンジンから検索がかかりますので、このサイトだけで使っている、このサイトのニックネームが公開されてしまいますので、解答欄や補足の中にニックネームを書かないことが常識のマナーです。これから私だけでなく、他の回答者のニックネームは書き込まないようにして下さい。指定する場合はNo1さんとか、#2 さんのA#2の回答中…のように引用下さい。 本題に帰って、A#1の参考URLの中の各軸の周りの回転行列の逆行列を求めていただけば、元の回転行列のθを「-θ」に下だけのものになりますし、平行移動の行列の逆行列も移動量がマイナスになるだけです。 あえて計算で出すなら、回転角θ'の逆行列Fと元の回転の行列Aの回転角θとして、行列要素を全て等しいとおけば、 -sinθ'=sinθ、cosθ'=cosθ という関係式が出てきます。これを満たすθ'は θ'=-θ という結果が出てくるだけです。 難しい式を解かないと出てこないという先入観をお持ちではないでしょうか?

FD3S-R
質問者

補足

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)
回答No.2

#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言語)で計算したいのです。 > 回転の式(これは理解しました)と角度を求める式(???) > が分かればプログラムを書く事はできるのですが・・・。 角度はマイナスの符号をつけるだけですから角度を求める式は あえて言えば θ'=-θ ですね。

FD3S-R
質問者

補足

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)の各θを計算により求めることができればいいのですが・・・。

関連するQ&A

  • ベクトルの回転について

    はじめまして。 以下のような問題について大学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の外積で出てくる値が回転軸になるような・・・・?) 宜しくお願いします。

  • 三次元座標の回転角度

    左手系三次元座標A(X,Y,Z)がB(x,y,z)に移動したとき、原点からみたZ軸の回転角度Θの算出は、 Θ=Atan(y/x)-Atan(Y/X) でいいですか。よろしくお願いします。

  • 3次元の回転角度の求め方について教えてください。

    3次元の回転角度の求め方について教えてください。 3軸の加速度センサーがあります。 まず加速度センサーのZ軸を重力方向に置いたときの加速度センサーの値を(x1,y1,z1)=(0,0,1)とします。 加速度センサーのx軸、y軸、z軸をそれぞれ回転させたあとの加速度センサーの値を(x2,y2,z2)とします (このとき加速度センサーは静止しているので、センサーの値は重力の分力になります)。 (x2,y2,z2)が既知のとき(x1,y1,z1)に戻すためのそれぞれの回転角はどのように求めれば良いのか教えてください。 (x2,y2,z2)→(x1,y1,z1)へ移動するときの回転角を φ(z軸の回転角)、ψ(x軸の回転角)、θ(y軸の回転角) とします。 回転行列 (x1) = (cosφ -sinφ 0) (cosθ 0 sinθ) (1 0 0 ) (x2) (y1) = (sinφ cosφ 0) (0 1 0 ) (0 cosψ -sinψ) (y2) (z1) = (0 0 1) (-sinθ 0 cosθ) (0 sinψ cosψ ) (z2) より,3行3列の行列を計算すると 0=cosφcosθx2 + (-sinφcosψ+cosφsinθsinψ)y2+(sinφsinψ+cosφsinθcosψ)z2 0=sinφcosθx2 + (cosφcosψ+sinφsinθsinψ)y2+(-cosφsinψ+sinφsinθcosψ)z2 1=-sinθx2 + cosθsinψy2 + cosθcosψz2 となると思うのですが、この式からφ、ψ、θが導きだせません。 どうすれば求めることができるか教えていただけますか。

  • 2線の交わる角度を求める式

    2線の交わる角度を求める式で、0での除算が発生しない方法を教えて下さい。 座標 線a ax1 = 0 , ay1 = 0 : ax2 = 12 , ay2 = 13 線b bx1 = 6 , by1 = 15: bx2 = 6 , by2 = 2 A=(y13-y0)/(x12-x0) B=(y2-y15)/(x6-x6)   0で除算が発生 2線の交わる角度 tanθ=(A-B)/(1+AB) 片方の線が垂直だと0で除算が発生しまい、うまく計算できません。 なにか他によい方法はないでしょうか。

  • 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と各軸での回転角度は違うものという認識でいいのでしょうか? 元の座標系において,各軸回りに順番に回転させればいいかと思うのですが,どうもイメージがつかみきれません. よろしくお願い致します.

  • 3次元で回転させた座標値の計算方法

    点(Ax、Ay、Az)を3次元空間にある、点(Bx、By、Bz)から、点(Cx、Cy、Cz)に向かう直線を軸に任意の角度で回転させたときの、点(A’x、A’y、A’z)の座標値の計算方法を教えてください。ただし自分の数学レベルは中学生並でベクトルが少しだけ理解できるていどです。よろしくお願いします。

  • 3次元の座標変換と角度について。

    3次元のシミュレーションの勉強をしています。 3次元の座標変換で x,y,z:変換前の座標; x',y',z':変換後の座標; θ:回転する角度; lx,ly,lz:平行移動量; としたとき、 X軸に関する回転              |1 0   0    0|              |0 cosθ sinθ 0| [x' y' z' 1] = [x y z 1]|0 -sinθ cosθ0|              |0 0   0   1| Y軸に関する回転              |cosθ0 -sinθ0|              |0   1 0   0| [x' y' z' 1] = [x y z 1]|sinθ0 cosθ 0|              |0   0 0   1| Z軸に関する回転              |cosθ sinθ 0 0|              |-sinθcosθ0 0| [x' y' z' 1] = [x y z 1]|0   0   1 0|              |0   0   0 1| 平行移動              |1 0 0 0|              |0 1 0 0| [x' y' z' 1] = [x y z 1]|0 0 1 0|              |lx ly lz 1| 物体の姿勢を表現するときは [物体の姿勢の変換行列] = [Z軸の回転行列][X軸の回転行列][Y軸の回転行列][平行移動]  |XX XY XZ 0| XX,XY,XZ・・・X軸の単位ベクトルを変換した場合のベクトル  |YX YY YZ 0| YX,YY,YZ・・・Y軸の単位ベクトルを変換した場合のベクトル = |ZX ZY ZZ 0| ZX,ZY,ZZ・・・Z軸の単位ベクトルを変換した場合のベクトル  |LX LY LZ 1| LX,LY,LZ・・・平行移動量ベクトル というのは分かるのですが、 X軸、Y軸、Z軸の単位ベクトルを変換した後のベクトルから X軸、Y軸、Z軸にそれぞれ何度ずつ回転させたかを求めるにはどのようにすればよいのでしょうか? つまり、X軸に対して30度、Y軸に対して45度、Z軸に対して60度回転させた後の |XX XY XZ 0| |YX YY YZ 0| |ZX ZY ZZ 0| |LX LY LZ 1| の値からX軸に対して30度、Y軸に対して45度、Z軸に対して60度回転している事を導きたいのです。 分かる方教えてください。 お願いします。 (質問に関して、 http://www.ceres.dti.ne.jp/~ykuroda/oyaj/bone/basic3d.html を参考にさせていただきました。)

  • ラプラスの方程式球面座標表示

    あるサイトを参考に次の様な流れでラプラスの方程式の球面座標表示を導きたいのですが 途中の式が間違っているのか、最終的な式が導けません。 特に下の3の手順で私の式のやり方が間違っているのかもしれません。 正しいかどうかご指摘くださる方、よろしくお願いします。 >は自分のコメントです。 r=r(x,y,z),θ=θ(x,y,z),φ=φ(x,y,z) x=rsinθcosφ y=rsinθsinφ z=rcosθ まず,これらの式から 1.r^2,tanθ,tanφを計算. > r^2 = x^2 + y^2 + z^2 > tan^2θ = (x^2+y^2)/z^2 > tanφ = y/x 2.1を偏微分することによって∂r/∂x,∂r/∂y,∂r/∂z,∂θ/∂x,∂θ/∂y,∂θ/∂z,∂φ/∂x,∂φ/∂yをすべてx,y,zで表現.あとでこれらの2階偏微分も必要になるが. >∂r/∂x = sinθcosφ, ∂r/∂y = sinθsinφ, ∂r/∂z = cosθ >∂θ/∂x = (cosθcosφ)/r, ∂θ/∂y = (cosθsinφ)/r, ∂θ/∂z = -sinθ/r >∂φ/∂x = -sinφ/(r*sinθ), ∂φ/∂y = cosφ/(r*sinθ), ∂φ/∂z = 0 3.∂/∂x=∂/∂r・∂r/∂x+∂/∂θ・∂θ/∂x+∂/∂φ・∂φ/∂x これをさらに偏微分して∂^2/∂x^2を偏微分の記号で表現. ちょっとしんどいですがガッツ. 同様に∂^2/∂y^2,∂^2/∂z^2も計算. >この∂^2/∂x^2, ∂^2/∂y^2,∂^2/∂z^2は単純に >(∂/∂x)^2=(∂/∂r・∂r/∂x+∂/∂θ・∂θ/∂x+∂/∂φ・∂φ/∂x)^2 >(y, z同様)と計算しては間違いでしょうか? 4.∂^2/∂x^2+∂^2/∂y^2+∂^2/∂z^2を偏微分記号の表示のまままとめる. 5.2で求めたものを代入.すると意外に綺麗にまとめれるものが出てくる. >最終的に出た式 >∂^2/∂r^2+∂^2/(r^2∂θ^2)+∂^2/(r^2*sin^2θ∂φ) >求めたい式は >∂^2/∂r^2+2*∂/(r∂r)+∂^2/(r^2∂θ^2)+∂/(r^2*tanθ∂θ)+∂^2/(r^2*sin^2θ∂φ) >です。 >自分で導いた式と比べると、2*∂/(r∂r)+∂/(r^2*tanθ∂θ)が欠けています。

  • 空間の座標の求め方

    下の図のような直方体があります。(縦2a、横2b、長さ2c) この直方体の中心を原点とし、図のように3軸を決めます。 この時、A(c,-b,a)、B(c,b,a)、C(c,-b,-a)、D(c,b,-a)とおけ、 y軸を中心としてθ1だけ回転(90°回転すると面ABCDがZ軸の上を向く)、 z軸を中心としてθ2だけ回転(90°回転するとABCD面はy軸の正方向(右側)を向く)した場合、 A,B,C,Dはそれぞれどのような座標になるのか求めたいのです。 θ2だけ回転した場合は、xv平面で考えればいいので、 なんとか自分で出すことが出来ました。 Aは(c・cosθ2+b・sinθ2、c・sinθ2-b・cosθ2、a) Bは(c・cosθ2-b・sinθ2、c・sinθ2+b・cosθ2、a) Cは(c・cosθ2+b・sinθ2、c・sinθ2-b・cosθ2、-a) Dは(c・cosθ2-b・sinθ2、c・sinθ2+b・cosθ2、-a) で、問題はこれにθ1の回転が加わった場合、 A,B,C,Dの座標はどうなるのでしょうか? 空間で考えるのが苦手なため、ここでストップしてしまっています。 10年以上数学というものから遠ざかってて苦戦しています。 数学詳しい方、ぜひ教えて下さい。 (できれば考え方も。この際、空間図形に強くなりたいもので)

  • 空間図形

    a→=(1.0.1), b→=(2.2.1)を空間におけるベクトルとするとき、 (1)a→.b→の長さ(大きさ)|a→|,|b→|を求めよ。 (2)a→とb→とのなす角αを求めよ。ただし0°≦α≦180°とする。 (3)長さ1のベクトルe→がある。e→とa→とのなす角が45°で e→とb→とのなす角が60°のとき、e→を求めよ 解答 (1)、(2)は簡単でした。 (3)が良くわかりませんでした。 (3)の解答 e→=(x.y,z)とすると、|e→|=1より x^2+y^2+z^2=1。。。。。(A) e→とa→のなす角が45°より x+z=1・√2・cos45°=1。。(B) e→とb→のなす角が60°より2x+2y+z=3/2。。。(C) (A)(B)(C)をみたす、x、y、zを求めて、 e→=(3-2√2/6 , √2/6、3+2√2/ 6) 、(3+2√2/ 6 , -√2 / 6、3-2√2/ 6) ...(答え) 質問 (3)でx^2+y^2+z^2=1までは理解できたのですが その後の、eとaのなす角が45°より~。。。。の先から意味がわかりませんでした。 いまeとaの直線が交差していて、45°のなす角を考えたとき 必然とcosθは45°ですので1/√2となると思いますが なぜ、x+z=という式なのですか?? x・z/|x||z|=cosθの内積をつかってるとしたら、x+zとはならないような気がするのですが。。。またx+zと考えたとき、なぜxが1でzが√2なのですか? どうように、次のeとbのなす角が60°より~。。の先も解けませんでした。 その後の満たす式はうまく代入して解けました。 どなたか教えてください。宜しくお願いします!!!