光线投射/光线追踪:从相机拍摄光线

本文关键字:相机 光线追踪 光线投射 | 更新日期: 2023-09-27 17:57:19

我正在用c#编写一个简单的光线追踪器/光线投射器。我过去使用 Vectors 有过期,所以我写了一个名为 Vector3D 的类,如下面的代码所示。我还编写了一个处理 Ray 的类。目前,我关心的是确保光线从摄像机发出原始图像,并投射到屏幕上的所有像素上,然后投射到场景中摄像机前方的物体上。我已经过期了将文本写入输出(Debug.WriteLine),尽管很难看出它是否真的有效。以下代码是否合适,或者您会推荐另一种方法或网站来引用/指导我吗?

for (int x = 0; x < sizeofoutput.Width; x++)
{
    for (int y = 0; y < sizeofoutput.Height; y++)
    {
                Vector3D lookat = new Vector3D(sizeofoutput.Width / 2, sizeofoutput.Height / 2, 0);
                Vector3D lookatrev = new Vector3D(lookat.X * -1, lookat.Y * -1, 0);
                Vector3D tmp2 = lookatrev + new Vector3D(x, y, 0);
                Vector3D campos = new Vector3D(0, 2, -6); // camera position.
                Vector3D raydir = tmp2 - campos; // ray goes into a pixel.
                Vector3D rayorg = campos; // ray starts at camera.
                Ray ray = new Ray(rayorg); // create the ray from the data provided.
                ray.Direction = raydir;
                for (int c = 0; c < sceneobj.Length; c++)
                {
                    // find object and render!
                }
            }
        }

光线投射/光线追踪:从相机拍摄光线

您的相机似乎沿着z轴发射光线,如果这是您看起来不错之后的样子。请注意,光线的方向未归一化,这在以后可能会也可能不会成为问题。你必须牢记这一点并采取相应的行动。无论如何,我认为对于最基本的教程,Phantom的教程是让我开始(并上瘾!)光线追踪的原因,我认为这对你来说可能是一本不错的读物。

我不确定我是否完全理解您要实现的目标,但也许这会有所帮助:

  1. 将球体放在与相机一定距离的位置
  2. 将光线追踪结果输出到 PPM 文件。PPM的格式真的很琐碎。
  3. 完成后,只需在图像编辑器中打开PPM文件,看看是否看到圆圈

此外,如果您计划使用复杂的场景,您可能需要考虑比遍历每条光线上的所有场景对象更有效的方法。