【问题标题】:In raytracing, where is the image-plane?在光线追踪中,图像平面在哪里?
【发布时间】:2024-01-22 13:53:02
【问题描述】:

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

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

目前我的相机位于 (0, 0, -5),图像平面以 (0, 0, -4) 为中心。我不知道应该把它放在哪里才是“正常”或“有意义”。

谢谢。

【问题讨论】:

  • 相机焦点和投影平面之间的距离将为您提供 ZOOM 或 FOV 角度......因此请设置它们以使您的视图具有您想要的 FOV(通常为FOVx = 60 [deg]
  • 通过光线追踪,与光栅化不同,您可以使用任何类型的相机。所以这取决于你选择的相机类型。

标签: java graphics 3d rendering raytracing


【解决方案1】:

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

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

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

这也是光线追踪中最好的事情之一,您不需要对裁剪平面、光栅化和整个 GPU 管道进行所有这些假设。你只需要编写一个代码来计算一些值,如何做取决于你。

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

【讨论】:

  • 谢谢,我喜欢用任意方式将 (x,y) 转换为光线的想法。我以前从来没有想过这个
【解决方案2】:

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

这个距离对你的光线的影响是它会改变它们与虚拟图像平面相交的角度

【讨论】: