プロが教える店舗&オフィスのセキュリティ対策術

変換行列に関して質問させて頂きます。
当方、行列に関する理解が乏しいので基礎を勉強し直しました。

前回、同次変換に関して質問させて頂きました。
URL:http://oshiete.goo.ne.jp/qa/6983574.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)の
表現で良いと考えているのですがどうでしょうか?


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

「行列 変換行列 行列の積」の質問画像

A 回答 (5件)

#2,#4です。



A#4の補足について

理解できたようですね。

>つまり、列ベクトルを使う場合は変換行列も列成分に
示し、行ベクトルを使う場合は変換行列は行成分に
示さなければならないのですね。

その通りです。
行列とベクトルとの積の順序も逆になりますね。

>列ベクトルでの同次変換行列は、
>[1,0,0,3]
>[0,cos(s),-sin(s),0]
>[0,sin(s),cos(s),0]
>[0,0,0,1]
-----------------------------
>(1×4)=(1×4)(4×4):
>行ベクトルでの同次変換行列は、
>[1,0,0,0]
>[0,cos(s),sin(s),0]
>[0,-sin(s),cos(s),0]
>[3,0,0,1]
>となるのですね。
その通りです。

>一次変換の式も理解できました。
>これに対して、私が作った行列の計算結果は間違いであることも
>理解できました。
>ちゃんと展開して計算すれば、列ベクトルの場合は列成分にしなければ
>ならない事がわかりました。

理解されたようでおめでとう。Cogratulations!!
    • good
    • 0
この回答へのお礼

はい。理解できました。
ご回答本当にありがとうございました。

お礼日時:2011/10/18 20:22

#2です。



A#2の補足質問について

>ベクトルをx軸中心にθ回転した回転行列のつくり方が間違っているのでしょうか?
そう、間違っています。
質問者さんの回転行列を使って、ベクトルを実際に回転して見てください。
x軸のまわりにθだけ時計回り(θの負の方向)に回転し回転が逆になります。
[x] [s]
[y}=[s]
[z} [s]
(s=0~1)
、θ=π/3(=60°)として計算してみて下さい。
質問さんの回転行列で計算した
[X] [s]
[Y]=[(1+√3)s/2]
[Z} [(1-√3)s/2]
をプロットするとベクトルが逆回転(時計回りに回転)したことが確認できます。

ではどこが間違ったのかというと
>x軸周りなので(1 0 0)…(●):x軸単位方向ベクトルはそのまま。
>(0 1 0):y軸単位方向ベクトルをx軸まわりにθ回転すると、
>(0 1 0)→(0 cosθ sinθ)…(☆)

>(0 0 1):z軸単位方向ベクトルをx軸まわりにθ回転すると、
>(0 0 1)→(0 -sinθ cosθ)…(★)

>これより回転行列をつくるわけですが、
~ここから~
>列ベクトルに掛けるので、
>変換行列はそれぞれ作った
>単位方向ベクトルを行成分に書いて
~ここまで~
が間違っています。
////////////////////////////////////////////////
(●)のベクトルの成分は全てx成分に掛けるベクトル、
(☆)のベクトルの成分はy成分に掛けるベクトル、
(★)のベクトルの成分はz成分に掛けるベクトル、
なのでそれぞれ、順に回転行列の第一列、第二列、第三列に入れて回転行列を
構成してやらないと駄目です。
/////////////////////////////////////////////////

>(X)  (1   0    0   ) (x)  
>(Y)= (0  cosθ  sinθ  ) (y) 
>(Z)  (0  -sinθ  cosθ ) (z) 
>としました。
↑間違いです。θ=π/3など入れてx=y=z=1としてみて下さい。逆回転(時計方向に回転)します。
~↓これが間違い。列成分としないと駄目です。~
>なぜ、行成分としたかは行列の積が横×縦のような計算方法だからです。
「行列の積が横×縦のような計算方法だから」が間違い。
意味を考えないで、形だけに囚われた発想をするから、間違うのです。
上の////////と////////で囲まれた範囲に書いたように考えてください。

質問者さんの考えと違うなら、ちゃんと簡単な実例で確認するなり、
なぜ↓のようにすべきかを回転行列や行列を書き下した一次変換の式
X=x
Y=ycosθ-zsinθ
Z=ysinθ+zcosθ
で確認すれば、間違いに気付くと思いますがね。
「info22様のご回答では変換行列は行成分ではなく列成分(縦)に
それぞれの方向成分を書いていると思います。」

だから、間違うのです。簡単なベクトル(x,y,z)とθで行列要素の積の意味を
考えながら計算し、回転後のベクトルを三次元プロットしてみれば間違いに
気付くはずです。、
(●),(☆),(★)のベクトル(成分)を回転行列の<<行成分でなく列成分>>として取り込まないと駄目でしょう。

この回答への補足

ご回答ありがとうございます。
理解できました。

おっしゃる通り私の行列では逆回転になりました。
すいません。ちゃんと行列を展開して計算すれば、
列成分にしなければならないことがわかりました。

つまり、列ベクトルを使う場合は変換行列も列成分に
示し、行ベクトルを使う場合は変換行列は行成分に
示さなければならないのですね。

列ベクトルでの同次変換行列は、
[1,0,0,3]
[0,cos(s),-sin(s),0]
[0,sin(s),cos(s),0]
[0,0,0,1]

(1×4)=(1×4)(4×4):
行ベクトルでの同次変換行列は、
[1,0,0,0]
[0,cos(s),sin(s),0]
[0,-sin(s),cos(s),0]
[3,0,0,1]
となるのですね。


一次変換の式も理解できました。
これに対して、私が作った行列の計算結果は間違いであることも
理解できました。
ちゃんと展開して計算すれば、列ベクトルの場合は列成分にしなければ
ならない事がわかりました。

>意味を考えないで、形だけに囚われた発想をするから、間違うのです。
おっしゃる通りですね。ご指摘ありがとうございました。

補足日時:2011/10/18 14:47
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/01/14 13:03

#1です。

失礼しました。座標系をθ回すのではなく,ベクトルをθ回すケースですね。#2さんが正しいです。
    • good
    • 0

>右手系を採用してベクトルをx軸中心にθ回転した回転行列は、


>(1   0     0   )
>(0  cosθ  sinθ  )
>(0  -sinθ  cosθ )
>と表します。

これはベクトルを行ベクトルとして扱う場合のx軸の周りにθだけ回転した時の
回転行列です。列ベクトルを使われるようなので間違いです。

列ベクトルを用いる場合の回転行列は
(1   0     0   )
(0  cosθ  -sinθ  )
(0  sinθ  cosθ )
です。

>(X)  (1   0     0   ) (x)  
>(Y)= (0  cosθ  sinθ  ) (y) 
>(Z)  (0  -sinθ  cosθ ) (z)
>と表されると思います。

間違いです。

正しくは以下の通りです。

(X)  (1   0     0   ) (x)  
(Y)= (0  cosθ  -sinθ  ) (y) 
(Z)  (0  sinθ  cosθ ) (z) 

行列を普通の式に書き直すと
X=x
Y=ycosθ-zsinθ
Z=ysinθ+zcosθ
となります。

>x軸に3移動した場合を4行×4列の変換行列
>で示す場合、どのように書けば良いのでしょうか?
>添付画像の(A)と(B)どちらでしょうか?

(A)は間違い。
(B)はx軸のまわりの回転行列が前半で書いたように間違っていますのその箇所を
訂正すれば正しい表現になります。

以下、丸括弧( )は [ ]を使い、行列要素はカンマ「,」で区切って書くこと
にします。

x軸のまわりθだけ反時計周りに回転する回転行列をM1,
x軸の正方向に3だけ並進する移動行列をM2とおくと
M1=
[1,0,0,0]
[0,cos(s),-sin(s),0]
[0,sin(s),cos(s),0]
[0,0,0,1]

M2=
[1,0,0,3]
[0,1,0,0]
[0,0,1,0]
[0,0,0,1]
とまります。
x軸のまわりにθだけ回転した後、x軸正方向に3だけ並進する変換行列Mは
M=M2*M1=
[1,0,0,3]
[0,cos(s),-sin(s),0]
[0,sin(s),cos(s),0]
[0,0,0,1]
となります。

変換後のベクトルは
[X]
[Y]=
[Z]
[1]

[x]
M[y]
[z]
[1]
となります。

行列表現を書き下すと
X=x+3,
Y=ycosθ-zsinθ,
Z=ysinθ+zcosθ
となります。

この回答への補足

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

ベクトルをx軸中心にθ回転した回転行列のつくり方が間違っているのでしょうか?

x軸周りなので(1 0 0):x軸単位方向ベクトルはそのまま。

(0 1 0):y軸単位方向ベクトルをx軸まわりにθ回転すると、
(0 1 0)→(0 cosθ sinθ)

(0 0 1):z軸単位方向ベクトルをx軸まわりにθ回転すると、
(0 0 1)→(0 -sinθ cosθ)

これより回転行列をつくるわけですが、列ベクトルに掛けるので、
変換行列はそれぞれ作った単位方向ベクトルを行成分に書いて
(X)  (1   0     0   ) (x)  
(Y)= (0  cosθ  sinθ  ) (y) 
(Z)  (0  -sinθ  cosθ ) (z) 
としました。
なぜ、行成分としたかは行列の積が横×縦のような計算方法だからです。

info22様のご回答では変換行列は行成分ではなく列成分(縦)に
それぞれの方向成分を書いていると思います。

本当に申し訳ないのですが、ご指摘よろしくお願い致します。

補足日時:2011/10/17 23:00
    • good
    • 0

>右手系を採用してベクトルをx軸中心にθ回転した回転行列は、


>(X)  (1   0     0   ) (x)  
>(Y)= (0  cosθ  sinθ  ) (y) 
>(Z)  (0  -sinθ  cosθ ) (z) 
質問者さんの答えで正しいです。

>例えば、x軸に3移動した場合を4行×4列の変換行列
>添付画像の(A)と(B)どちらでしょうか?
(A)は誤り,(B)が正しいです。
右辺の行列の積を成分で書くと,
(A)では
X=x
1=3x+1
(B)では
X=x+3
1=1
となるからです。(Y,Zは省略)
    • good
    • 0

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