我正在用c#编写一个简单的光线跟踪器/ raycaster。我过去使用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!
}
}
}
答案 0 :(得分:2)
你的相机似乎是沿着z轴发射光线,如果这是你看起来很好的话。请注意,您的光线方向未标准化,以后可能会出现问题,也可能不会出现问题。你必须记住它并采取相应的行动。无论如何,我认为非常基础Phantom's tutorial是让我开始(和上瘾!)的光线跟踪,我认为这对你来说可能是一个很好的阅读。
答案 1 :(得分:1)
我不确定我是否完全理解你想要实现的目标,但也许这可能有所帮助:
此外,如果您打算使用复杂场景,您可能需要考虑比迭代每条光线上的所有场景对象更有效的方法。