地図/気まぐれ/3Dの作り方

消失点の発見 — 線遠近法から射影へ

順方向の歴史は、遠近をどう描くかから始まる。遠くのものを小さく描く線遠近法は、1400 年代のフィレンツェで Brunelleschi が実験し、Alberti が 1435 年に著した『絵画論』で作図法として定式化した。すべての平行線が一点(消失点)へ収束するという規則は、後に射影幾何という数学になり、コンピュータグラフィックスでは同次座標と射影行列に結晶した。

線遠近法の「奥行きで割る」は、同次座標 (x, y, z, w) で点を持ち、変換の最後に w で割る操作にあたる。回転・平行移動・透視を全部 4×4 行列の掛け算で表し、頂点ごとに一度掛けてから w(透視では奥行き)で割ると画面座標が出る。割り算を最後の一回にまとめられるので、行列を合成して一括処理できる。GPU の頂点シェーダがやっているのは本質的にこれ。CanvasRenderingContext2D では行列を持たず、focal / (camZ + z) の割り算を手で書く。

一点透視の床。床のグリッドを focal / z で縮めると、横線は奥ほど詰まり、縦線は一点へ集まる。Alberti が板に描いたのと同じ消失点が、割り算一つから出る。

詳しくは射影へ。点を線で結び、面を張るところまで進めると、頂点と面を持つ立体になる。