在宅ワークのリアルをベテランとビギナーにインタビュー>>

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

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

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

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

「回転した座標軸と一致させるための回転軸と」の質問画像

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

A 回答 (8件)

というかそのままでいいのか。

バカだ。。。。

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

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

この回答への補足

ありがとうございます。

分かりました、回転行列さえ分かれば、そこからオイラー角を求めるのは簡単なのは理解しました。
http://www7.atwiki.jp/lucifer/pages/13.html

で、その回転行列は、単純に
(θxX, θyX, θzX)
(θxY, θyY, θzY)
(θxZ, θyZ, θzZ)
である…。

最初に知りたがってた任意軸回転の解についても、オイラー角が求まれば、そこから任意軸回転を求められそうです。

とりあえずこれで解決しそうですが、まだ自分の勘違いがあるかもなのでプログラム上でも完全に動作したことを確認してから締め切ります。(明日以降になりそうです)

補足日時:2014/07/04 13:47
    • good
    • 0
この回答へのお礼

オイラー角を使った方法により無事に解決できました。

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

お礼日時:2014/07/06 15:50

さらにもうひとつ。


回転軸の方向余弦が求まれば
ロドリゲスの公式から
cosθとsinθが
求まりますね。

#θ:回転角

この回答への補足

何度もありがとうございますm(_ _)m

そういえば、色々調べてたらその公式の記述も見かけました。
色々な方法があるようで面白いです。

それも試してみようと思います。

そろそろ回答締め切ります。

補足日時:2014/07/06 15:32
    • good
    • 0
この回答へのお礼

とりあえず、オイラー角を使った方法で無事に解決できました。
1回の軸回転(任意軸回転)による方法についてはまだ出来ていませんが、たくさんのアドバイスを頂戴しましたので、後は自分で調べるなりして分かりそうです。

3度回転するよりも1度で終わればやはり美しいので、この方法も十分に理解して実装できるよう頑張ってみます。

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

お礼日時:2014/07/06 15:55

ANO6 です。

もうちょっと考えてみました。

回転軸は回転によって変化しないから

回転行列をM 回転軸を W とすれば

MW=W=EW (E:単位行列)

(M-E)W=0

なので、W は M-E のうち、一次独立な行ベクトルを2本選び
外積をとれば得られます。適当に2本選んで外積とって
零ベクトルになっちゃったら、別の2本を選ぶでよろしいかと。

角度は前に示した方法で求まりますが、もっと簡単な方法は無いかな?
    • good
    • 1
この回答へのお礼

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

お礼日時:2014/07/06 15:59

ANO5です。



回転軸を回転しても長さは変わりませんから固有値=1の固有ベクトルということに
なりますね。

とすると固有方程式を解くまでもないので、固有ベクトルは簡単にもとまります。
回転軸に対する回転量は、回転軸に垂直なベクトルを用意すれば計算できます。

もっとスマートな方法があるかもしれませんが・・・
    • good
    • 0
この回答へのお礼

回転行列Rの固有ベクトルは(m32 - m23, m13 - m31, m21 - m12)で、良さそうな感じです。

角度については、行列のトレースが固有値の総和であることからtrace[R] = 1 + 2cosθ
よって、θ=ArcCos((trace[R] - 1) / 2)
で、求まるという記述がありました※。実際に実装して動作確認できました。
なぜそういう求め方で良いのか、自分にはまだよく分かりませんが…(^-^;)

もっと勉強してがんばって理解します。

※引用
http://www.rugbysensor.com/motion_cluc..html

お礼日時:2014/07/07 20:20

ちゃんとした答を示せませんが


回転軸方向のベクトルは
回転で変化しないから
回転行列の固有ベクトル
ですよね。

この回答への補足

回答ありがとうございますm(_ _)m

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

勉強になりました。

補足日時:2014/07/05 10:44
    • good
    • 0

いや,座標回転行列が直接得られるのでオイラー角なんていらないんじゃない?という意味なんですが。

サブルーチンなんか使わずに直接行列計算したらいいんじゃないの。まあ,詳細がわからないのでなんともいえませんが。

この回答への補足

あ、そういうことですか。
回転行列が分かっても動かせないんです。説明不足でした。

OpenGLとかDirectXとかなら、自分で回転行列使って回せますけど、別の開発環境になっていまして、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数とか、限られたものしか、無いんですよ~(;_;)

あとさっきの補足に書いた回転行列は縦と横が逆だったかもということは気づいています(^-^;)

回答助かりますm(_ _)m

補足日時:2014/07/04 15:58
    • good
    • 0

やったことないけど,



(オイラー角を使った回転行列の11要素) = cos(θxX)

みたいなのが9個あるんでしょ。
これを解いて三つのオイラー角が一意に決まるんじゃないの?

この回答への補足

あ、θxXってそういうことなんですか…。
ちょっと、高校数学IIB+α程度の知識しか無く行列に不慣れで…。

まだよく分かってませんが連立すれば解けそうな気はしました。
少し時間をください。

補足日時:2014/07/04 13:08
    • good
    • 0

点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
を計算します。

この回答への補足

回答ありがとうございますm(_ _)m
回答していただいた内容は理解できました。

回転行列が分かると、オイラー角を算出するのは簡単そうだというのが分かってきました。
もう少し時間をください。

補足日時:2014/07/04 13:31
    • good
    • 0
この回答へのお礼

無事に解決できました。

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

お礼日時:2014/07/06 15:49

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

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

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

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)が求める角度になります。

どうでしょう。

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)に移動するように回転させます。
...続きを読む

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) 方向へ移す回転とは、当然異なる訳です。
その辺を反省して、何が求めたいのか
再考することからではないでしょうか。

Qオイラー角 回転行列

オイラー角 回転行列

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


工学や物理学で使われるオイラー角の回転順序は
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軸回転をγで表して
いるという事なのでしょうか?

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

オイラー角 回転行列

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


工学や物理学で使われるオイラー角の回転順序は
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

です。
それぞれのθが...続きを読む

Aベストアンサー

>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や線形代数の教科書(同次変換はアフィン変換の特殊な場合です)などで調べてみてください.

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

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

回転軸ベクトルは,回転軸方向のベクトル,と書くつもりでした….すみま...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

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

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

3次元のシミュレーションの勉強をしています。

3次元の座標変換で
x,y,z:変換前の座標;
x',y',z':変換後の座標;
θ:回転する角度;
lx,ly,lz:平行移動量;
としたとき、

X軸に関する回転
             |10   0    0|
             |0cosθ sinθ 0|
[x' y' z' 1] = [x y z 1]|0-sinθ cosθ0|
             |00   0   1|
Y軸に関する回転
             |cosθ0-sinθ0|
             |0   10   0|
[x' y' z' 1] = [x y z 1]|sinθ0cosθ0|
             |0   00   1|
Z軸に関する回転
             |cosθ sinθ 00|
             |-sinθcosθ00|
[x' y' z' 1] = [x y z 1]|0   0   10|
             |0   0   01|
平行移動
             |10 0 0|
             |01 0 0|
[x' y' z' 1] = [x y z 1]|00 1 0|
             |lxly 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次元のシミュレーションの勉強をしています。

3次元の座標変換で
x,y,z:変換前の座標;
x',y',z':変換後の座標;
θ:回転する角度;
lx,ly,lz:平行移動量;
としたとき、

X軸に関する回転
             |10   0    0|
             |0cosθ sinθ 0|
[x' y' z' 1] = [x y z 1]|0-sinθ cosθ0|
             |00   0   1|
Y軸に関する回転
             |cosθ0-sinθ0|
             |0   10   0|
[x' y' z' 1] = [x y z 1]|si...続きを読む

Aベストアンサー

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}]

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, ...続きを読む

Q二点の座標から角度を求めるには?

2点の座標A,Bの角度を求めたいのですが,たとえばA点(0,0)とB点(4,3)を結ぶラインは、底辺Bxと高さByを元に三角関数?から30度と求められますが、B点がマイナス座標が絡んできた場合などの90度から359度までをどう求めていいか悩んでいます。また、A点も(0,0)に限定されるわけではないので、ますます混乱しています。どう考えればよいのか教えていただきたいのですが
(水平はX軸プラス方向が0度です)

Aベストアンサー

>2点の座標A,Bの角度を求めたい~・・・・

このままなら答えは0ですけど?

xy座標で、x軸のプラス方向を0度とし、
2点の座標A、Bにより形成される線ABとx軸との角度
ってことですね。

>たとえばA点(0,0)とB点(4,3)を結ぶラインは、底辺Bxと高さByを
>元に三角関数?から30度と求められますが、

sen-senさんの書かれたとおり、これは間違いです。
この場合、Bからx軸へのばした垂線とx軸との交点をCとすると、
三角形ABCができ、そのときの求めたい角度をθとすると、
tanθ=3/4となります。
よって、θ=36.8698...
となります。

>B点がマイナス座標が絡んできた場合などの90度から359度までを
>どう求めていいか悩んでいます。また、A点も(0,0)に限定される
>わけではないので、ますます混乱しています。
>(水平はX軸プラス方向が0度です)

常にx軸のプラス方向が0度でしたら、
1.第一象限にある場合は90度足す。
2.第二象限にある場合はそのまま。
3.第三象限にある場合は270度足す。
4.第四象限にある場合は180度足す。
とすればいいのでは?

簡単な例として、x軸と点A(0,5)と点B(-3,7)によって形成される
線ABとの間の角度は・・・・

まず、図を描いてみると点Bは第一象限にあるので、
最後に求めた角度に90度足せばいいだけです。
さっきと同じように直角三角形を作成します。
すると点Cの座標は(0,7)となります。
辺ABと辺ACとの間の角度は、tanθ=3/2
θ=56.3
以上より、x軸(に水平な線)と線ABとの間の角度は146.3度となります。

こんな感じでいいのでは?

>2点の座標A,Bの角度を求めたい~・・・・

このままなら答えは0ですけど?

xy座標で、x軸のプラス方向を0度とし、
2点の座標A、Bにより形成される線ABとx軸との角度
ってことですね。

>たとえばA点(0,0)とB点(4,3)を結ぶラインは、底辺Bxと高さByを
>元に三角関数?から30度と求められますが、

sen-senさんの書かれたとおり、これは間違いです。
この場合、Bからx軸へのばした垂線とx軸との交点をCとすると、
三角形ABCができ、そのときの求めたい角度をθとすると、
tanθ=3/4...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング