透視投影 — 3Dを2Dに映すカメラの数学

なぜ遠くのものは小さく写るのか。答えは「奥行き Z で割る」というたった1つの計算です。ピンホールカメラの1本の光線から、ゲームのカメラが毎フレームやっている投影まで、動かしながら確かめます。

1. すべての始まり — ピンホールカメラ

小さな穴をあけた暗い箱に光を通すと、反対側の壁に外の景色が映ります。物体の各点から四方八方に出る光のうち、穴を通れるのは1本だけ。だから像がぼやけずに結ばれ、光線が穴で交差するので上下左右が逆さまになります。

下のデモで物体までの距離を変えてみてください。遠ざけるほど像が小さくなる — これが遠近法の出発点です。

ピンホールカメラの断面図 — 1本の光線が像をつくる
水色=物体、オレンジ=物体上の1点から穴を通る光線、緑=像面に結ばれた像(上下逆)。距離 d を2倍にすると像の大きさは 1/2 に。像の大きさは距離に反比例します。
x画面 = f · X / Z  y画面 = f · Y / Z (X, Y, Z) は3D座標、Z はカメラからの奥行き、f は焦点距離。「奥行きで割る」— 透視投影の計算はこれだけ
POINT — 遠近感の正体は「Zで割る」 3D座標を画面に映すには、X と Y を奥行き Z で割るだけ。2倍遠くにあるものは2倍小さく写る。CGのカメラも、カメラのレンズも、人間の目も、この1行の計算の上に成り立っている。

2. 画角(FOV)— 世界をどれだけ切り取るか

穴から像面までの距離 f(焦点距離)を変えると、写る範囲の広さが変わります。CGではこの範囲を角度で表し、画角(FOV: Field of View)と呼びます。ゲームの設定画面にある「FOV」はまさにこれです。

画角を変えると同じ世界の写り方が変わる
同じ大きさのキューブの列の間を進んでいます。広角(FOV大)=広く写るが遠近感が誇張され、奥のものが急激に小さくなる。望遠(FOV小)=狭く写るが遠近感が薄れ「圧縮」されたように見える。左上の扇形=上から見た切り取り範囲。
注意 — 「望遠の圧縮」はレンズの魔法ではない 望遠レンズが空間を圧縮しているわけではない。同じ位置から撮れば、望遠の写真は広角写真の中央を切り抜いたものと(ボケを除き)同じ。印象が激変する本当の原因は、画角に合わせて被写体との距離を変えて撮ること。遠近感を決めるのはレンズではなく視点の位置。

3. 透視投影 vs 平行投影

遠近感が「Zで割る」ことから生まれるなら、割らなければ遠近感のない絵になります。それが平行投影(正投影)。奥行きが変わっても大きさが変わらないので、寸法がそのまま読める設計図・CAD・見下ろし型ゲームの画面などで活躍します。

同じキューブたち、2つの映し方
9個のキューブはすべて同じ大きさ。透視投影では手前ほど大きく写り、平行投影では全部同じ大きさに写る。切り替えの途中は、カメラを遠ざけながらズームインする映画の「ドリーズーム」と同じ原理。

4. 消失点 — 平行線はどこへ行くのか

線路のレールは平行なのに、写真の中では1点に集まっていくように見えます。この点が消失点。透視投影では、同じ方向を向く平行線は必ず画面上の同じ1点へ収束します。そして地面と平行なあらゆる方向の消失点を集めた線が地平線です。

線路と電柱 — 消失点に収束する世界
カメラの高さを変えても消失点の位置は動きません(レールの開き方だけが変わる)。消失点は「線がどの方向を向いているか」だけで決まるから。電柱のてっぺんを結んだ線も、レールと平行なので同じ点へ向かいます。
一歩先へ — GPUの中の透視投影 実際のGPUは投影を 4×4 行列と同次座標 (x, y, z, w) で表す。行列を掛けたあと w(=奥行き)で割る透視除算が、このページで学んだ「Zで割る」に当たる。画角と近クリップ面・遠クリップ面が作る四角錐台(視錐台)の内側にある物体だけが描画に進む。

5. まとめ — 遠近法は割り算