回転した座標軸と一致させるための回転軸と角度の算出

このQ&Aのポイント
  • xyz座標を回転してXYZ座標の向きに一致させたいと考えています。回転軸と回転角度を求める方法について教えてください。
  • xyz座標からみたXベクトルの方向余弦、Yベクトルの方向余弦、Zベクトルの方向余弦が分かっています。XY軸を一致させるための回転軸と角度を算出する方法を教えてください。
  • XYZ座標に一致させるために、xyz座標を回転させる必要があります。回転軸と回転角度を求める方法を教えてください。
回答を見る
  • ベストアンサー

回転した座標軸と一致させるための回転軸と角度の算出

こんにちは。お知恵をお借りしたく質問致します。 プログラミング中で出た話題なのですが、計算の問題ですので数学カテゴリが適しているだろうと思い、投稿いたします。 ちょっと説明しにくく図を添付致しましたので併せてご覧いただければと思います。(線がふるえていて申し訳ないです。) 図のように、xyz座標を回転してXYZ座標の向きに一致させたいと考えています。 また、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数があるので、それを活用しようと考えています。α,β,γはコサイン値(方向余弦)です。回転方向は、ベクトルの向きに時計回り…右ネジの法則みたいな感じです。 x軸から見たXの角度(θxX), y軸からのX(θyX), z軸からのX(θzX) 同様にx軸から見たY(θxY),θyY,θzY、θxZ,θyZ,θzZ といったように、それらの角度(コサイン値)は分かっています。 (=xyz座標からみたXベクトルの方向余弦、Yベクトルの方向余弦、Zベクトルの方向余弦が分かっている。) z軸とZ軸の外積を取ったベクトルを回転軸として、θzZが分かっているのでその角度で回転することでZ軸は一致しますけど、XY軸は合いません。(当然ですが…) そのXY軸を合わせるためにまた回転するというのも遠回りで、任意の軸1本を中心に何度か回転するだけ(上記関数を1度使用するだけ)で、必ず向きが一致する解があると思うのですが、その任意軸と角度を算出する方法が分かりません。 一般にどういう計算をするのでしょうか。アドバイスいただければ幸いです。 なお、上記関数を用いない方法でも構いません。 「X軸(Y軸、Z軸)を回転軸としてφ度回転する」という関数もあるので、オイラー角を求める方法でも構いません。 その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。 どうかよろしくお願いいたします。

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

  • ベストアンサー
回答No.3

というかそのままでいいのか。バカだ。。。。 回転前の基底ex, ey, ez,回転後の基底eX, eY, eZとして eX = cos(θxX) ex + cos(θyX) ey + cos(θzX) ez eY = cos(θxY) ex + cos(θyY) ey + cos(θzY) ez eZ = cos(θxZ) ex + cos(θyZ) ey + cos(θzZ) ez だから,この係数行列がそのまま座標回転行列。 座標回転行列は実直交行列なので,この転置行列が逆行列。

user10407
質問者

お礼

オイラー角を使った方法により無事に解決できました。 この度はアドバイスしていただき、本当にありがとうございました。 大変参考になりました。

user10407
質問者

補足

ありがとうございます。 分かりました、回転行列さえ分かれば、そこからオイラー角を求めるのは簡単なのは理解しました。 http://www7.atwiki.jp/lucifer/pages/13.html で、その回転行列は、単純に (θxX, θyX, θzX) (θxY, θyY, θzY) (θxZ, θyZ, θzZ) である…。 最初に知りたがってた任意軸回転の解についても、オイラー角が求まれば、そこから任意軸回転を求められそうです。 とりあえずこれで解決しそうですが、まだ自分の勘違いがあるかもなのでプログラム上でも完全に動作したことを確認してから締め切ります。(明日以降になりそうです)

その他の回答 (7)

回答No.8

さらにもうひとつ。 回転軸の方向余弦が求まれば ロドリゲスの公式から cosθとsinθが 求まりますね。 #θ:回転角

user10407
質問者

お礼

とりあえず、オイラー角を使った方法で無事に解決できました。 1回の軸回転(任意軸回転)による方法についてはまだ出来ていませんが、たくさんのアドバイスを頂戴しましたので、後は自分で調べるなりして分かりそうです。 3度回転するよりも1度で終わればやはり美しいので、この方法も十分に理解して実装できるよう頑張ってみます。 この度はアドバイスしていただき、本当にありがとうございました。 大変参考になりました。

user10407
質問者

補足

何度もありがとうございますm(_ _)m そういえば、色々調べてたらその公式の記述も見かけました。 色々な方法があるようで面白いです。 それも試してみようと思います。 そろそろ回答締め切ります。

回答No.7

ANO6 です。もうちょっと考えてみました。 回転軸は回転によって変化しないから 回転行列をM 回転軸を W とすれば MW=W=EW (E:単位行列) (M-E)W=0 なので、W は M-E のうち、一次独立な行ベクトルを2本選び 外積をとれば得られます。適当に2本選んで外積とって 零ベクトルになっちゃったら、別の2本を選ぶでよろしいかと。 角度は前に示した方法で求まりますが、もっと簡単な方法は無いかな?

user10407
質問者

お礼

お一人にしかポイントを付与できないのが残念ですが、ベストアンサーと同じくらい助かりました。 この度は貴重な時間を割いてまでいろいろと教えていただき、大変ありがとうございますm(_ _)m

回答No.6

ANO5です。 回転軸を回転しても長さは変わりませんから固有値=1の固有ベクトルということに なりますね。 とすると固有方程式を解くまでもないので、固有ベクトルは簡単にもとまります。 回転軸に対する回転量は、回転軸に垂直なベクトルを用意すれば計算できます。 もっとスマートな方法があるかもしれませんが・・・

user10407
質問者

お礼

回転行列Rの固有ベクトルは(m32 - m23, m13 - m31, m21 - m12)で、良さそうな感じです。 角度については、行列のトレースが固有値の総和であることからtrace[R] = 1 + 2cosθ よって、θ=ArcCos((trace[R] - 1) / 2) で、求まるという記述がありました※。実際に実装して動作確認できました。 なぜそういう求め方で良いのか、自分にはまだよく分かりませんが…(^-^;) もっと勉強してがんばって理解します。 ※引用 http://www.rugbysensor.com/motion_cluc..html

回答No.5

ちゃんとした答を示せませんが 回転軸方向のベクトルは 回転で変化しないから 回転行列の固有ベクトル ですよね。

user10407
質問者

補足

回答ありがとうございますm(_ _)m なるほど、固有ベクトルという言葉は初めて知りました。いま調べて理解しました。 計算方法等もちらほら見かけることができるので、参考になりそうです。 勉強になりました。

回答No.4

いや,座標回転行列が直接得られるのでオイラー角なんていらないんじゃない?という意味なんですが。サブルーチンなんか使わずに直接行列計算したらいいんじゃないの。まあ,詳細がわからないのでなんともいえませんが。

user10407
質問者

補足

あ、そういうことですか。 回転行列が分かっても動かせないんです。説明不足でした。 OpenGLとかDirectXとかなら、自分で回転行列使って回せますけど、別の開発環境になっていまして、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数とか、限られたものしか、無いんですよ~(;_;) あとさっきの補足に書いた回転行列は縦と横が逆だったかもということは気づいています(^-^;) 回答助かりますm(_ _)m

回答No.2

やったことないけど, (オイラー角を使った回転行列の11要素) = cos(θxX) みたいなのが9個あるんでしょ。 これを解いて三つのオイラー角が一意に決まるんじゃないの?

user10407
質問者

補足

あ、θxXってそういうことなんですか…。 ちょっと、高校数学IIB+α程度の知識しか無く行列に不慣れで…。 まだよく分かってませんが連立すれば解けそうな気はしました。 少し時間をください。

回答No.1

点P(x、y、z)を各座標軸を軸として、ある角度Φだけ回転したときのPの移る先の座標を計算するには、3行3列の行列R(Φ)を使います。すなわち、x軸のまわりにΦだけ回転するときR(Φ)は1行目、2行目、3行目の順に書くと、 A=(1 0 0)、(0 cosΦ -sinΦ)、(0 sinΦ cosΦ) となります。 y軸中心に回転するときは、 B=(cosΦ 0 ーsinΦ)、(0 1 0)、(sinΦ 0 cosΦ) z軸中心に回転するときは、 C=(cosΦ ーsinΦ 0)、(sinΦ cosΦ 0)、(0 0 1) となり、点Pをx軸のまわりにΦ、さらにy軸のまわりにψだけ回転すると、 B(AP)=(B・A)P を計算します。

user10407
質問者

お礼

無事に解決できました。 この度はアドバイスしていただき、本当にありがとうございました。 大変参考になりました。

user10407
質問者

補足

回答ありがとうございますm(_ _)m 回答していただいた内容は理解できました。 回転行列が分かると、オイラー角を算出するのは簡単そうだというのが分かってきました。 もう少し時間をください。

関連するQ&A

  • 任意の軸に回転するための角度を知りたい

    右手系の直交座標系で基準のベクトル(0,0,1)があったとします。 x軸周り、y軸周り、z軸周りの順番で基準のベクトルを回転してベクトル(x,y,z)にする時、z軸周りの回転角度は決まっていて、残りのx軸とy軸をそれぞれ何度回せばいいのか計算する方法を教えて下さい。

  • 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次元の座標変換と角度について。

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

  • 座標変換による回転角の求め方

    直交座標系で定義されている任意のベクトル(x1、y1、z1)に対し、そのベクトル方向に直交座標系のz軸が向くようにするための各軸回りの回転角(θx、θy、θz)の求め方(式)を教えてください。

  • 三次元座標の回転角度

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

  • 回転後の座標について 5軸加工機

    今年中に、OKKの縦型マシニング機械(三菱Neomatic)に日研のNCインデックス(角度と回転ができる仕様)を載せる予定です。 使いやすくするため、テーブル回転後の座標を、変数で計算ができるプログラムを作っているのですが、うまくいかず頭をかかえてる毎日であります。 そこで、皆様の力をお願いしたく質問させていただきます。 私の希望としては、 #101=回転させたいG54からのX座標(+OR-) #102=回転させたいG54からのY座標(+OR-) #103=回転させたいG54からのZ座標(+OR-) #104=回転C(+OR-) #105=角度A(+OR-) 上記、G54座標中心からずれた数値(#101から#103)から、回転&角度(#104、#105)の数値を変更するだけで、ひねった後の座標を計算し、その答えをG55の座標系に入れるプログラムを作っているのですが、いくつか問題がある為うまくいきません。 ◎G54のワーク座標がテーブル回転中心ではない。 ◎G54のワーク座標の中心位置から、さらにずらした位置を回転させたい。 ◎X,Y,Z及び、回転軸C、角度軸A 共にプラス数値とマイナス数値があり計算が困難。 ◎回転軸C、角度軸A 共に90度以上回る。 この様な原因があり、電卓で計算した数値と変数で計算させた数値が違い、困った次第であります。 機械の特徴としては、 ◎機械座標はマイナス数値 ◎テーブル回転中心座標は#501=X #502=Y #503=Z に登録済み。 ★☆まとめ☆★ #5221=G54X座標 #5222=G54Y座標 #5223=G54X座標 を使い #101=回転させたいG54からのX座標(+OR-) #102=回転させたいG54からのY座標(+OR-) #103=回転させたいG54からのZ座標(+OR-) #104=回転C(+OR-) #105=角度A(+OR-) で移動させた数値の答えを #5221=G54X座標 #5222=G54Y座標 #5223=G54Z座標 に登録したい。 文章が下手で申し訳ありませんが、どなたか変数を使い回転後の座標が計算できるプログラムをお教え下さい。 不明な点等ございましたらお教え下さい。 大変困っているので宜しくお願いします。 まとめの部分を下記の様に修正いたします。 ★☆まとめ☆★ #5221=G54X座標 #5222=G54Y座標 #5223=G54X座標 を使い #101=回転させたいG54からのX座標(+OR-) #102=回転させたいG54からのY座標(+OR-) #103=回転させたいG54からのZ座標(+OR-) #104=回転C(+OR-) #105=角度A(+OR-) で移動させた数値の答えを #5241=G55X座標 #5242=G55Y座標 #5243=G55Z座標 に登録したい。

  • 座標系の回転の問題です

    大学物理入門の問題です 【問題】 空間に固定された座標系Sと、回転している別の座標系S'を考える。座標系S'は、Sに対して角速度ω=Ωi+Ωjで回転しているものとする。ただしこれらの座標系の原点は一致するとする。また、時刻t=0においてこれらの2つの座標系は一致するとする。時刻tにおいて、座標系S'のx'軸、y'軸、z'軸方向の単位ベクトルをそれぞれi'(t)、j'(t)、k'(t)とする。 時刻tにおけるベクトルi'(t)、j'(t)、k'(t)を求めよ 問題は以上です 文中のωはベクトル、i、j、kはそれぞれ座標系Sのx軸、y軸、z軸方向の単位ベクトルです できれば、ベクトルi'(t)、j'(t)、k'(t)がどのような回転をするのか、図を用いて説明していただけると嬉しいです どなたか知恵をお貸しください よろしくお願いします

  • 座標系 三角関数 回転行列

    座標系 三角関数 回転行列 単位円において、θの正方向は反時計回りですがこれって右手系の座標系を採用しているからですか? x,y,zの3軸を考えると以下になってしまって混乱しています。 1.(Z軸が奥向きの場合) Y ↑ | |  --→X この座標系では、時計回りがθの正の方向ですよね? 2.(Z軸が手前向ききの場合)    Y    ↑    |    | X←-- この座標系では、反時計回りがθの正の方向ですよね? 参考書などに書かれている単位円はθの正方向は反時計回りだと認識しているのですが、その場合、2の座標系なんでしょうか? 私は、1の座標系で反時計回りを正にしているように思いました・・・ 回転行列を作ろうと思って考えた結果、自分でも混乱しています。。。 申し訳ないのですが、ご回答よろしくお願い致します。

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

    空間上にある点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θ)で求めています。 長々とすみませんが、よろしくお願いします。