3D GRAPHICS: FROM LINES TO GPU · LESSON 01

ワイヤーフレームから始める3D

8個の頂点、12本の辺、回転行列、透視投影。GPUもThree.jsも使わず、3Dの基本を描いてみよう。

LIVE · CANVAS 2D

ドラッグで回転できます。背後の辺もすべて描いていることに注目。

頂点 P6 の計算結果
01 / 形を数で表す

頂点と辺の集合

立方体は8個の頂点 P₀…P₇ と12本の辺で表せます。辺は「どの頂点とどの頂点を結ぶか」というインデックスの組です。

P₆ = (1, 1, 1)
edge = (2, 6)  // P₂ と P₆ を結ぶ

面の色も照明もありません。これがワイヤーフレーム表現です。

02 / 三次元座標を回す

回転行列

例としてY軸の周りを角度 θ だけ回すと、座標は次のように変わります。

X = x cosθ + z sinθ
Y = y
Z = −x sinθ + z cosθ

サンプルではY軸回転のあとX軸回転を行い、最後に奥行き方向へ d = 5 を足します。

03 / 画面の座標へ

透視投影

カメラは原点から +Z方向 を見ます。カメラ座標で Z > 0 の点をスクリーンへ写します。

u = W/2 + f · X/Z
v = H/2 − f · Y/Z
f = (H/2)/tan(FOV/2)

W,H はCanvasの幅と高さ、f は画素単位の焦点距離。Zが大きいほど画面上では小さくなります。

平行投影では f/Z の代わりに一定の倍率を使います。上の投影方式を切り替えて違いを比較しましょう。

04 / 次に発生する問題

見えないはずの辺も見える

このプログラムは12本の辺をすべて描きます。奥に隠れた線も消していません。 「どの面が手前か」を判定する隠線・隠面消去が次の課題です。

次章では、面を三角形に分け、表裏判定と隠線処理を学び、その後にZ-bufferへ進みます。