ワールド座標変換 World Transform of LocalCoordenate
ワールド座標変換について
前回、ジオメトリックパイプラインの概要を説明しました。
其の時に、ローカル座標系 → ワールド座標系へ頂点を移動させることを
ワールド座標と言いましたね。
もう一度、確認のために述べます。
ワールド座標変換の目的とは、
ローカル座標系で座標(0,0)を中心として作ったポリゴンを、
様々なポリゴンが存在している、ワールド(グローバル)座標系へと
回転・移動させることです。
頂点座標の行ベクトル・列ベクトル
では、ローカル座標系からワールド座標系へ移動するための、
計算式を見て行きましょう。
3Dは三次元でそれぞれX(横)、Y(縦)、Z(奥行き)で表されるため、
とある座標があるとすれば、頂点A(432,523,669)等と言った表し方が出来ます。
これを行ベクトルに直すと、
|432,523,669|
列ベクトルだと、
|432|
|523|
|669|
と表すことが出来ます。
前にも述べたとおり、
最終的なベクトル座標の割り出しは、転置マトリックス × 列ベクトル
で導き出します。
ですので、ここからは列ベクトルとして座標を表すことにします。
|x|
|y|
|z|
座標変換計算において、マトリックスは必須の数学です。
そして、このマトリックスの性質上により、
頂点ベクトルは4要素のベクトルとして扱わなければなりません。
ですので、実際計算する時は、四次元計算になります。
|x|
|y|
|z|
|t|
四番目の要素tは頂点に移動を与えるためのマトリックスを作る時に
関係してくる要素です。
ただ、ベクトル第四要素tは変動させてはいけません。
定数1のまま固定することが条件です。
詳しいことは、後々説明します。
計算順序
マトリックス同士の掛け算は、置換をすると値が変動することは
行列計算の項で述べたと思います。
マトリックス同士の掛け算の順序を間違えると、
変な値になることがあります。
ですので、十分注意しながらプログラムを組んでください。
今からざっと、5つのマトリックスを掛けますが、
これにも順序があり、順番を間違えると結果の値が違います。
X軸回転マトリックス
Y軸回転マトリックス
Z軸回転マトリックス
移動量マトリックス
スケーリングマトリックス
これを掛け合わせる順序は、
スケーリングマトリックス |
× |
Y軸回転マトリックス |
× |
X軸回転マトリックス |
× |
Z軸回転マトリックス |
× |
移動量マトリックス |
ここで注目して欲しいのが、
Y軸回転マトリックスが一番先頭に来ていることです。
深くは考えなくて良いので、Y X Zと掛け合わせることと
覚えておけばOKです。
注意しなければならないのは、
移動量マトリックスを回転マトリックスの前にしないことです。
重心が0,0で回転するので、
移動して、回転させるとポリゴンが思った位置に来てくれません。
下の図を見てください。
置換した掛け算が成り立たないのがわかります。
このように、結果が違うので掛け算は
Y軸回転・X軸回転・Z軸回転・移動量
これより置換を行わないでください。
例外的にスケーリング処理については何処に入れても一緒です。
回転マトリックスの生成
実際にY,X,Zについての回転マトリックスを作って見ましょう。
θは回転角を表しています。
Y軸回転マトリックス
| cosθ, 0, -sinθ, 0| X軸についての移動量
| 0, 1, 0, 0| Y軸についての移動量
| sinθ, 0, cosθ, 0| Z軸についての移動量
| 0, 0, 0, 1| 頂点の相対移動量
X軸回転マトリックス
| 1, 0, 0, 0| X軸についての移動量
| 0, cosθ, sinθ, 0| Y軸についての移動量
| 0, -sinθ, cosθ, 0| Z軸についての移動量
| 0, 0, 0, 1| 頂点の相対移動量
Z軸回転マトリックス
| cosθ, sinθ, 0, 0| Y軸についての移動量
| -sinθ, cosθ, 0, 0| X軸についての移動量
| 0, 0, 1, 0| Z軸についての移動量
| 0, 0, 0, 1| 頂点の相対移動量
これらを見ると、
Y軸回転の場合、Y要素だけが変化しません。
X軸の場合も同様X要素が固定して、他の要素に変化を与えてます。
ただし、第四要素だけは影響を及ぼしません。
移動マトリックスの生成
移動マトリックス
| 1, 0, 0, 0| Y軸についての移動量
| 0, 1, 0, 0| X軸についての移動量
| 0, 0, 1, 0| Z軸についての移動量
| Tx, Ty, Tz, 1| 頂点の相対移動量
これは、回転し終わったポリゴンをワールド座標系の何処に配置するか
という移動用マトリックスです。
例えば、(15067,15533,59933)に配置したい場合以下のようにマトリックスを
生成します。
| 1, 0, 0, 0| Y軸についての移動量
| 0, 1, 0, 0| X軸についての移動量
| 0, 0, 1, 0| Z軸についての移動量
| 15067, 15533, 59933, 1| 頂点の相対移動量
四次元でマトリックスやベクトルを扱う理由はここです。
移動の時に四次元マトリックスを使うため、
四次元で処理するのです。
以上のマトリックスを生成したら、
全て掛け合わせ、
最後に出来たマトリックスを転置マトリックスにして、
列ベクトルと掛け算をします。
これでワールド座標変換の計算は終了です。
ワールド座標変換については以上です。