C# 光线投射/光线跟踪:从摄影机拍摄光线

C# 光线投射/光线跟踪:从摄影机拍摄光线,c#,math,vector,raytracing,C#,Math,Vector,Raytracing,我正在用c#编写一个简单的光线跟踪器/光线投射器。我以前有过向量过期,所以我写了一个叫做Vector3D的类,正如你在下面的代码中看到的。我还编写了一个类来处理光线。现在,我关心的是确保光线从摄影机开始,投射到屏幕上的所有像素,然后投射到场景中摄影机前面的对象。我已经用向输出(Debug.WriteLine)写入文本的方式结束了,尽管很难看到它是否真的工作。以下代码是否合适,或者您是否会推荐其他方法或网站来参考/指导我 for (int x = 0; x < sizeofoutput.Wi

我正在用c#编写一个简单的光线跟踪器/光线投射器。我以前有过向量过期,所以我写了一个叫做Vector3D的类,正如你在下面的代码中看到的。我还编写了一个类来处理光线。现在,我关心的是确保光线从摄影机开始,投射到屏幕上的所有像素,然后投射到场景中摄影机前面的对象。我已经用向输出(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!
                }
            }
        }
for(int x=0;x
我不确定自己是否完全理解您想要实现的目标,但这可能会有所帮助:

  • 将球体放置在离相机一定距离的位置
  • 将光线跟踪结果输出到PPM文件。PPM的格式是
  • 完成后,只需在图像编辑器中打开PPM文件,查看是否看到圆圈

  • 此外,如果你计划有复杂的场景,你可能需要考虑比在每个光线上重复所有场景对象更有效的东西。

    < P>你的相机好像是在Z轴上发射光线,如果这是你之后看起来不错的话。请注意,光线的方向未规范化,这可能是问题,也可能不是问题。你必须牢记这一点,并据此采取行动。无论如何,我认为最基本的是我开始(并且上瘾了!)光线追踪,我认为这对你来说可能是一本不错的书。

    谢谢。这并不完全是我想要的,但我相信,在不久的将来,当我继续使用我的光线跟踪器时,我会发现这很有用。我将尝试使用PPM文件,看看它是否有效。