2014-02-14 1 views
0

Я работаю над 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 Вместо конуса у меня есть эта параболоидная красная фигура справа, и я знаю, что это почти то же уравнение, что и конус.

ответ

0

Возможно, вам необходимо реализовать произвольные преобразования на примитивах с использованием гомогенных матриц, а не поддерживать произвольную ориентацию для каждого примитива.

Например, для трассировщиков луча нередко поддерживаются только конусы, у которых есть основание на основании, и эта точка вдоль вертикальной оси. Затем вы использовали бы аффинные преобразования для перемещения конуса в нужное место и ориентацию.

Моя собственная луч-трассировка (которая до сих пор поддерживает только плоскости, коробки и сферы) имеет ту же проблему, и матрицы преобразования реализации - это моя следующая задача.

+0

Я знаю, что мне нужно реализовать это. Но пока я хотел знать, правильна ли эта формула, и если я хорошо ее использую. – Frolanta

+0

@ Фроланта хм, удачи - я пытаюсь прочитать ссылку в формате PDF, которую вы опубликовали, но математическая нотация в ней _horrible_. – Alnitak

+0

Я знаю, но это был единственный, который я нашел. Неважно, я изменил способ, которым я его реализовал. Теперь у меня есть решатель более общего квадричного уравнения. Спасибо, что попробовал! – Frolanta

 Смежные вопросы

  • Нет связанных вопросов^_^