我已经提供了一个实现简单路径跟踪器的框架。到目前为止我要做的是理解整个代码,因为我需要把手放在上面。不幸的是,我到了一步,我实际上并没有得到正在发生的事情,因为我是高级图形领域的新手,我无法“解密”这部分。开发人员正在尝试获取评论的屏幕角落坐标。我需要了解的是它背后的数学,因此使用了一些变量。这是代码:
// 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 ) );
例如:
我需要了解这些公式的每一步(如果可能),变量以及在这几行代码中使用的数学。提前致谢。
答案 0 :(得分:1)
我的猜测:
E
:眼睛/相机在世界空间中的眼睛位置
V
:以世界坐标
d
:一个半角的命名常量是远离中心(相机正在看的地方)屏幕尺寸的一半
focal
:图像平面与相机的距离。鉴于它在屏幕边角偏移中的使用,它似乎也是世界坐标中图像平面的高度。
M
:我说这是WorldToCamera
矩阵。它用于转换基于E
如何计算点数:
E
focal
距离,有效地移动到图像平面的中心:+ V * focal
在X&添加偏移量Y将移动半个屏幕距离:+ vec3( ::: )
鉴于V
参数中没有显示vec3()
(也没有任何up
或right
向量),这似乎是硬编码{{{ 1}}与Z轴共线。
最后,通过V
将点转换为作为点(与方向相反,,因为它们的同源坐标为1)。