Так что на днях я решил написать трассировщик лучей, но я застрял, потому что забыл всю свою векторную математику. У меня есть точка за экраном (глаз/камера, 400,300, -1000), а затем точка на экране (плоскость от 0,0,0 до 800,600,0), которую я получаю только используя значения x и y текущего пикселя, который я ищу (используя SFML для рендеринга, так что это что-то вроде 267,409,0)Рэй трассировочные векторы
Проблема в том, что я не знаю, как правильно наложить луч. Я использую это для тестирования сфера пересечения (C++):
bool SphereCheck(Ray& ray, Sphere& sphere, float& t)
{ //operator * between 2 vec3s is a dot product
Vec3 dist = ray.start - sphere.pos; //both vec3s
float B = -1 * (ray.dir * dist);
float D = B*B - dist * dist + sphere.radius * sphere.radius; //radius is float
if(D < 0.0f)
return false;
float t0 = B - sqrtf(D);
float t1 = B + sqrtf(D);
bool ret = false;
if((t0 > 0.1f) && (t0 < t))
{
t = t0;
ret = true;
}
if((t1 > 0.1f) && (t1 < t))
{
t = t1;
ret = true;
}
return ret;
}
Так я понимаю, что начало луча будет положение глаз, но то, что это направление?
Или, если это не так, есть ли лучший способ сделать это? Я слышал о некоторых людях, использующих start луча как (x, y, -1000) и в качестве (0,0,1), но я не знаю, как это будет работать.
На стороне примечания, как бы вы сделали преобразования? Я предполагаю, что для изменения угла камеры вы просто настраиваете x и y камеры (или экран, если вам нужно резкое изменение)
Я думаю, что так оно и должно быть, но я забыл все, что я знаю об векторной математике, поэтому я не совсем уверен. – Chris
В основном, что я пытаюсь сказать, как мне отдать луч, потому что я думаю, что, возможно, я ошибаюсь. – Chris
@ Крис: как сказал Ноктюрн, вы бросали луч из глаза через пиксель. Направление дается путем вычитания одной точки из другой. –