Я работаю над RayTracer, и я не могу понять, что я делаю неправильно, когда пытаюсь вычислить пересечение с конусом. У меня есть вектор луча и положение конуса с его осью. Я знаю, что вычислять конус вдоль простой оси легко, но я хочу сделать это с произвольной осью.Сканирование конуса вдоль произвольной оси
Я использую эту ссылку http://mrl.nyu.edu/~dzorin/rend05/lecture2.pdf для уравнения конуса (стр 7-8), и вот мой код:
alpha = cone->angle * (PI/180);
axe.x = 0;
axe.y = 1;
axe.z = 0;
delt_p = vectorize(cone->position, ray.origin);
tmp1.x = ray.vector.x - (dot_product(ray.vector, axe) * axe.x);
tmp1.y = ray.vector.y - (dot_product(ray.vector, axe) * axe.y);
tmp1.z = ray.vector.z - (dot_product(ray.vector, axe) * axe.z);
tmp2.x = (delt_p.x) - (dot_product(delt_p, axe) * axe.x);
tmp2.y = (delt_p.y) - (dot_product(delt_p, axe) * axe.y);
tmp2.z = (delt_p.z) - (dot_product(delt_p, axe) * axe.z);
a = (pow(cos(alpha), 2) * dot_product(tmp1, tmp1)) - (pow(sin(alpha), 2) * dot_product(ray.vector, axe));
b = 2 * ((pow(cos(alpha), 2) * dot_product(tmp1, tmp2)) - (pow(sin(alpha), 2) * dot_product(ray.vector, axe) * dot_product(delt_p, axe)));
c = (pow(cos(alpha), 2) * dot_product(tmp2, tmp2)) - (pow(sin(alpha), 2) * dot_product(delt_p, axe));
delta = pow(b, 2) - (4 * a * c);
if (delta >= 0)
{
t1 = (((-1) * b) + sqrt(delta))/(2 * a);
t2 = (((-1) * b) - sqrt(delta))/(2 * a);
t = (t1 < t2 ? t1 : t2);
return (t);
}
Я инициализируется свою ось с осью у, так что я могу повернуть его. Вот что я получаю: http://i.imgur.com/l3kaavc.png Вместо конуса у меня есть эта параболоидная красная фигура справа, и я знаю, что это почти то же уравнение, что и конус.
Я знаю, что мне нужно реализовать это. Но пока я хотел знать, правильна ли эта формула, и если я хорошо ее использую. – Frolanta
@ Фроланта хм, удачи - я пытаюсь прочитать ссылку в формате PDF, которую вы опубликовали, но математическая нотация в ней _horrible_. – Alnitak
Я знаю, но это был единственный, который я нашел. Неважно, я изменил способ, которым я его реализовал. Теперь у меня есть решатель более общего квадричного уравнения. Спасибо, что попробовал! – Frolanta