2015-01-11 1 views
3

Рэй-трассировка с сетками треугольников имеет широко известные решения и множество ресурсов. Существует проблема, связанная, которая включает в себя трассировку лучей для поверхностей с известными параметрическими формулами, такие как:Каков наиболее эффективный способ делать трассировку лучей с поверхностью, формула которой известна?

S(u,v) = (cos(u), sin(u), v) 

, который представляет собой блок цилиндр выровненного к оси Z. Мой вопрос: какой самый эффективный способ применить трассировку лучей к этой поверхности? Очевидным решением было бы создание приближенных сеток из формул, а затем применение трассировки лучей, но мой вопрос заключается в том, что для этого конкретного случая есть наилучшее подходящее решение - в частности, путем применения своего рода полиномиального решателя по требованию.

ответ

2

Когда вы упоминаете полиномиальный решатель, это звучит так, будто вы основываете вещи на неявном алгебраическом описании поверхности. Таким образом, в вашей ситуации, вы бы избавиться от тригонометрических функций с помощью tangent half-angle substitution:

((1-u^2)/(1+u^2), 2*u/(1+u^2), v) 

Тогда вы бы превратить это в совокупности полиномиальных уравнений в x,y,z:

(1-u^2)/(1+u^2) - x = 0 
    2*u/(1+u^2) - y = 0 
       v - z = 0 

Вы могли бы устранить u и v из этих уравнений, например используя resultants.

Вы бы в конечном итоге с

x^2 + y^2 - 1 == 0 

, которая приходит на не удивительно, так как это ваш цилиндр. Но вышеприведенный подход будет работать и на других параметризованных поверхностях. Тогда вы можете взять свой луч света и, предположив, что источником является объектив камеры, напишите точку на этом луче как λd, где d - направление луча. Подключите эту точку в уравнение, решите для λ, найдите наименьшее положительное решение, и у вас есть точка, где луч пересекает поверхность. Кроме того, вычислите градиент неявного уравнения в этой точке, и у вас есть нормальная поверхность.

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

Есть инструменты, такие как Surfer и его потомки, которые визуализируют алгебраические поверхности, описываемые неявными уравнениями в качестве единственной цели. Они имеют тенденцию делать много причудливых вещей, особенно хорошо справляться с особенностями, такими как очень тонкие шипы, выступающие с такой поверхности. Я сам использовал этот инструмент, например. для иллюстрации this answer. Однако у Surfer нет сложной модели отражения и освещения, так что это только лучей.