目次
LEVEL 1:ポリゴン一個
LEVEL 0:点
まずは3次元空間上に置いた点の描画から。3次元直交座標系上に点P(a, b, c)を置きます(下図。座標軸の取り方が普通とは違うけど、これはディスプレイに表示する際に便利なようにしたため)。図が見にくくて、すみません。
さて、この点をディスプレイ上に描画するにはどこから見るのか(視点)と、どの範囲を描画するのか(スクリーン)ということを決めなければいけません。ここでは簡単のため、視点を原点に置き、スクリーンをz=kの平面上の高さh、幅wの範囲とします(下図)。h、wは基本的にどんな値でもいいのですが、実際に表示するディスプレイに合わせた値(640x480とか)にするのがいいでしょう。
この視点とスクリーンは「人間の目の網膜と水晶体」とか、「カメラのフイルムとレンズ」といった感じで捉えてもらえばいいと思います(逆さまに結像するとか、そういった細かいはなしは無し)。
#このスクリーンを平面以外の、たとえば球の一部
#といった様な曲面にすると、結構面白い。
これで道具がそろったので、3次元上の点をディスプレイに描画することができます。つまり、視点と対象の点を結ぶ直線(視線)がスクリーンと交わる座標を求めて、ディスプレイ上の対応する座標に点を打てばいいだけです(上の図を参照)。視線とスクリーンの交点の座標の求め方は高校の数学の教科書を参考にしてください。…で終わると作者の怠慢だと思われるかもしれないので一応説明すると、
視点と点P(a, b, c)を結ぶ直線は
(x/a) = (y/b) = (z/c)
これがz=k上の平面と交わる交点は
x = ak/c、y = bk/c
#4行ですんでしまった。
当たり前ですが、この時のx,yはスクリーンの中心を(0, 0)としたときの値なので、実際に描画する際には適当な値を加える必要があります。
簡単なソース
typedef struct{
int x;
int y;
int z;
}Vertex3;
#define kScreenDistance 32
void PlotVertex(Vertex3* vertex, int offsetX, int offsetY){
int x, y;
if(vertex.z < kScreenDistance)
return;
x = ((vertex.x *kScreenDistance) /vertex.z) +offsetX;
y = ((vertex.y *kScreenDistance) /vertex.z) +offsetY;
Plot(x, y); // 座標(x, y)に点を打つ
}
目次
LEVEL 1:ポリゴン一個