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

このQ&Aのポイント
  • 3次元の座標変換や回転角度について学習中です。
  • 座標変換の方法や回転行列についての情報をまとめました。
  • X軸、Y軸、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 を参考にさせていただきました。)

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

  • ベストアンサー
  • muturajcp
  • ベストアンサー率78% (505/644)
回答No.1

3次元回転は非可換のため 各軸に対する回転の順序を1通りに決めて 各軸1回ずつの回転として 移動拡大縮小は一切しないと しない限り結果行列から各軸に対する回転角度は 求められません。 x軸に対しての回転角t y軸に対しての回転角u z軸に対しての回転角v (z軸周回転行列)*(y軸周回転行列)*(x軸周回転行列)の順序で左から 縦ベクトル (x) (y) (z)に対して x軸周回転,y軸周回転,z軸周回転の順序で回転行列を乗じるもの とすると回転行列は (cosv,-sinv,0)(cosu,0,-sinu)(1, 0, 0) (sinv, cosv,0)( 0,1, 0)(0,cost,-sint) ( 0, 0,1)(sinu,0, cosu)(0,sint, cost) = (cosvcosu,-cosvsinusint-sinvcost,-cosvsinucost+sinvsint) (sinvcosu,-sinvsinusint+cosvcost,-sinvsinucost-cosvsint) ( sinu, cosusint, cosucost) = (a_xx,a_xy,a_xz) (a_yx,a_yy,a_yz) (a_zx,a_zy,a_zz) となり [ (a_xx)^2+(a_yx)^2+(a_zx)^2=1 (a_zx)^2+(a_zy)^2+(a_zz)^2=1 (a_xy){1-(a_zx)^2}+(a_xx)(a_zx)(a_zy)+(a_yx)(a_zz)=0 (a_xz){1-(a_zx)^2}+(a_xx)(a_zx)(a_zz)=(a_yx)(a_zy) (a_yy){1-(a_zx)^2}+(a_yx)(a_zx)(a_zy)=(a_xx)(a_zz) (a_yz){1-(a_zx)^2}+(a_yx)(a_zx)(a_zz)+(a_xx)(a_zy)=0 ]の条件のとき y軸に対しての回転角 u=arcsin(a_zx) z軸に対しての回転角 v=arccos[a_xx/√{1-(a_zx)^2}] x軸に対しての回転角t t=arccos[a_zz/√{1-(a_zx)^2}]

ishikawa038
質問者

お礼

なるほど。回答ありがとうございます。 3次元回転は非可換なので、 各軸に対する回転の順序を1通りに決めて各軸1回ずつの回転として 移動拡大縮小は一切しないという制約が必要なんですね。 詳しい説明まで書いてくださってありがとうございました。

関連するQ&A

  • 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 となると思うのですが、この式からφ、ψ、θが導きだせません。 どうすれば求めることができるか教えていただけますか。

  • 行列 変換行列 行列の積

    変換行列に関して質問させて頂きます。 当方、行列に関する理解が乏しいので基礎を勉強し直しました。 前回、同次変換に関して質問させて頂きました。 URL:http://okwave.jp/qa/q6983574.html 新たに基礎的な部分を質問させて頂きます。 変換行列は回転行列を考えます。 右手系を採用してベクトルをx軸中心にθ回転した回転行列は、 (1   0     0   ) (0  cosθ  sinθ  ) (0  -sinθ  cosθ ) と表します。3行×3列の行列です。 よって、 変換後の列ベクトル(3×1)を (X) (Y) (Z) 変換前の列ベクトル(3×1)を (x) (y) (z) とすると、(3×1)=(3×3)×(3×1)なので (X)  (1   0     0   ) (x)   (Y)= (0  cosθ  sinθ  ) (y)  (Z)  (0  -sinθ  cosθ ) (z)  と表されると思います。 ここまでで間違いがありますでしょうか? ご指摘よろしくお願い致します。   合わせて並進を考える場合について教えて下さい。 例えば、x軸に3移動した場合を4行×4列の変換行列 で示す場合、どのように書けば良いのでしょうか? 添付画像の(A)と(B)どちらでしょうか? 合わせて理由も教えて頂けるとありがたいです。 回転行列を作った手順と同じくすると(A)の 表現で良いと考えているのですがどうでしょうか? 以上、ご回答何卒よろしくお願い致します。

  • 極座標変換したベクトルにさらに直行なベクトル

    x,y,z軸に対して極座標変換したベクトルrがあります。 r = (sinθcosφ,sinθsinφ,cosθ)です。 このr軸上にそれぞれ直行なベクトルα,βがあります。その関係は r = β × α です。 このα,βのベクトル成分をベクトルrや単位ベクトルx,y,zなどから求めたいのですが、どのように求めてよいかわかりません。 x = (1,0,0), y= (0,1,0), z = (0,0,1)です。 ご存知の方詳しい方がいらっしゃったら教えて下さい。 よろしくお願いします。

  • 3次元の座標変換行列について教えて下さい!

    [A]系で(0,0,-1)となるベクトルが[B]系で(1/√3,1/√3,1/√3)に変換されるような座標系変換行列Mを作りたいのですが、うまくいきません。 イメージは、立方体に垂直に入射してきたビームが座標系変換によって、立方体の1つの頂点から斜め45度方向に入射するようになるという感じです。[B]系での成分はマイナスがついても構いません、とにかく斜め45度方向に入射させたいのです。 私が考えたMは以下の通りですが、座標変換の結果が(0.707000, -0.499849, -0.499849)になってしまいました。 どこが間違っているのか、ご教示いただけましたら幸いです。 (1)X,Y,Z軸それぞれの45度回転行列MX,MY,MZを作る。 MX = [ 1, 0,   0,   0     0, cos45, sin45, 0     0, -sin45, cos45, 0     0, 0,   0,   1 ] MY = [ cos45, 0,   -sin45, 0     0,   1,   0,   0     sin45, 0,   cos45, 0     0,   0,   0,   1 ] MZ = [ cos45, sin45, 0, 0     -sin45, cos45, 0, 0     0,   0,   1, 0     0,   0,   0, 1 ] 並進移動を合わせた表記で、これは教科書に載っているので間違っていないと思います。 (2)MX,MY,MZを順にかけて、Mを作る。 M = MX * MY * MZ 45度方向なので、かける順序は気にしなくていいと思いました。

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

  • 線形変換を教えてください!!

    線形変換を教えてください!! 『原点を通り、ベクトル(sinα,0,cosα)に直交する平面についての折り返しを表す行列を求めよ』という問題があります。 その答えは 『y軸のまわりの角度-αの回転、xy平面についての折り返し、y軸の周りの角度αの回転を続けて行えばよい』となっています。 しかし、自分なりに考えてみて 『y軸のまわりの角度αの回転(z軸をベクトル(sinα,0,cosα)に重ねるため)、xy平面についての折り返し、y軸の周りの角度αの回転(z軸をもとに戻すため)』と考えたほうがしっくりきます。当然答えは違ってくるのですが… 考え方に間違いがあるでしょうか?

  • 座標変換について

    座標系XYZの空間に点A(X1,Y1,Z1)、点B(X2,Y2,Z2)、点C(X3,Y3,Z3)があります。 この3点を通る円の中心をP(X0,Y0,Z0)とし、 円の存在する平面をx'y'平面とします。 さらに原点を点P、x'軸はPAを通る直線とします。 座標系x'y'z'から円周上の点D(X',Y',Z')を求め 座標系XYZに変換した(X4,Y4,Z4)を求めたいのですが、どうすればよいのでしょうか? 以下のようにすれば求まると思うのですが角度α、β、γの求め方が分かりません。 X'' = X' * cosα - Y' * sinα Y'' = X' * sinα + Y' * cosα Z'' = Z' X''' = X'' Y''' = Y'' * cosβ - Z'' * sinβ Z''' = Y'' * sinβ + Z'' * cosβ X4 = X''' * cosγ + Z''' * sinγ Y4 = Y''' Z4 = Z''' * cosγ - X''' * sinγ よろしくお願いします。

  • 直交変換

    Z-軸を軸とする角θの回転で、ベクトル x=( x y z )^T を ベクトル x’=( x’ y’ z’ )にうつしたのち、y-軸を軸とする角φの回転で、 ベクトル x’=( x’ y’ z’ )^T をベクトル x”=( x” y” z” )^Tに うつしたとき、ベクトルxをベクトルx”にうつす直交変換の行列表示の求め方を教えてください。

  • 座標変換

    3次元(x,y,z)物体の回転でよくx軸、y軸、z軸で回転がありますが、xy平面との角度φを回転させたいときはどうすればいいでしょうか? xy平面との角度をφ回転させた後の座標(X,Y,Z)はどうなるのでしょうか? また X     x Y = T・y Z     z このような行列Tが存在するのでしょうか?

  • 3次元座標の求め方

    3次元座標の求め方 原点 0,0,0 を中心にした球体面上の正面から見た頂点座標で、 回転による移動後の座標の求め方を知りたいです。 例えば、球面の半径が 100 で、頂点の座標 x1, y1, z1 が 100, 0, 0 にある場合、 Y軸に対してπ/2 rad (90度)回転した座標 x2, y2, z2 は 0, 0, -100 になると思うのですが、 この新たな3つの座標 x2, y2, z2 を導くにはどのように計算しているのでしょうか。 平面上の円運動のように cos sin の組み合わせ等で導き出せるのでしょうか。 x1, y1, z1 から、 Y軸に対してr回転 した場合の各 x2, y2, z3 の出し方 X軸に対してθ回転 した場合の各 x3, y3, z3の出し方 Z軸に対してΘ回転 した場合の各 x4, y4, z4 の出し方 のような形で、導くための計算を順にお教えいただけると嬉しいです。 最終的には、元座標 x, y, z をY軸にr、更にそこからX軸にθ、更にそこからZ軸にΘで X, Y, Z になる、といった形で求められるようになりたいと思っています。 座標は原点 0, 0, 0を中心に 上に行くほどYが「減少」 右に行くほどXが「増加」 奥に行くほどZが「増加」 Y減少 ↑ _ Z増加 │/` ├─→ X増加 という形になっています 自分のわかる限りで質問内容を細かく記述したつもりですが、 数学の知識に乏しいので、記号などの使い方や説明の不備があるかもしれません。 何か不足があった場合には補足させて頂きます。 以上宜しくお願い致します。