三次元グラフィック(浮動小数版) [ThreeD]


1. ◆ 三次元座標変換、三次元クリッピング

変換を高速に行うために、変換の内容をあらかじめ数式で計算しておき、 できた変換行列をプログラミングします。

三次元変換は、

  1. オブジェクト固有のボディ座標系をワールド空間に配置した ワールド座標系
  2. さらに視野変換した視点座標系
  3. さらに変換したクリッピング座標系
  4. さらに透視変換した透視座標系
  5. さらにビュー&ウィンドウ変換したスクリーン座標系、
の順番で描画すべき座標を計算します。

プログラムでは、以下のように処理が分かれます。

  1. オブジェクトごとに、ボディ座標系からワールド座標系へ
  2. 全ポリゴンを、ワールド座標系からクリッピング座標系へ
  3. 全ポリゴンを、クリッピング
  4. 全ポリゴンを、クリッピング座標系からスクリーン座標系へ
クリッピングしない場合(あらかじめ視野に入ったデータを作る場合)は、 以下のように処理が分かれます。
  1. オブジェクトごとに、ボディ座標系からワールド座標系へ
  2. 全ポリゴンを、ワールド座標系からスクリーン座標系へ


1-1. 変換行列

(x,y,z,w) * T1 * T2 = (X,Y,Z,W)

xyzw
*
xXxYxZxW
yXyYyZyW
zXzYzZzW
wXwYwZwW
=
XYZW

同じ座標系においてある点の座標を変換する場合と、 同じ位置の座標に対して座標系を変換する場合では、 逆変換の関係があります。
(x,y,z,w)の右側に行列をかける場合と、左側にかける場合では、 同じ変換でも行列が異なり、転置(行と列を交換した行列)の 関係があります。


1-2. 平行移動変換

1-2-1. CAD工学 p69

(x,y,z,w) * Move(x,y,z) = (X,Y,Z,W)

xyzw
*
1000
0100
0010
xyz1
=
XYZW


1-3. 回転変換

1-3-1. CAD工学 p67

X 軸まわり:(x,y,z,w) * RotX(θ) = (X,Y,Z,W)
Y 軸まわり:(x,y,z,w) * RotY(φ) = (X,Y,Z,W)
Z 軸まわり:(x,y,z,w) * RotZ(α) = (X,Y,Z,W)
座標系は右手座標系、 角度は軸に対して右ねじ方向を正とする。

xyzw
*
1000
0cos θsin θ0
0-sin θcos θ0
0001
=
XYZW

xyzw
*
cos φ0-sin φ0
0100
sin φ0cos φ0
0001
=
XYZW

xyzw
*
cos αsin α00
-sin αcos α00
0010
0001
=
XYZW

sin, cos は、角度から求めなくても、Y成分/斜辺長, X成分/斜辺長 から計算することができます。

Y 軸回転の sin の符号が逆な理由は、 Y 軸から見て Z→X が右ねじ方向なためです。 (X 軸から見たら Y→Z, Z 軸から見たら X→Y が右ねじ方向)


1-4. 視野変換

1-4-1. CAD工学 p100

ワールド座標系から視点座標系への変換です。
(x,y,z,w) * View(xf,yf,zf,β,α) = (X,Y,Z,W)
View(xf,yf,zf,β,α) = Move(-xf,-yf,-zf) * RotY(-α) * RotX(-β)

xyzw
*
cosαsinα*sinβ-sinα*cosβ0
0cos βsin β0
sinα-cosα*sinβcosα*cosβ0
-xf*cosα-xf*sinα -xf*sinα*sinβ-yf*cosβ+zf*cosα*sinβ xf*sinα*cosβ-yf*sinβ-zf*cosα*cosβ 1
=
XYZW


1-5. 透視変換

1-5-1. CAD工学 p74, p102

視点座標系から透視座標系への変換です。
(x,y,z,w) * Through(h) = (X,Y,Z,W)
h = xy平面を投影面としたときの視点の Z座標

xyzw
*
1000
0100
002-1/h
00h0
=
XYZW


1-6. 正規化透視変換

1-6-1. CAD工学 p104

変換後の透視座標系の値が次の範囲に収まるようにする変換です。

正規化された x, y は、スクリーン座標系に変換するのが 容易になります。正規化された z は、Z バッファの深さ (扱える値の範囲)に限らず、投影面から無限遠まで 扱うことができるようになります。

(x,y,z,1) * NThrough(k,h) = (X,Y,Z,W)
k = 正方形の投影面における1辺の長さの半分
h = xy平面を投影面としたときの視点の Z座標

xyzw
*
1000
0100
000-k/h
00k0
=
XYZW


1-7. 三次元クリッピング

1-7-1. CAD工学 p109

クリッピングの判定を容易にするために、 視点座標系をクリッピング座標系に変換します。
(x,y,z,1) * NClip(k,h) = (X,Y,Z,W)
k = 正方形の投影面における1辺の長さの半分
h = xy平面を投影面としたときの視点の Z座標

xyzw
*
h/k000
0h/k00
0010
0001
=
XYZW

クリッピング座標系では、z < x < -z, z < y < -z(z は負) が真のときに、ピラミッドの側面より内部にあると判定できます。

クリッピングは透視変換する前に行わないと、 Z 値がおかしくなります。 それは、線形補間によってクリッピングされる x,y 座標を 求めたとしても Z 値は線形でないからです。


1-8. 参考文献

文章名・文献名文章番号 または ISBN 著者 出版者
CAD 工学 ISBN4-563-01493-1 山口富士夫著、培風館


written by Masanori Toda from Jul.27.1999