在路径追踪器中查找屏幕坐标背后的数学
Math behind finding screen coordinates in a path tracer
我得到了一个框架,其中实现了一个简单的路径跟踪器。到目前为止,我正在尝试做的是理解整个代码,因为我需要亲自动手。不幸的是,我到达了一个我实际上并没有真正了解发生了什么的步骤,并且由于我是高级图形领域的新手,所以我无法 "decrypt" 这部分。开发人员正在尝试获取屏幕角的坐标作为评论。我需要了解的是它背后的数学原理,因此也需要了解其中使用的一些变量。这是代码:
// 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" 和 "focal" 都是固定的?
- 是"focal"焦距吗?
- 您认为 "E" 和 "V" 向量是什么?
- 矩阵"M"是CameraToWorldCoordinates矩阵吗?
如果可能的话,我需要了解这些公式的每一步、变量以及那几行代码中使用的数学。提前致谢。
我的猜测:
E
:眼睛位置——eye/camera在世界space
中的位置
V
: view direction——相机正在观察的方向,在世界坐标中
d
: 一半的命名常量——四角距中心(相机所注视的位置)的距离为屏幕尺寸的一半
focal
:图像平面到相机的距离。考虑到它在屏幕角偏移中的使用,它似乎也是世界坐标中图像平面的高度。
M
:我会说这是 WorldToCamera
矩阵。它用于转换基于 E
的点
积分的计算方式:
从相机开始:E
沿视角方向移动focal
距离,有效移动到图像平面中心:+ V * focal
在 X 和 Y 上添加偏移量,这将移动半个屏幕距离:+ vec3( ::: )
鉴于 V
没有出现在 vec3()
参数中(也没有任何 up
或 right
向量),这似乎硬编码了这样的想法V
与Z轴共线
最后,点被转换为点(与方向相反,因为它们的齐次坐标是1 ) M
.
我得到了一个框架,其中实现了一个简单的路径跟踪器。到目前为止,我正在尝试做的是理解整个代码,因为我需要亲自动手。不幸的是,我到达了一个我实际上并没有真正了解发生了什么的步骤,并且由于我是高级图形领域的新手,所以我无法 "decrypt" 这部分。开发人员正在尝试获取屏幕角的坐标作为评论。我需要了解的是它背后的数学原理,因此也需要了解其中使用的一些变量。这是代码:
// 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" 和 "focal" 都是固定的?
- 是"focal"焦距吗?
- 您认为 "E" 和 "V" 向量是什么?
- 矩阵"M"是CameraToWorldCoordinates矩阵吗?
如果可能的话,我需要了解这些公式的每一步、变量以及那几行代码中使用的数学。提前致谢。
我的猜测:
E
:眼睛位置——eye/camera在世界space
V
: view direction——相机正在观察的方向,在世界坐标中
d
: 一半的命名常量——四角距中心(相机所注视的位置)的距离为屏幕尺寸的一半
focal
:图像平面到相机的距离。考虑到它在屏幕角偏移中的使用,它似乎也是世界坐标中图像平面的高度。
M
:我会说这是 WorldToCamera
矩阵。它用于转换基于 E
积分的计算方式:
从相机开始:
E
沿视角方向移动
focal
距离,有效移动到图像平面中心:+ V * focal
在 X 和 Y 上添加偏移量,这将移动半个屏幕距离:
+ vec3( ::: )
鉴于
V
没有出现在vec3()
参数中(也没有任何up
或right
向量),这似乎硬编码了这样的想法V
与Z轴共线最后,点被转换为点(与方向相反,因为它们的齐次坐标是1 )
M
.