在路径跟踪器中查找屏幕坐标背后的数学

Math behind finding screen coordinates in a path tracer

本文关键字:背后 屏幕坐标 查找 路径 跟踪      更新时间:2023-10-16

我已经提供了一个框架,其中实现了一个简单的路径跟踪器。到目前为止,我要做的是理解整个代码,因为我需要亲自动手。不幸的是,我到达了一个步骤,我实际上不知道发生了什么,因为我是一个新手在高级图形领域,我没有设法"解密"这一部分。开发人员试图获得屏幕角的坐标作为注释。我需要理解的是它背后的数学原理,以及用到的一些变量。下面是代码:

// setup virtual screen plane
vec3 E( 2, 8, -26 ), V( 0, 0, 1 );
static float r = 1.85f;
mat4 M = rotate( mat4( 1 ), r, vec3( 0, 1, 0 ) );
float d = 0.5f, ratio = SCRWIDTH / SCRHEIGHT, focal = 18.0f;
vec3 p1( E + V * focal + vec3( -d * ratio * focal,  d * focal, 0 ) ); // top-left screen corner
vec3 p2( E + V * focal + vec3(  d * ratio * focal,  d * focal, 0 ) ); // top-right screen corner
vec3 p3( E + V * focal + vec3( -d * ratio * focal, -d * focal, 0 ) ); // bottom-left screen corner
p1 = vec3( M * vec4( p1, 1.0f ) );
p2 = vec3( M * vec4( p2, 1.0f ) );
p3 = vec3( M * vec4( p3, 1.0f ) );
例如:

  • 什么是"d"变量,为什么"d"answers"focal"都是固定的?
  • "焦距"是焦距吗?
  • 你认为"E"answers"V"向量是什么?
  • 矩阵"M"是CameraToWorldCoordinates矩阵吗?
如果可能的话,我需要理解这些公式的每一步、变量和这几行代码中使用的数学。提前感谢。

我猜:

E:眼睛位置-眼睛/相机在世界空间中的位置

V:视图方向-摄像机正在看的方向,在世界坐标

d:命名常数的一个半角是一半的屏幕尺寸远离中心(相机看的地方)

focal:成像平面到摄像机的距离。考虑到它在屏幕角偏移中的使用,它似乎也是图像平面在世界坐标中的高度。

M:我认为这是WorldToCamera矩阵。它用于变换基于E

的点

如何计算积分:

  1. 从相机开始:E

  2. 沿着视图方向移动focal距离,有效移动到图像平面中心:+ V * focal

  3. 添加X &Y将移动半个屏幕距离:+ vec3( ::: )

    考虑到V没有出现在vec3()参数中(也没有任何upright向量),这似乎硬编码了V与Z轴共线的想法。

  4. 最后,通过M点转换为点(与方向相反,因为它们的齐次坐标为1)。