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

In raytracing, where is the image-plane?

我正在 Java 中启动一个基本的光线追踪引擎。

我了解其工作原理的基础知识,但我不确定图像平面应该放置在世界中的确切位置。在我看到的所有图表中,它只显示相机和场景之间某处的图像平面。

目前我的相机位于 (0, 0, -5),图像平面位于 (0, 0, -4) 的中心。我不知道应该放在哪里 "normal" 或 "make sense".

谢谢。

光线追踪器的图像平面可以是沿相机前向矢量的任何合理距离。沿前向矢量的合理位置取决于您在光线追踪器和内容创建中如何对单元进行交互。如果 0.1 表示 1m、1cm 或 1mm。

此距离对光线的影响是它会改变光线与虚像平面相交的角度

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

您可以假设您有一些图像平面并以这种方式计算,但假设您想要鱼眼或 360 度渲染 - 现在您不能用图像平面表示它,但仍然可以渲染。

基本上,您需要的是一种将像素位置 (x,y) 转换为光线(起点、方向)的方法,但具体操作方式取决于您。您可以想象一个平面,将其分成像素并计算从相机到特定像素的光线。您还可以假设一个像素和下一个像素之间存在一些 angular 增量,然后获取相机方向并针对每个像素旋转它。事实上,第二种方法应该更好,因为它避免了在具有大视野的典型 3D 渲染中出现的失真。 使用第二种方法,也可以使用接近或大于 180 度的 fov 进行渲染。

这也是光线追踪中最好的事情之一,您没有所有关于裁剪平面、光栅化和整个 GPU 管道的假设。您只需编写一段代码来计算一些值,如何计算由您决定。

但是,如果您决定坚持使用图像平面,那么您可能知道,当您将这个平面放大两倍并将其移动两倍远时,应该会得到相同的结果。所以你这里的主要问题是数字错误。很难给出任何具体数字,因为它总是 'depends',但我认为 1 的距离是一个好的开始,无论您使用什么单位。