焦点距離はレンズシステムの特性です。しかし、このコードが使用するカメラモデルは、レンズを一切使用しないピンホールカメラです。厳密に言えば、カメラは実際に焦点距離を持っていません。対応する光学特性は代わりに視野(カメラが観察できる角度、通常は垂直な角度)として表される。あなたは(Wikipediaを参照)、以下の式でビューの同等のフィールドを持っているカメラの焦点距離を計算することができます:
FOV = 2 * arctan (x/2f)
FOV diagonal field of view
x diagonal of film; by convention 24x36 mm -> x=43.266 mm
f focal length
一意の像面はありません。ビュー方向に垂直な任意の平面は、イメージ平面として見ることができる。実際、投影された画像はそのスケールだけが異なる。あなたの最後の質問については
、のコードをよく見てみましょう:これらの式は、Uを計算
u = (i + .5f)/(float)(m_imageSize.width - 1) - .5f;
v = (m_imageSize.height - 1 - j + .5f)/(float)(m_imageSize.height - 1) - .5f;
/vが画像全体が箱に収まることを想定し、画素毎に-0.5と0.5の間の座標-0.5〜0.5の間である。
u*cameraRight + v*cameraUp
...レイのx/y座標をピクセルに配置するだけです。
l
...は、光線の奥行き成分と最終的に使用するイメージプレーンの奥行きを定義しています。基本的に、これは光線をより急峻または浅くしています。視野が非常に狭いと仮定すると、1/tan(fov)
は非常に大きな数です。したがって、画像平面は非常に遠く離れており、この小さな視野を正確に生成します(既にx/y成分を設定しているので、画像平面のサイズを一定に保つと)。一方、視野が大きい場合、像平面はより近くに移動する。画像平面のこの概念は概念的なものに過ぎないことに注意してください。私が言ったように、他のすべてのイメージプレーンも同じように有効で、同じイメージを生成します。ご覧のとおり光線を指定する別の方法(そしておそらくより直感的なもの)
u * tanf(m_verticalFovAngleRadian) * cameraRight
+ v * tanf(m_verticalFovAngleRadian) * cameraUp
+ 1 * cameraForward));
だろう、これは(単なるスケール)まったく同じ線です。ここでのアイデアは、概念的な画像平面を1の深度に設定し、x/y成分を拡大して画像平面のサイズに適合させることである。 tan(fov)
(半分の視野であるfov
)は、ちょうど深さ1の半画像平面のサイズです。それを確認するために三角形を描きます。このコードは、正方形のイメージプレーンしか生成できないことに注意してください。長方形のものを許可する場合は、辺の長さの比率を考慮する必要があります。