我正在阅读库克的论文“随机采样和分布式射线追踪”,但我不知道射线是如何产生的。他说:


通过从视点
(透镜的中心)穿过光线的屏幕位置构造光线来确定焦点。焦点
位于此光线上,因此它与眼点的距离等于焦距。




>我无法解析此图片。根据此图像,我的屏幕平面在哪里?重点是什么?如果您看到薄透镜的某些光学图像,则焦点始终位于所有光线会聚的同一位置。如果总是相同的点,为什么我要为每条射线计算它?

评论

我在写光线跟踪而不是光线跟踪,那是错误

#1 楼

在传统相机中,场景中的光子穿过相机镜头,然后以焦距射到传感器上。镜头的结果是图像上下颠倒。



在光线跟踪中,我们可以通过将焦平面想象在光线的前面来对其进行优化。相机。您可以认为场景中的光子朝相机孔传播,并在像平面上分解。



光线追踪的另一种优化方法是将光线从相机追踪到场景中,而不是从光源追踪光线并希望它们撞击相机。因此,我们发出的第一束光线是从眼睛到虚拟屏幕上每个像素的光线。



要创建该光线,我们需要知道世界单位中的距离a和b。因此,我们需要将像素单位转换为世界单位。为此,我们需要定义一个摄像机。让我们定义一个示例照相机,如下所示:
$$ origin = \ begin {bmatrix} 0&0&0 \ end {bmatrix} $$
$$ coordinateSystem = \ begin {bmatrix} 1&0& 0 \\ 0&1&0 \\ 0&0&1 \ end {bmatrix} $$
$$ fov_ {x} = 90 ^ {\ circ} $$
$$ fov_ {y } = \ frac {fov_ {x}} {aspectRatio} $$
$$ focalDist = 1 $$

视场或fov是间接指定比例的方法像素单位以查看单位。具体来说,就是摄像机看到的视角。



角度越大,看到的场景越多。但是请记住,更改fov并不会改变屏幕的大小,它只是将场景的多少或多或少地压缩为相同数量的像素。



在由fovx和x轴形成的三角形处:



我们可以使用切线的定义以视图单位计算screenWidth
$$ \棕褐色\ left(\ theta \ right)= \ frac {对面} {adjacent} $$
$$ screenWidth_ {view} = 2 \:\ cdot \:focusDist \:\ cdot \:\ tan \ left(\ frac {fov_ {x}} {2} \ right)$$

使用它,我们可以计算像素的视图单位。
$$ x_ {homogenous} = 2 \:\ cdot \:\ frac {x} {width} \:-\:1 $$
$$ x_ {view} = focusDist \:\ cdot \:x_ {homogenous} \:\ cdot \:\ tan \ left(\ frac {fov_ {x}} {2} \ right)$$

获取射线的最后一件事是将视空间转换为世界空间。这归结为一个简单的矩阵变换。我们否定yview是因为像素坐标从屏幕的左上角到右下角,但是同类坐标从左下角的(-1,-1)到右上角的(1,1)。
$$ ray_ {world} = \ begin {bmatrix} x_ {view}和-y_ {view}&d \ end {bmatrix} \ begin {bmatrix}&&\\&cameraCoordinateSystem&\\&&\ end {bmatrix} $$

您可以在此处看到此实现(在代码中,我假设focusDist为1,所以它抵消了)

评论


$ \ begingroup $
镜头在您的模型中的什么位置?在屏幕平面上?光圈大小在哪里?
$ \ endgroup $
–arcollector
16-2-17在18:15



#2 楼

而不是眼睛前面的屏幕平面,它描述了一个胶片平面,在该胶片平面上投影了图像,以明确地建模相机光学系统。在进行光线跟踪时,您无需计算焦点-这只是找到景深效果的焦平面的一种方法。

对于景深效果,我使用标准的透视投影但会在平行于焦平面的圆上晃动眼睛的位置-我确保给定像素的所有光线都穿过焦平面上的同一点,从而使其变得清晰,而该平面之前或之后的物体最终模糊。这是一个类似光圈的简单模型,并给出了很好的结果。