在光线追踪中,像平面在哪里?

时间:2018-10-18 02:28:51

标签: java graphics 3d rendering raytracing

我正在用Java启动基本的光线跟踪引擎。

我了解其工作原理,但是我不确定确切将图像平面放置在世界上什么位置。在我看到的所有图中,它仅显示了相机和场景之间某处的图像平面。

当前,我的相机位于(0,0,-5),图像平面居中于(0,0,-4)。我不知道应该将其放置在“正常”或“有意义”的位置。

谢谢。

2 个答案:

答案 0 :(得分:1)

我可能是错的,但我认为这里不需要任何图像平面概念。只需将像素位置映射到光线即可。

您可以假设您具有某个像平面,并且您可以通过这种方式进行数学运算,但是假设您想要鱼眼或360度渲染-现在您无法用像平面表示它,但是仍然可以渲染。

基本上,您需要的是一种将像素位置(x,y)转换为射线(起点,方向)的方法,但是您可以自行决定。您可能会想象一个平面,将其划分为像素,然后计算从相机到特定像素的光线。您还可以假设一个像素与下一个像素之间存在一定的角度变化量,然后获取相机方向并为每个像素旋转角度。实际上,第二种方法应该更好,因为它避免了在使用大Fov进行的典型3D渲染中出现的变形。 通过第二种方法,还可以使用接近或大于180度的视场进行渲染。

这也是光线跟踪中最好的事情之一,您没有关于裁剪平面,光栅化和整个GPU管线的所有假设。您只需编写将计算一些值的代码,如何实现就取决于您。

但是,如果您决定坚持使用图像平面,那么您可能知道,当使该平面变大两倍并将其移动两倍远时,它应该会产生相同的结果。因此,您的主要问题是数值误差。很难给出任何具体数字,因为它总是“依赖”,但我认为无论您使用的单位是多少,1的距离都是一个好的开始。

答案 1 :(得分:0)

光线跟踪器的图像平面可以是沿相机前向矢量的任何合理距离。沿着前向矢量放置多大的距离取决于您如何在光线跟踪器和内容创建中对单元进行插值。如果0.1代表1m,1cm或1mm。

此距离将对您的射线产生影响,因为它将改变与虚拟图像平面相交的角度