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

时间:2015-08-21 14:39:42

标签: c++ graphics 3d rendering pixel

我已经提供了一个实现简单路径跟踪器的框架。到目前为止我要做的是理解整个代码,因为我需要把手放在上面。不幸的是,我到了一步,我实际上并没有得到正在发生的事情,因为我是高级图形领域的新手,我无法“解密”这部分。开发人员正在尝试获取评论的屏幕角落坐标。我需要了解的是它背后的数学,因此使用了一些变量。这是代码:

// 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”和“焦点”都被修复了?
  • 焦点是“焦点”?
  • 您认为“E”和“V”载体是什么?
  • 是CameraToWorldCoordinates矩阵的矩阵“M”?

我需要了解这些公式的每一步(如果可能),变量以及在这几行代码中使用的数学。提前致谢。

1 个答案:

答案 0 :(得分:1)

我的猜测:

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

V:以世界坐标

查看方向 - 相机查看的方向

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

focal:图像平面与相机的距离。鉴于它在屏幕边角偏移中的使用,它似乎也是世界坐标中图像平面的高度。

M:我说这是WorldToCamera矩阵。它用于转换基于E

的点

如何计算点数:

  1. 从相机开始:E
  2. 沿着视图方向移动focal距离,有效地移动到图像平面的中心:+ V * focal
  3. 在X&添加偏移量Y将移动半个屏幕距离:+ vec3( ::: )

    鉴于V参数中没有显示vec3()(也没有任何upright向量),这似乎是硬编码{{{ 1}}与Z轴共线。

  4. 最后,通过V将点转换为作为点(与方向相反,,因为它们的同源坐标为1)。