教えて!goo限定 1000名様に電子コミック1000円分が当たる!!

オイラー角 回転行列

オイラー角と回転行列の関係が良く理解出来ないので
質問させて下さい。


工学や物理学で使われるオイラー角の回転順序は
Z-X-Zが一般的だと認識しています。

ここで、3次元空間でのX軸、Y軸、Z軸周りの回転を
表す回転行列は、

  1  0  0
Rx= 0 cosθ -sinθ
0 sinθ cosθ


  cosθ 0 sinθ
Ry= 0  1 0
-sinθ 0 cosθ


   cosθ -sinθ 0
Rz= sinθ cosθ 0
0   0  1

です。
それぞれのθが、その軸での回転だと認識しています。

ここで、回転の方向はRxはY軸をZ軸に向ける方向、
RyはZ軸をX軸に向ける方向、RzはX軸をY軸に向ける方向。


Z-X-Zとは、
Rz・Rx・Rzの積という認識で良いでしょうか?

例えば、
Rx:Y軸をZ軸に向ける方向にπ/2
Ry:Z軸をX軸に向ける方向にπ/3
Rz:X軸をY軸に向ける方向にπ/4
回転させたとします。
Rz・Rx・Rzの積でなぜ、Ryの回転
が表現できるのですか?


また、オイラー角はα,β,γと表記される事もありますが、
これは、X軸回転をα、Y軸回転をβ、Z軸回転をγで表して
いるという事なのでしょうか?

分からない点だらけで申し訳御座いませんが、ご回答何卒よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (10件)

>3つの回転軸ベクトルとはなんでしょうか?また、オイラー角の3つの角度φ,θ,ψの組とは、それぞれの回転軸における回転角の事でしょうか?



ZXZオイラー角を考えるなら,
1.最初にZ軸周りにφ回転
2.X'軸(X軸をZ軸周りにφ回転したもの)周りにθ回転
3.Z''軸(Z軸をX'軸周りにθ回転したもの)周りにψ回転
のように3つの軸周りの回転で任意の回転を表すわけですが,この3つの回転角の組み合わせのことを,オイラー角と呼ぶわけです.

回転軸ベクトルは,回転軸方向のベクトル,と書くつもりでした….すみません.


>t[0 1 0]というベクトルはx軸周りにθ回転すると t[0 cosθ sinθ]と
なることは理解できたのですが、t[0 0 1] がt[0 -sinθ cosθ]となる理由がよくわかりません。。。

図は描きましたか?
3次元の図が分かりにくければy-z平面で考えてみましょう.

>回転行列は丸暗記しているのでどうしてそうなるか考えたこともありませんでした。

とのことですが,回転行列は回転によってそれぞれの軸方向の単位ベクトルがどこに移るかを調べて並べたもの,ということもできます.
図が描けるようになれば忘れてもすぐに作れます.


>なぜ4行目が[0001]で、4列目が[0001]で並進を表すのでしょうか?

4列目が t[0 0 0 1] なら,並進は0です.
4列目の1~3行に平行移動量を表すベクトルを書きます.
左上の3行3列のブロックには回転行列を書きます.
4行目は常に [0 0 0 1] とします.

また,合同変換を使う場合はベクトルにも細工が必要です.
具体的には,例えば t[r1 r2 r3] というベクトルがあったら,これを t[r1 r2 r3 1] と変えます.
下に1を付け加えるだけですね.

上のように作ったベクトル t[r1 r2 r3 1] に合同変換行列を作用させてできるベクトルも,必ず4行目が1になり,上3成分が,ベクトル t[r1 r2 r3] に回転と平行移動を加えたベクトルを表します.

詳しくはwebや線形代数の教科書(同次変換はアフィン変換の特殊な場合です)などで調べてみてください.

この回答への補足

ご回答ありがとうございます。

図に描いて考えているのですが、
どうも良く分かりません。
t[0 0 1] はをX軸を回転中心として、時計回りにθ回転すると
t[0 sinθ cosθ]となります・・・

なぜ-sinθとなるのでしょうか?
象限って関係あるのでしょうか?
半径1の円を描いて考えると、X軸中心で
θ回転したZの単位ベクトルは第4象限
にいます。
Zだけ-θ回転した事になるのでしょうか?

申し訳ありません。。
混乱してきました・・・


並進については理解できました。
つまり、4列目がt[1 2 3]なら、
X方向に1、y方向に2、z方向に3
移動したという事ですね。


本当に何度も申し訳ないのですが、
ご回答よろしくお願い致します。

補足日時:2011/07/11 17:52
    • good
    • 0

図を描くとこういうことですね。


(フリーハンドの赤の矢印がうまく描けずすいません。)
「オイラー角 回転行列」の回答画像10

この回答への補足

ご回答ありがとうございます。
図で示して頂けて大変助かりました。

補足日時:2011/07/14 11:34
    • good
    • 0

>θ回転とは、反時計回りにθ回転するということなのでしょうか?


右ネジは、「の」字で覚えていたのですが、時計回りですよね?
θ回転とはどっちの方向に回転しているのでしょうか?

そうか,すみません.
x軸がどちらを向いているか(紙面手前向きか逆向きか)を決めないと,時計回りが正だとかいう議論は無意味ですが,確認してませんでしたね.
どうも,x軸を手前向きに書く癖があって,そちらの場合しか考えていませんでした.

なるほど,「の」の字を描くように回すと右ねじは先に進んでいくわけですね.
これは初めて聞きました.
注意点は,ねじの先端の向いている方向が,回転軸正の向きだということです.

別の覚え方を書いておきましょう.
まず,右手を親指を立てて握って,「good」のポーズします b(^^)
次に,親指の向いてる方向と回転軸の方向を合わせます.
残りの指(人差し指から小指まで)が向いてる方向が,正の回転方向です.

さて,質問者さんの図ではどちら向いてます?
x軸が紙面裏に向かう方向を向いていれば,時計回りが正の向き.
x軸が紙面手前側に向かう方向であれば,反時計回りが正の向きです.

時計回りに回して,t[0 0 1] が t[0 sinθ cosθ] となるなら,
・ x軸が手前側を向く方向になっている(正の向きは反時計回り)
・ 座標系が右手系になっていない(左手系は使ってはいけない!)
のどちらかだと思います.

この回答への補足

ご回答ありがとうございます。

hitokotonusiさんの図の左側を
採用しておりました。

ここで、Zの単位ベクトルを
θ回転するとθが-θとなる
のですね。

Yの単位ベクトルをθ回転させた場合
は正で良いが、Zの単位ベクトルは
-θとしなければならないですね。

負角なのでt[0 0 1]は、t[0 -sinθ cosθ]
となると理解しました。
この、理解で正しいでしょうか?

また、外積もそうですがオイラー角も右手座標系なのですね。
ちょっと疑問に感じたのですが、別にどちらの座標系を
採用しても構わないのではないのでしょうか?
正負が逆になるだけの気がします。
なぜ、右手座標系でなければダメなのでしょうか?

以上、何度も本当にお手数をお掛けしますが
ご回答よろしくお願い致します。

補足日時:2011/07/14 11:29
    • good
    • 0
この回答へのお礼

すいません。
やっぱり理解出来ていないので、三角関数 回転行列と題して再度質問させて頂きます。
申し訳ないです。

お礼日時:2011/07/15 23:49

>t[0 0 1] はをX軸を回転中心として、時計回りにθ回転すると


t[0 sinθ cosθ]となります・・・

まぁ,それはそうですねぇ.
でも,正の向きは逆向きですよ^^;

この回答への補足

ご回答ありがとうございます。
θ回転とは、反時計回りにθ回転するということなのでしょうか?

右ネジは、「の」字で覚えていたのですが、時計回りですよね?

θ回転とはどっちの方向に回転しているのでしょうか?

再三申し訳ありませんが、ご回答よろしくお願い致します。

補足日時:2011/07/12 09:56
    • good
    • 0

ANo.4の補足について



#5さんが書かれている通りで改めてつけ加えることはないのですが・・・・

ベクトルの回転で符号が逆になる理由はANo.4ですでに

>(相対関係が座標系の-θ回転と同じなので。)

と書いてあります。

4×4行列のほうもANo.4で

>画像処理などでまとめて計算するときに使われているようですね。

と書いてある通りで、画像処理などでは回転と並進を同時に行なうことが多いので、
このような手法が使われています。
    • good
    • 0

>ジンバルロックが発生した状態とは


線形従属状態なので、つまり基底ベクトル
が定義出来ず座標を決める事ができない
状態という解釈で良いでしょうか?

といいますか,3つの回転軸ベクトルのうち2つが従属になってしまっているために,オイラー角の3つの角度φ,θ,ψの組が一意に決められない状態のことです.


ついでに,ちょっと失礼して他の方の回答への補足に関して.

ベクトルの回転と座標系の回転のところですが,ベクトルに

1   0   0
0  cosθ -sinθ
0  sinθ  cosθ

を掛けるとベクトルがx軸周りにθ回転するのは,実際に計算してみれば分かります.

例えば, t[0 1 0] というベクトル(y軸方向単位ベクトル)はx軸周りにθ回転すると t[0 cosθ sinθ] となり, t[0 0 1] は t[0 -sinθ cosθ] となるのは,図を描けばすぐに分かると思います.

これをベクトルの立場から見てみる(ベクトルの方を固定してみる)と,座標系が-θだけ回転しているように見えます.
なので,ベクトルを固定して座標系をθだけ回転した場合の,回転後の座標系から見たベクトルを得ようと思ったら,ベクトルの-θ回転に相当する行列を掛けることになります.

座標の回転とベクトルの回転と言うのは,基準をベクトルに置くか座標に置くかの違いしかないわけです.
符号の違いは,向かい合って会話している時に相手にとっての右向きと自分にとっての右向きが逆になってる,というのと同じようなことです.


また,4×4行列を用いると回転だけでなく平行移動も含めて表すことができます.
これを同次変換といいます.

http://www.is.oit.ac.jp/~whashimo/server/~whashi …

この変換に関して,

>なぜ回転行列で並進を考慮する必要があるのでしょうか?

とのことですが,まず,回転行列で並進を考える,というのがちょっと変な表現ですねぇ.
別に回転行列で並進を考えているわけではなくて,並進と回転をセットにして扱っている,ということです.

ただまぁ,ぶっちゃけ必要ないです.
回転と平行移動を別々に考えればそれでいいんです.

では何で同次変換を考えるかと言うと,回転と平行移動を別々に書くより表現が簡潔だから,というだけです.
何回も連続で回転と平行移動の合わさった変換を加えないといけない場合(例えば何リンクもあるロボットアームの先に固定した座標系と土台に固定した座標系との間の変換)の記述に威力を発揮しますが,計算量が減ったり,といったご利益はありません.

この回答への補足

ご回答ありがとうございます。

ジンバルロックに関して、
3つの回転軸ベクトルのうち2つが従属になってしまっているために,オイラー角の3つの角度φ,θ,ψの組が一意に決められない状態のことです.

3つの回転軸ベクトルとはなんでしょうか?また、オイラー角の3つの角度φ,θ,ψの組とは、それぞれの回転軸における回転角の事でしょうか?

回転行列は丸暗記しているのでどうしてそうなるか考えたこともありませんでした。

t[0 1 0]というベクトルはx軸周りにθ回転すると t[0 cosθ sinθ]と
なることは理解できたのですが、t[0 0 1] がt[0 -sinθ cosθ]と
なる理由がよくわかりません。。。
xzは分かるのですが、yがなぜ-sinθとなるか理解出来ませんでした・・・

丁寧な解説をして頂いているにも関わらず、大変心苦しいのですが、
yがなぜ-sinθとなるかご教示頂けないでしょうか?

また、4行4列が並進を表す事は分かりました。
しかし、なぜ4行目が[0001]で、4列目が[0001]で並進を表すのでしょうか?


以上、追加質問ばかりで本当に申し訳ありませんがご回答よろしくお願い致します。

補足日時:2011/07/08 22:50
    • good
    • 0

X軸回りに座標系をθ回転する行列は



1   0   0
0  cosθ sinθ
0 -sinθ cosθ

です。θの正方向はy軸からz軸に回す向き。

座標系がそのままでベクトルを回転する行列が

1   0   0
0  cosθ -sinθ
0  sinθ  cosθ

です。(相対関係が座標系の-θ回転と同じなので。)

>また、4行4列で表されているものもあった

おそらくその4行め、4列めは座標の並進を表していると思います。
画像処理などでまとめて計算するときに使われているようですね。

この回答への補足

ご回答ありがとうございます。
お礼が遅くなり申し訳ありません。


X軸回りに座標系をθ回転する行列は

1   0   0
0  cosθ sinθ
0 -sinθ cosθ

座標系がそのままでベクトルを回転する行列が

1   0   0
0  cosθ -sinθ
0  sinθ  cosθ

です。(相対関係が座標系の-θ回転と同じなので。)

すいません。。。
良く理解出来ませんでした・・・

オイラー角は座標系の回転だから、
X軸回りに座標系をθ回転する行列は

1   0   0
0  cosθ sinθ
0 -sinθ cosθ

となる事は理解出来ました。



座標系がそのままでベクトルを回転する行列が

1   0   0
0  cosθ -sinθ
0  sinθ  cosθ


sinθの部分が入れ替わっただけですが、
なぜ座標系ではなくベクトルの回転を
表すのでしょうか?

回転行列とは、座標系に与えられるものでは
ないのでしょうか?

また、4行目4列目が並進を表すとのことなのですが、なぜ回転行列で並進を考慮する必要があるのでしょうか?

以上、度々申し訳ありませんがご回答
よろしくお願い致します。

補足日時:2011/07/05 21:37
    • good
    • 0

>Z軸を90度傾けると、X軸とY軸が同軸となる


と記載されていました。

http://d.hatena.ne.jp/keyword/%A5%B8%A5%F3%A5%D0 …
あたりを見たのでしょうか?

しかし,う~ん….何が言いたいんでしょうねぇ…?
どういう状況を考えているのか僕にもよくわかりません.

オイラー角の定義の仕方は全部で12通りあるのですが,どの定義を使うかでジンバルロックが生じる条件が変わってきます.
一般によく使われるのは,Z-X-Zオイラー角,Z-Y-Zオイラー角,Z-Y-Xオイラー角(ロール・ピッチ・ヨー角)の三種類でしょうか.一般にオイラー角,と言えば前者2つのうちのどちらかだと思います.どちらの場合も,第二軸周りの回転がπになったときに第一軸(Z軸)と第三軸(Z''軸:もともとの座標系と区別するためにダッシュをつけておきます)が一致しジンバルロックにおちいります.
いわゆるオイラー角,ではなくロール・ピッチ・ヨー角の場合には,第二軸周りの回転角度をπ/2にしてしまうと,第一軸(X軸)と第三軸(Z''軸)が一致してしまうのでジンバルロックになります.

そんなわけで,「Z軸を90度傾けると、X軸とY軸が同軸となる」というのがオイラー角をどう定義した場合に生じるのかはよく分かりませんが(ちょっと考えれば分かるのかもしれませんが,そうだとしても説明が足りなすぎですね),一般的に使われている定義とは合致しなさそうです.

この回答への補足

ご回答ありがとうございます。
お礼が遅くなり申し訳ありません。

ジンバルロックとは、つまり座標系を回転した
際に元の座標系と一致してしまって発生する
のですね。

この点は理解しました。

ジンバルロックが発生した状態とは
線形従属状態なので、つまり基底ベクトル
が定義出来ず座標を決める事ができない
状態という解釈で良いでしょうか?


度々申し訳ありませんが、ご回答よろしく
お願い致します。

補足日時:2011/07/05 21:38
    • good
    • 0

符号が逆,との指摘については,どういう方向の変換(変換後の座標→変換前の座標 か 変換前の座標→変換後の座標)を考えているかで変わってくると思うので確認してください.


ロボットをやってると,質問者さんが書いている方の行列を回転行列とすることが多いです.

ポイントは,#1さんもおっしゃっているように,固定された座標系の軸周りで考えているわけではない,ということです.
そのために,考える3つの回転軸方向のベクトルは(ほとんどの場合)線形独立になります.

因みに,ほとんどの場合,といったのは勿論,そうではない場合(特異点)が存在するからです.
例えばZ-X-Zオイラー角でRxの回転角度がπや2πのとき,最初のRzと最後のRzとで回転軸が一致してしまうので,3つの回転軸方向のベクトルが線形従属になってしまいます(図を載せればいいのでしょうが面倒なので,自分で描いてみてください).
これをジンバルロックと言います.


↓のページの下の方に,オイラー角の説明があります.アニメーションもあるので分かりやすいかと.
http://www.mech.tohoku-gakuin.ac.jp/rde/contents …

この回答への補足

ご回答ありがとうございます。

ジンバルロックは調べたのですが、
Z軸を90度傾けると、X軸とY軸が同軸となる
と記載されていました。

この意味が良く分からないです。
線形従属となって基底ベクトルを構成
できないという点は理解できます。

ご回答よろしくお願い致します。

補足日時:2011/07/02 01:07
    • good
    • 0

まず、オイラー角といえば座標系の回転なので、符号が逆だと思います。


Rxなら
1   0   0
0  cosθ sinθ
0 -sinθ cosθ

次に座標系の回転とは何をやっているかですが、考えているベクトルをA、
回転前の基底をe1, e2, e3、回転後の基底をu1, u2, u3として

A = A1 e1 + A2 e2 + A3 e3 = A1' u1 + A2' u2 + A3' u3

なる新しい座標系での成分(A1', A2', A3')を求めることにほか成りません。

最初のZ軸回転ではe1, e2軸が回転してu1, u2になります。e3とu3は同じベクトルです。

こうして求めた(A1', A2', A3')に次のX回転行列Rxをかけるということは、
u1まわりの回転を意味します。(e1まわりではない!)

その結果は、新たな基底をv1, v2, v3(ベクトル)として

A = A1 e1 + A2 e2 + A3 e3 = A1' u1 + A2' u2 + A3' u3= A1'' v1 + A2'' v2 + A3'' v3

なる新たな成分(A1'', A2'', A3'')を求めることに成ります。
ここではu1まわりの回転なのでu1とv1は等しく、u2, u3が回転してv2, v3になります。

これにさらにZ回転行列をかけるということは、v3まわりの回転を意味しており、
新たな基底をw1, w2, w3(ベクトル)として、

A = A1 e1 + A2 e2 + A3 e3 = A1' u1 + A2' u2 + A3' u3 = A1'' v1 + A2'' v2 + A3'' v3 = A1''' w1 + A2''' w2 + A3''' w3

なる成分を求めることを意味します。ここではv3, w3が等しく、v1,v2がw1, w2へと回転します。

以上の通り、Rz・Rx・Rzという回転行列のうちの前二つ(Rz・Rx)は固定された空間座標まわりの回転ではなく、回転後の新たな座標軸まわりの回転を意味しているので、空間座標系のy軸まわりの回転もそこには含まれてきます。

まあ、こういう図を見れば自明だとは思いますが。
http://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4% …

この回答への補足

ご回答ありがとうございます。
お礼が遅くなりましてすいません。

  1  0  0
Rx= 0  cosθ -sinθ
   0  sinθ cosθ


   cosθ 0 sinθ
Ry=   0     1   0
   -sinθ  0   cosθ


   cosθ -sinθ 0
Rz= sinθ   cosθ  0
     0      0     1

が一般的に表される回転行列でしょうか?

また、4行4列で表されているものもあった
のですが4行4列で表している理由なんで
しょうか?


  1  0  0  0
Rx= 0  cosθ -sinθ 0 
    0  sinθ cosθ 0
  0  0  0  1


   cosθ 0 sinθ 0
Ry=   0     1   0  0
   -sinθ  0  cosθ 0
    0 0  0     1


   cosθ -sinθ 0  0
Rz= sinθ   cosθ  0  0
     0      0     1  0
     0      0     0   1


以上、ご回答よろしくお願い致します。

補足日時:2011/07/02 10:46
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

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

こんにちは。お知恵をお借りしたく質問致します。
プログラミング中で出た話題なのですが、計算の問題ですので数学カテゴリが適しているだろうと思い、投稿いたします。

ちょっと説明しにくく図を添付致しましたので併せてご覧いただければと思います。(線がふるえていて申し訳ないです。)

図のように、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軸)を回転軸としてφ度回転する」という関数もあるので、オイラー角を求める方法でも構いません。

その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。
どうかよろしくお願いいたします。

こんにちは。お知恵をお借りしたく質問致します。
プログラミング中で出た話題なのですが、計算の問題ですので数学カテゴリが適しているだろうと思い、投稿いたします。

ちょっと説明しにくく図を添付致しましたので併せてご覧いただければと思います。(線がふるえていて申し訳ないです。)

図のように、xyz座標を回転してXYZ座標の向きに一致させたいと考えています。
また、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数があるので、それを活用しようと考えています。α,β,γはコサイン値(方向余弦)...続きを読む

Aベストアンサー

というかそのままでいいのか。バカだ。。。。

回転前の基底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

だから,この係数行列がそのまま座標回転行列。
座標回転行列は実直交行列なので,この転置行列が逆行列。

Qベクトルをロールピッチヨーに変換する方法

ベクトル(x,y,z)を右手系の直交座標系のロールピッチヨー(Rx,Ry,Rz:xyzの順に回転)に変換する方法を探しています。
これだけだとベクトルのひねりがあるので答えは一意に決まらないと思うのでヨー(Rz)を指定して、残りのロール(Rx)とピッチ(Ry)を求める計算式が有るのではないかと思っています。

皆様のお知恵を拝借できたらと思っています。
どうかよろしくおねがいします。

Aベストアンサー

ロール、ピッチ、ヨーは、回転変換のバラメータですから、
「何のベクトルを」 (x,y,z) へ変換するのかによって、
値は違ってきます。
(1,0,0) を (x,y,z) 方向へ移す回転と
(0,0,1) を (x,y,z) 方向へ移す回転とは、当然異なる訳です。
その辺を反省して、何が求めたいのか
再考することからではないでしょうか。

Q3次元ベクトルをある軸ベクトルで回転させたい

3次元ベクトルの求め方を教えてください。

下記図のように始点を軸ベクトルでθ(度)だけ回転したときの?の位置を求めたいのです。
これはどのような計算方法になるのでしょうか?なかなか思いつかなくて非常に悩んでいます。
アドバイスや回答をいただけたら助かります。よろしくお願いします。

Aベストアンサー

先ず、中心点(Sx,Sy,Sz)が原点にくるよう全体を平行移動させます。
(一番最後に元に戻します)
始点(Px,Py,Pz)は、(Px-Sx,Py-Sy,Pz-Sz)に移ります。この座標を(Px',Py',Pz')とします。

次に、回転軸ベクトル(Ax Ay Az)を回転させ、x軸に合致させます。それには二回の
回転変換が必要です。
最初に、ベクトル(Ax Ay Az)と、x軸方向単位ベクトル(1 0 0)のなす平面の法線ベクトルが
z軸に合うよう、x軸を回転させます(その角度をφとします)。
すると、回転軸ベクトルはx-y平面上に乗るので、それがx軸に合うよう、z軸を回転させます
(その角度をψとします)。

ベクトル(Ax Ay Az)と、x軸方向単位ベクトル(1 0 0)のなす平面の法線ベクトルは、(0 Az -Ay)。
x軸周りにφ回転させると、このベクトルは、
「1  0    0   「 0  =「      0
0 cosφ -sinφ   Az   Az・cosφ+Ay・sinφ
0 sinφ  cosφ」 -Ay」  Az・sinφ-Ay・cosφ」
で、z軸ベクトルに合うので
「      0      =「0
Az・cosφ+Ay・sinφ  0 
Az・sinφ-Ay・cosφ」  1」
これから、cosφ=-Ay/(Ay^2+Az^2)、sinφ=Az/(Ay^2+Az^2)
∴ φ=Arctan(-Az/Ay)

回転軸ベクトル(Ax Ay Az)は、
「1  0    0   「Ax =「      Ax      =「       Ax                   =「Ax 
0 cosφ -sinφ   Ay   Ay・cosφ-Az・sinφ   Ay・{-Ay/(Ay^2+Az^2)}-Az・{Az/(Ay^2+Az^2)}   -1
0 sinφ  cosφ」  Az」   Ay・sinφ+Az・cosφ」  Ay・{Az/(Ay^2+Az^2)}+Az・{-Ay/(Ay^2+Az^2)}」  0」
に変換され、x-y平面上に乗ります。これを(Ax' Ay' Az') とします。
つまり、(Ax' Ay' Az')=(Ax -1 0)

始点(Px',Py',Pz')もこの変換を受けるのですが、変換を全部纏めて後、一括変換させます。

今度は、x-y平面上に乗った回転軸ベクトル(Ax' Ay' Az')を、z軸の周りにψ回転させます。
「cosψ -sinψ 0 「Ax'  =「Ax'・cosψ-Ay'・sinψ =「Ax・cosψ+sinψ
sinψ  cosψ 0   Ay'   Ax'・sinψ+Ay'・cosψ   Ax・sinψ-cosψ
  0    0   1」  Az'」       Az'      」     0      」
これが、x軸ベクトルに合うので、
Ax・cosψ+sinψ=1
Ax・sinψ-cosψ=0
これから、cosψ=Ax/(Ax^2+1)、sinψ=1/(Ax^2+1)
∴ ψ=Arctan(1/Ax)

以上の回転の変換の積は、
「cosψ -sinψ 0 「1  0    0   =「cosψ -sinψ・cosφ  sinψ・sinφ
sinψ  cosψ 0   0 cosφ -sinφ   sinψ  cosψ・cosφ -cosψ・sinφ
  0    0   1」  0 sinφ  cosφ」   0     sinφ      cosφ   」

この変換を始点(Px',Py',Pz')に施します。
「cosψ -sinψ・cosφ  sinψ・sinφ  「Px' = 「Px'・cosψ-Py'・sinψ・cosφ+Pz'・sinψ・sinφ
sinψ  cosψ・cosφ -cosψ・sinφ  Py'   Px'・sinψ+Py'・cosψ・cosφ-Pz'・cosψ・sinφ
  0     sinφ      cosφ   」 Pz'」  Py'・sinφ+Pz'・cosφ               」 

この点を(Px”,Py”,Pz”)とします。

さて、ここでx軸に合った回転軸ベクトル(1 0 0)周りに(Px”,Py”,Pz”)を角度θ、回転させます。
「1  0    0   「Px” =「     Px”   
0 cosθ -sinθ   Py”  Py”・cosθ-Pz”・sinθ 
0 sinθ  cosθ」  Pz”」  Py”・sinθ+Pz”・cosθ」

これを(P_x, P_y, P_z)とします。

今度は、回転させた回転軸を元に戻す変換です。
回転の変換の逆行列は、行列各要素の余因子の行と列を入れ替えたものを行列式で割ったもので、
行列式は、(cosψ)^2+(sinψ)^2=1 なので、逆行列は
「 cosψ      sinψ        0  
-sinψ・cosφ  cosψ・cosφ   sinφ
sinψ・sinφ   -cosψ・sinφ  cosφ」

これを、(P_x, P_y, P_z)に施します。
「 cosψ      sinψ        0   「P_x =「P_x・cosψ+P_y・sinψ
-sinψ・cosφ  cosψ・cosφ   sinφ  P_y   -P_x・sinψ・cosφ+P_y・cosψ・cosφ+P_z・sinφ
sinψ・sinφ   -cosψ・sinφ  cosφ」 P_z」  P_x・sinψ・sinφ-P_y・cosψ・sinφ+P_z・cosφ」

結局、θ回転後のP点の座標は、
x座標 : P_x・cosψ+P_y・sinψ
y座標 : -P_x・sinψ・cosφ+P_y・cosψ・cosφ+P_z・sinφ
z座標 : P_x・sinψ・sinφ-P_y・cosψ・sinφ+P_z・cosφ
となります。

ここで、置き換えた変数を順次、元に戻します。
P_x、P_y、P_z を Px”、Py”、Pz” に、
Px”、Py”、Pz” を Px’、Py’、Pz’ に、
最後に、平行移動を戻して Px’、Py’、Pz’ を Px、Py、Pz に直します。

先ず、中心点(Sx,Sy,Sz)が原点にくるよう全体を平行移動させます。
(一番最後に元に戻します)
始点(Px,Py,Pz)は、(Px-Sx,Py-Sy,Pz-Sz)に移ります。この座標を(Px',Py',Pz')とします。

次に、回転軸ベクトル(Ax Ay Az)を回転させ、x軸に合致させます。それには二回の
回転変換が必要です。
最初に、ベクトル(Ax Ay Az)と、x軸方向単位ベクトル(1 0 0)のなす平面の法線ベクトルが
z軸に合うよう、x軸を回転させます(その角度をφとします)。
すると、回転軸ベクトルはx-y平面上に乗るので、それがx軸...続きを読む

Q3次元座標を原点中心に回転したい

任意のゼロでないベクトル(a,b,c)を原点中心に回転し、z軸に合致させるとする。同じ回転移動を3次元座標上の任意の点(x,y,z)に対して行った時の移動後座標が知りたいのです。

計算と結果を教えて下さい。

Aベストアンサー

A No. 1 です。補足。

「回転行列」
http://www.cg.info.hiroshima-cu.ac.jp/~miyazaki/knowledge/tech07.html

ロドリゲスの公式もあります。

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

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

となると思うのですが、この式からφ、ψ、θが導きだせません。
どうすれば求めることができるか教えていただけますか。

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

3軸の加速度センサーがあります。
まず加速度センサーのZ軸を重力方向に置いたときの加速度センサーの値を(x1,y1,z1)=(0,0,1)とします。
加速度センサーのx軸、y軸、z軸をそれぞれ回転させたあとの加速度センサーの値を(x2,y2,z2)とします
(このとき加速度センサーは静止しているので、センサーの値は重力の分力になります)。
(x2,y2,z2)が既知のとき(x1,y1,z1)に戻すためのそれぞれの回転角はどのように求めれば良いのか教えてください。

(x2,y2,z2...続きを読む

Aベストアンサー

>cosφ=(y2z1-y1z2)/√(z1^2+z2^2)について、どういう方程式から導かれたのか教えていただけますか?

2点(x1, y1, z1),(x2, y2, z2)と直交する点を(x3, y3, z3)とします。(2点の外積)
(x3, y3, z3)=(y2z1-y1z2, z2x1-z1x2, x2y1-x1y2)

このとき次のことが成り立ちます。
x3^2+y3^2+z3^2=1
x1x3+y1y3+z1z3=0
x2x3+y2y3+z2z3=0

最初のz軸での回転は、点(x3, y3, z3)がxz平面に移動するように回転させます。(y座標=0になる)
次のy軸での回転は、その点が(1, 0, 0)に移動するように回転させます。
最後のx軸での回転は、(x1, y1, z1),(x2, y2, z2)はyz平面に移動しているので、(x1, y1, z1)が(0, 0, 1)に移動するように回転させます。

最初の回転角度は、点(x3, y3)のy座標を0にするので、
cosφ=x3/√(x3^2+y3^2)
sinφ=-y3/√(x3^2+y3^2)

x3^2+y3^2
=(y2z1-y1z2)^2+(z2x1-z1x2)^2
=y2^2*z1^2-2y1y2z1z2+y1^2*z2^2+z2^2*x1^2-2z1z2x1x2+z1^2*x2^2
=(x1^2+y1^2)z2^2+(x2^2+y2^2)z1^2-2(x1x2+y1y2)z1z2
=(1-z1^2)z2^2+(1-z2^2)z1^2-2(-z1z2)z1z2
=z1^2+z2^2
なので、
cosφ=(y2z1-y1z2)/√(z1^2+z2^2)
sinφ=(x2z1-x1z2)/√(z1^2+z2^2)

ψ,θも同じようにして求められます。

>cosφ=(y2z1-y1z2)/√(z1^2+z2^2)について、どういう方程式から導かれたのか教えていただけますか?

2点(x1, y1, z1),(x2, y2, z2)と直交する点を(x3, y3, z3)とします。(2点の外積)
(x3, y3, z3)=(y2z1-y1z2, z2x1-z1x2, x2y1-x1y2)

このとき次のことが成り立ちます。
x3^2+y3^2+z3^2=1
x1x3+y1y3+z1z3=0
x2x3+y2y3+z2z3=0

最初のz軸での回転は、点(x3, y3, z3)がxz平面に移動するように回転させます。(y座標=0になる)
次のy軸での回転は、その点が(1, 0, 0)に移動するように回転させます。
...続きを読む

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

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

Aベストアンサー

オイラー角による座標変換だと
任意の方向ベクトルを軸にした回転はややこしくなるので
四元数を使った座標変換がオススメです

参考URLを見て頂ければここに書くことはないと思います
(ただ私の知識がないだけですが...)

また、任意の点を中心に回転させたいなら
ゲタを履かせて座標変換してから、ゲタを取ればいいだけなので簡単にできるはずです

ゲタを履かせるの意味がわからないかも知れませんが
Aを中心にBを回転させるとすると
BからAを引き、平行移動させてAを原点に持ってきて
同じく平行移動させた(B-A)を回転させ、その結果(B-A)'にAを足してもう一度平行移動させて
ってことです、解るかな?
B → (B-A) → (B-A)' → (B-A)'+A

参考URL:http://staff.aist.go.jp/toru-nakata/quaternion.html

Q回転行列から角度を求める

3Dのプログラミングを行っていますが、ある物体から得た回転行列から、ラジアンの角度を得たいと思っています。

物体はx軸・y軸・z軸にそれぞれ未知の値で回転させられており、
この物体から得られる回転行列Rは3×3の行列として
|r11 r12 r13|
|r21 r22 r23|
|r31 r32 r33|
と与えられています。ここから、x軸・y軸・z軸にそれぞれ何度回転させられているのかを算出するにはどのようにすればいいでしょうか?

参考資料が少ないため、ご教授お願いいたしますm(_ _)m

Aベストアンサー

先ほどの回答はアルゴリズムが複雑なのでもっと簡単な方法を考えてみました。
|r11 r12 r13|
|r21 r22 r23|=A
|r31 r32 r33|
として固有ベクトル v、固有値 λに対して
(A-λE)v=0
なので固有値λ=1のときvは軸の方向なので、
|r11-1 r12  r13 |
|r21  r22-1 r23 |・v=0
|r31  r32  r33-1|
なので(ri1-1 ri2  ri3) (i=1~3)は軸の方向を向いたベクトルとvと直交します。
そこで、0でないベクトルを取ります(ここではaとします)。
この軸と直交したベクトルを行列Aで回転させて、b=Aa とします。
もとのベクトルaとbが成す角度を求めます。
b・a = |a|^2 cosθ、|b×a| = |a|^2 sinθなので、
θ=atan2(|b×a|, b・a)が求める角度になります。

どうでしょう。

Qfloat型とdouble型の変数の違いを教えてほしいです

float型とdouble型の変数の違いを教えてほしいです
2Dゲームを作っててdoubleの変数を使ってたんですが使ってはだめだと先輩に言われたんです。
理由を聞いたら、先生が「doubleは使わないほうがいい」と言われたらしくてちゃんとした理由がわかりませんでした。
それを知って何をするということではないんですが、気になって調べても出てこなかったので質問させてください。
まだゲーム作りを始めたばっかりでぜんぜん詳しくないですが教えてくれたら助かります。

Aベストアンサー

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速にできたり、と様々です。
32bitCPUでは、32bitのfloatの方が扱いやすいでしょうが、64bitCPUでは64bitのdoubleの方が扱いやすいかもしれません。
Cのmath.hで使える標準関数はdouble型のものがほとんどです。三角関数は2Dのゲームでも使う機会が多いのではないでしょうか。sinもcosもdouble型です。内部演算は当然doubleですので、変数にfloatを使ったからと早くはならず、むしろfloat型の変数に入れるときに暗黙の型変換が発生する分遅くなる可能性もあります。

そういった背景を考え検討した結果、floatを使う方がよい、と判断したのならいいのですが、「先生に言われた」では理由になりません。
聞けるのなら、その先生に理由を聞いてください。真意がわからないうちは、鵜呑みしないことです。

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速...続きを読む

Q同次変換について

前回の質問で同次変換とはどのようなものかおおよそ理解する事が出来ました。
追加質問したのですが、解決できないので新たに再質問させて頂きます。

前回の質問内容:http://oshiete.goo.ne.jp/qa/6934077.html


変換という言葉は理解できました。

同次変換とは、1次元多い行列で表現された変換をさす。
一次元多い理由は、並進を表すため。

数学的に定義される変換は、ユークリッド変換、アフィン変換、射影変換の
3つである。

ユークリッド変換についてよく理解できないので教えてください。
これは線形変換とは異なりますよね。線形変換であれば、並進は含みませんから。
アフィン変換は、線形変換に並進を加えたものだと認識しております。
アフィン変換とユークリッド変換の違いはなんでしょうか?
ユークリッド変換の方がアフィン変換より集合的に大きいことはわかるのですが・・・

また同次変換を、
X
Y
Z
1
と表している記述を良く見ます。
具体例を挙げると、
基準座標系を(x y z 1)、対象座標系(X Y Z 1)
と表す。

対象座標系は基準座標系をx軸にθ回転、x軸に3平行移動した
ものとする。

X x|1   0    0    3 |
Y= y|0  cosθ  sinθ  0 | 
Z  z|0  -sinθ  cosθ 0 |
1 1|0   0     0   1 |

のように表されると思います。

ここで、同次変換を
X
Y
Z
W
と表すとすると、変換行列の4列目は、どのようにあらわされるのでしょうか?
X x|1   0    0    ? |
Y= y|0  cosθ  sinθ  ? | 
Z  z|0  -sinθ  cosθ ? |
W ?|0   0     0   ?  |

以上、申し訳ありませんがご回答よろしくお願い致します。

前回の質問で同次変換とはどのようなものかおおよそ理解する事が出来ました。
追加質問したのですが、解決できないので新たに再質問させて頂きます。

前回の質問内容:http://oshiete.goo.ne.jp/qa/6934077.html


変換という言葉は理解できました。

同次変換とは、1次元多い行列で表現された変換をさす。
一次元多い理由は、並進を表すため。

数学的に定義される変換は、ユークリッド変換、アフィン変換、射影変換の
3つである。

ユークリッド変換についてよく理解できないので教えてください。
これは線形...続きを読む

Aベストアンサー

#2,#3です。

>ですから、正しく表現するには、
>(4×4)×(4×1)=(4×1)ですね。・・・(A)
>もしくは、
>(1×4)×(4×4)=(1×4)ですね。・・・(B)

>(A)の表現を採用します。
>基準座標系を(x y z 1):列ベクトル、対象座標系(X Y Z 1):列ベクトルとする。
>基準座標系をx軸にθ回転、x軸に3平行移動した同次変換は、
>(X) ( 1   0    0   0)(x)
>(Y)=(0 cosθ -sinθ  0)(y)
>(Z) ( 0 sinθ  cosθ  0)(z)
>(1) ( 3   0    0   1)(1)
>と表されると思います。
>
>ここまでで間違いはありますでしょうか?
間違っています。
(A)の表現を採用するといいながら、変換行列は(A),(B)の両方の表現が交じり合ってへんてこな行列になっています。(A)と(B)では行列の掛け算の順序が逆になります。

A#2の参考URLを参考にして下さい。
そしてお書きの変換行列方程式
X=
Y=
Z=
1=
を、行列を使わないで、4つの方程式として書き出して見て下さい。
本来の変換の式になっていることに気が付くと思います。
(A)と(B)の行列表現では、回転と平行移動の合成変換行列を計算する時の
行列の計算順序が逆になることは理解して見えるでしょうか?
おかしな合成行列をお書きなので同じ4x4行列でも行列の掛け算の順序を
逆にして見えないかと危惧してます。

#2,#3です。

>ですから、正しく表現するには、
>(4×4)×(4×1)=(4×1)ですね。・・・(A)
>もしくは、
>(1×4)×(4×4)=(1×4)ですね。・・・(B)

>(A)の表現を採用します。
>基準座標系を(x y z 1):列ベクトル、対象座標系(X Y Z 1):列ベクトルとする。
>基準座標系をx軸にθ回転、x軸に3平行移動した同次変換は、
>(X) ( 1   0    0   0)(x)
>(Y)=(0 cosθ -sinθ  0)(y)
>(Z) ( 0 sinθ  cosθ  0)(z)
>(1) ( 3   0    0   1)(1)
>と...続きを読む

Qエクセル STDEVとSTDEVPの違い

エクセルの統計関数で標準偏差を求める時、STDEVとSTDEVPがあります。両者の違いが良くわかりません。
宜しかったら、恐縮ですが、以下の具体例で、『噛み砕いて』教えて下さい。
(例)
セルA1~A13に1~13の数字を入力、平均値=7、STDEVでは3.89444、STDEVPでは3.741657となります。
また、平均値7と各数字の差を取り、それを2乗し、総和を取る(182)、これをデータの個数13で割る(14)、この平方根を取ると3.741657となります。
では、STDEVとSTDEVPの違いは何なのでしょうか?統計のことは疎く、お手数ですが、サルにもわかるようご教授頂きたく、お願い致します。

Aベストアンサー

データが母集団そのものからとったか、標本データかで違います。また母集団そのものだったとしても(例えばクラス全員というような)、その背景にさらならる母集団(例えば学年全体)を想定して比較するような時もありますので、その場合は標本となります。
で標本データの時はSTDEVを使って、母集団の時はSTDEVPをつかうことになります。
公式の違いは分母がn-1(STDEV)かn(STDEVP)かの違いしかありません。まぁ感覚的に理解するなら、分母がn-1になるということはそれだけ結果が大きくなるわけで、つまりそれだけのりしろを多くもって推測に当たるというようなことになります。
AとBの違いがあるかないかという推測をする時、通常は標本同士の検証になるわけですので、偏差を余裕をもってわざとちょっと大きめに見るということで、それだけ確証の度合いを上げるというわけです。


人気Q&Aランキング