【问题标题】:What is the focal length and image plane distance from this raytracing formula这个光线追踪公式的焦距和像平面距离是多少
【发布时间】:2017-10-19 12:09:48
【问题描述】:

我有一个由右、上、前和位置向量组成的 4x4 相机矩阵。 我使用在教程中找到的以下代码对场景进行光线追踪,但并不完全理解它:

for (int i = 0; i < m_imageSize.width; ++i)
{
    for (int j = 0; j < m_imageSize.height; ++j)
    {
        u = (i + .5f) / (float)(m_imageSize.width - 1) - .5f;
        v = (m_imageSize.height - 1 - j + .5f) / (float)(m_imageSize.height - 1) - .5f;

        Ray ray(cameraPosition, normalize(u*cameraRight + v*cameraUp + 1 / tanf(m_verticalFovAngleRadian) *cameraForward));

我有几个问题:

  1. 如何找到光线追踪相机的焦距?
  2. 我的图像平面在哪里?
  3. 为什么cameraForward 需要与这个1/tanf(m_verticalFovAngleRadian) 相乘?

【问题讨论】:

    标签: graphics camera computer-vision geometry perspectivecamera


    【解决方案1】:

    焦距是镜头系统的属性。但是,此代码使用的相机型号是针孔相机,根本不使用镜头。所以,严格来说,相机并没有真正的焦距。相反,相应的光学特性表示为视场(相机可以观察到的角度;通常是垂直的)。您可以使用以下公式计算具有等效视野的相机的焦距(请参阅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 = (i + .5f) / (float)(m_imageSize.width - 1) - .5f;
    v = (m_imageSize.height - 1 - j + .5f) / (float)(m_imageSize.height - 1) - .5f;
    

    这些公式为每个像素计算 -0.5 和 0.5 之间的 u/v 坐标,假设整个图像适合 -0.5 和 0.5 之间的框。

    u*cameraRight + v*cameraUp 
    

    ... 只是将射线的 x/y 坐标放置在像素上。

    ... + 1 / tanf(m_verticalFovAngleRadian) *cameraForward
    

    ... 定义光线的深度分量,最终定义您正在使用的图像平面的深度。基本上,这是使光线更陡或更浅。假设您的视野非常小,那么1/tan(fov) 是一个非常大的数字。因此,图像平面非常远,这恰好产生了这个小视野(当保持图像平面的大小不变时,因为您已经设置了 x/y 分量)。另一方面,如果视场较大,则图像平面移动得更近。请注意,这个图像平面的概念只是概念性的。正如我所说,所有其他图像平面都同样有效,并且会产生相同的图像。指定射线的另一种方式(也许是更直观的方式)是

    u * tanf(m_verticalFovAngleRadian) * cameraRight 
    + v * tanf(m_verticalFovAngleRadian) * cameraUp 
    + 1 * cameraForward));
    

    如您所见,这是完全相同的光线(只是缩放)。这里的想法是将概念图像平面设置为深度 1 并缩放 x/y 分量以适应图像平面的大小。 tan(fov)fov 是半视场)正好是深度为 1 的半图像平面的大小。只需画一个三角形来验证这一点。请注意,此代码只能生成方形图像平面。如果要允许矩形,则需要考虑边长的比例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多