Пересечение лучей и объемов в OpenGL

Я делаю объемный рендерер. Я успешно прочитал том, и у меня есть несколько готовых классов из моего трассировщика лучей. Теперь проблема в том, как сделать пересечение Луча и Объема (его размер 256 * 256 * 256), чтобы найти координаты «intersectFront» и «intersectBack»?

В моем классе луча я могу определить происхождение и направление луча.

Я попытался применить алгоритм Лян-Барского, но не смог придумать, как примените его для коробки (куб/объем).


person user3870357    schedule 29.12.2016    source источник


Ответы (1)


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

Кроме того, кажется, что вы выполняете приведение лучей на ЦП, а не в шейдере openGL. В шейдере openGL вычисление точек «intersectFront» и «intersectBack» очень просто. Сначала вы два раза визуализируете ограничивающую рамку объема в текстуру. Первый рендеринг для передних граней, а второй для задних граней. Вершины ограничивающего прямоугольника окрашиваются с использованием выровненных по оси координат прямоугольника. Затем две текстуры можно наложить друг на друга, чтобы найти луч пересечения с точки зрения координат 3D-текстуры. Для получения дополнительной информации проверьте этот пост: объемный рендеринг (с использованием glsl) с помощью ray алгоритм приведения.

Если вы делаете это на процессоре, лучше всего преобразовать куб/ограничивающий прямоугольник обратно, чтобы сделать его выровненным по оси вместе с текущим лучом. Затем вы можете применить упомянутый алгоритм Лян Барского, используя расширения поля как x_min, x_max, y_min, y_max, z_min, z_max.

person Jadh4v    schedule 30.12.2016
comment
Спасибо за ваш вклад. Я делаю это на процессоре на данный момент. Теперь предположим на время, что я не хочу вращать громкость. Я просто хотел увидеть свой том (лучевой бросок). Я не могу понять, как преобразовать его обратно и применить Лян Барски. Просто в моем случае считайте, что все статично. Тот же размер, без вращения, то же положение куба. - person user3870357; 30.12.2016
comment
Вам не нужно будет выполнять обратное преобразование, если ваш куб уже выровнен по оси и статичен. Просто вычислите линейные уравнения и используйте минимальное и максимальное значения для каждого измерения, чтобы вычислить точки пересечения. - person Jadh4v; 30.12.2016
comment
Или, чтобы еще проще, просто используйте орфографическую проекцию. то есть ваши лучи проходят вдоль оси z. Но я не буду генерировать хорошую перспективу. Хотя, это было бы хорошей отправной точкой. - person Jadh4v; 30.12.2016
comment
Я реализовал то же, что и вы, но ничего не получил на экране. Вот мой код pastebin.com/VewEWH4Z - person user3870357; 31.12.2016
comment
Я вижу, что вы передаете объект Ray r в функцию intersect(), но не используете ее. Какую линию вы используете для вычисления отсечения? Вы должны использовать луч (который был рассчитан на основе перспективы), чтобы сформировать два параметрических уравнения. - person Jadh4v; 02.01.2017
comment
Скажем, у вас есть два луча, которые определяются двумя точками (x_0,y_0) и (x_1, y_1). Эти точки можно использовать для формирования двух параметрических уравнений следующим образом: x = x_0 + t(x_1 - x_0) y = y_0 + t(y_1 - y_0) Это дает вам значения x_0, y_0, delta_x и delta_y, необходимые для тестирования. с помощью алгоритма Лянга-Барского. - person Jadh4v; 02.01.2017