奥行きで割るだけで3Dに:Cameraの中身は単純な数式だった
Divide by Depth for Instant 3D

3DグラフィックスのCameraが何をしているのか、その仕組みを数式から解き明かす。奥行きzでxとyを割るだけで3D座標が2Dに投影される基本を出発点に、視野角やアスペクト比、クリッピング面を含む透視投影行列へと拡張。world→view→clip→NDC→pixelsというパイプラインの各段階が何をしているかを整理し、必要に応じて自分で実装するための理解を促す。
Cameraはほんのいくつかの単純な変換を行っているだけであり、それぞれの変換が何のためのものかを理解していれば、自分のニーズや制約に応じてどの部分を自分で実装するかを選べる。
HNでの議論
36- tmoertel
3次元座標を列ベクトル (x y z 1) で表すときの「この余分な1は何のため?」という説明には、平行移動(物を動かすこと)は線形変換ではなく(原点が原点に写らない)アフィン変換である、という点に触れるとより理解しやすいでしょう。したがって、3次元空間における平行移動を3x3行列で表すことはできません。しかし、その3次元空間を、4次元目のある座標(通常は w=1)に固定された4次元空間に埋め込むことはできます。そうすれば、元の3次元空間での平行移動は4次元空間での線形変換として表すことができ、したがって4x4行列の掛け算でも表せます。つまり、この余分な1のおかげで、平行移動を含む一般的な3次元の操作をすべて線形代数で行えるようになり、現代の計算機上で行列乗算の強力なパワーを活用できるのです。
- aappleby
参考までに、「ビューフラスタムは z = 1 で先端を切り落とし、『終端』が無限遠にある90度のピラミッドである」というところから始めれば、それを透視除算を用いて行列でNDCにマッピングする方法を導き出せます。
私は短い「グラフィックス入門」(最初のセッションではありませんが)を教えるときにこれを使いましたが、通常の「これが透視行列の計算方法で、これらの数字がどこから来たのかは聞かないでください」というバージョンよりも、数学が直感的に理解できました。
- lolakutty
信じてください、私はあまり頭が良くありません。でも90年代半ばに486を手にした少年として、とても刺激を受け、インターネット(当時はまだ聞いたこともなかった)や本もなしにこれを自力で理解しました。
14インチのモノクロモニターのQBasic IDEで回転する立方体を手に入れたときの興奮は今でも覚えています。私が使った直感は、3Dオブジェクトが2Dの壁に影を落とす仕組みから来ていました。そこから、x' = x/z、y' = y/z が自然に導かれます。
- gabrieloc
こんにちは!かつて私が苦労したかなり複雑なトピックを分かりやすくするために、3Dカメラの仕組みについてインタラクティブな例を交えていくつかメモを書きました。ここにいる誰かの役に立つかもしれませんし、そうでなくても楽しいスライダーで遊べます!
- rhyperior
かつてはソフトウェア業界でこれらすべてが常識のように思えたのは、Carmack、Abrash、Hecker(他にも大勢いますが)がゲームと発見についてオープンに取り組んでいたからです。誰かが基本原理から再発明しなければならなかったのは、ちょっと面白いですね!