まず基準となる座標系(X, Y, Z)を定めます。え〜すっかり書き忘れてましたが、
ある座標系狽、その座標軸をX, Y, Z、原点をOとして、
という感じで表記します。原点が重要でない場合は原点の表記を省略します。
また、ベクトルA = ( A
x A
y A
z )が狽基準とした座標で表されていることを強調したい場合、
A()という表記を用いることにします。
では話を戻して。
基準となる座標系(X, Y, Z)と、もうひとつ別の座標系'(X'(), Y'(), Z'())を定めます。
'の原点O'は、念と一致しているとします。また、簡単のため各座標軸は単位ベクトルになっているとします。
さてある点P() = (P
x P
y P
z)を'を基準として見ると、Pの座標P(')はどうなるでしょうか?
簡単のため2Dで考えると次図のようになります。

(図1-6.1)
(X, Y)からみたPの座標(P
x P
y)というのは、PのX, Yへの射影となります。
同様に、'(X', Y')からみたPの座標(P
x' P
y')は、PのX', Y'への射影となりますね。
ここで
ベクトルの内積を思い出してください。内積は射影を表すということでした。
各座標軸は単位ベクトルであるとしているので、'からみたPの座標は、
Px' = P()・X'()
Py' = P()・Y'()
|
で表せることになります。3次元でも同様です。
PおよびX', Y'は、狽基準としていることを忘れないでください。
また、この座標変換はPの位置を変えているのではないということに注意してください。
(P
x P
y)と(P
x' P
y')は異なる座標となるでしょうが、両方とも同じ点Pを表しています。
同じ点でも基準となる座標系によって異なる座標で表されるということです。
さてそろそろ行列に再登場していただきます。
ベクトルと行列の積(式1-4.4)を思い出してください。
P()からP(')への変換は、P()と'()の各軸との内積で表せるということでした。
これを行列を用いて書くと、

(式1-6.1)
となります。(X'() Y'() Z'())は'()の各軸を列ベクトルとする行列です。
ひらたくいうと、
|
P()からP(')への変換は、P()に'()の座標軸を列ベクトルとした行列を掛ける
|
ということになります。
逆に'から狽ヨの変換はどうでしょうか? つまり、()、'()、P(')が既知で、P()を求めたい場合です。
この場合、(')が分かれば(式1-6.1)でP()が求められます。まずは()の各軸を'に変換しましょう。
()は狽基準とした狽フ座標軸なので、当然X = (1, 0, 0), Y = (0, 1, 0), Z = (0, 0, 1)です。
これを(式1-6.1)に従って変換すると、

(式1-6.2)
となります。ここでX'
xなどは、X'()のx成分などを指すとします。
あとは(')の各軸を列ベクトルとする行列ををつくり、それをP(')に掛ければP()が求まります。
では実際に行列を作ってみましょう。

(式1-6.3)
あらやだ。(')を行ベクトルとする行列になってしまいました。結局、
|
P(')からP()への変換は、P(')に'()の座標軸を行ベクトルとした行列を掛ける
|
ということになります。
ここで、(')を列ベクトルとする行列をM
c、行ベクトルとする行列をM
r、
P()とP(')をそれぞれP、P'と書くことにして、
PMcMr
というのを考えてみましょう。PM
c = P'ですから上式はP'M
rとなり、
P'M
r = Pなんで結局
PMcMr = P
になります。"P()を'に変換したものを狽ノ変換"すれば元に戻って当然です。
さてここで行列の積では結合法則( (AB)C = A(BC) )が成り立つことを思い出してください。
すると上式は
P(McMr) = P
と書けます。Pに(M
cM
r)を掛けてもPのままということは、
(M
cM
r)は単位行列Eであることになります。さらに、
McMr = E
であるということは、M
rはM
cの逆行列M
c-1であることを意味します。
見方をかえると、逆行列M
-1はMの逆変換を表すということがいえます。
ん…? M
rはM
cの行と列を入れ替えたものといえますよね。つまり転置行列です。
ということは、M
t = M
-1ということか?
はい、この場合はそうなります。ただし一般に成り立つわけではありません。
M
t = M
-1が成り立つ行列を直交行列といい、上でやった
"直交座標軸方向の単位ベクトルを列(行)とする行列"というのは直交行列になってます。
この直交行列というのは3Dプログラムで頻繁に使うので、その逆行列は転置行列に等しいというのは覚えておきましょう。
座標変換をちょっと違う視点でみてみましょう。やっている計算はおんなじです。
座標系煤A座標系'と点Pがあるとし、狽ニ'は最初は一致しているとします。
このときはP() = P(')となります。
この状態から点Pを'に固定して、つまりP(') = 一定として'をθだけ回転させます。

(図1-6.2)
P
rot(')は一定ですが、狽ゥらみたP
rot、つまりP
rot()はθだけ回転していることが分かります。
P
rot()は、回転後の'()が何らかの方法で分かればそれを行ベクトルとした行列Mを用いて
で求められます。この行列Mは回転を表しているとみることができます。
以後この手の行列を回転行列と呼ぶことにします。
もう少し具体的な例をあげると、例えばZ(0, 0, 1)を前方向、Y(0, 1, 0)を上方向として作られた
ポリゴンモデルがあるとします。で、こいつをXZ平面で回転させてある方向A(XZ平面上のベクトルとする)に向かせたいとします。
XZ平面の回転なのでYは(0, 1, 0)を、Zは向かせたい方向Aの単位ベクトルを使用し、
XはY×Zで求めます。このXYZを行ベクトルとした回転行列Mをつくり
ポリゴンモデルの各頂点に掛けてやれば、モデルは方向Aを向くことになります。
この例で考えると、回転行列はモデルの向きを表していると見ることができます。
というわけで久しぶりの
サンプルプログラムです。
別にスペースを埋めるための苦肉の策ではありません。つうかスペースを埋める必要は無いし。
動作環境と操作方法は今までのサンプルと同様です。
スペースキーを押しながら青い球をドラッグすると座標軸が回転します。何も押さずにドラッグするとカメラ操作です。
座標軸を回転させると一緒にモデル(楕円柱)も回転します。
回転させてもモデル(楕円柱)の座標軸に対する相対的な関係は変化していないことに注意してください。