【问题标题】:Raycasting/Raytracing: shooting rays from camera光线投射/光线追踪:从相机拍摄光线
【发布时间】:2011-08-29 04:40:58
【问题描述】:

我正在用 C# 编写一个简单的光线追踪器/光线投射器。我过去使用过 Vectors,所以我编写了一个名为 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!
                }
            }
        }

【问题讨论】:

    标签: c# math vector raytracing


    【解决方案1】:

    您的相机似乎正在沿着 z 轴发射光线,如果这是您在它看起来不错之后的样子。请注意,您的光线方向未标准化,以后可能会或可能不会出现问题。您必须牢记这一点并采取相应的行动。无论如何,我认为对于最基本的 Phantom's tutorial 来说是让我开始(并且沉迷于!)光线追踪的原因,我认为这对你来说可能是一本好书。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 谢谢。这并不是我想要的,但我相信在不久的将来我会在我的光线追踪器上进行构建时会发现它很有用。我将尝试使用 PPM 文件,看看它是否有效。
      猜你喜欢
      • 2021-07-24
      • 1970-01-01
      • 2018-12-19
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      相关资源
      最近更新 更多