Как проследить поверхности Безье?


18

Я пробовал этот вопрос на математике. SE, и удивительно, ответ был "уравнения слишком скверны, просто передайте функцию в числовой корень искатель". Но если вы считаете себя «графическим парнем», как я, и много играли с кривыми Безье для дизайнерских работ, я должен поверить, что лучше можно сделать. Существует опубликованный алгоритм Кадзиа, который я не имею для понимания (Матрицы Сильвестра), но соответствующий совет по математике. SE заключался в том, что результатом является полином 18-й степени по t, и вам все еще нужно решить его численно. У меня была другая идея с похожим результатом .

Итак, неужели это полная несбыточная мечта - надеяться на алгебраическое решение пересечения поверхности Рэя и Безье, что делает возможным явное кодирование и сверхбыструю сверхгладкость?

За исключением этого, какой самый быстрый метод для выполнения этого расчета? Можете ли вы "найти покачивания", чтобы получить жесткую границу (и цель) для рекурсивного подразделения? Если вам нужно использовать числовой корень (вздох), какие свойства ему нужны и есть ли лучший выбор для скорости?

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


Вы ищете общий метод, который можно применить к произвольной поверхности Безье, или способ подготовки быстрого метода для конкретной поверхности? Будет ли ваша форма поверхности исправлена ​​до времени выполнения?
Трихоплакс

1
Обратите внимание, что вы можете создать более точные поверхности намного проще, чем трассировать лучи. Вы также можете использовать raytrace или raymarch одномерные поверхности намного проще, чем другие виды! blog.demofox.org/2015/07/28/rectangular-bezier-patches
Алан Вулф,

Ответы:


14

Прежде всего, вот метод Kajiya, о котором я думаю, вы думаете: Kajiya, Параметрические исправления Ray Tracing , SIGGRAPH 82. Версия технического отчета может быть более информативной.

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

«Настоящие» лучевые трассеры имеют тенденцию делать комбинацию из двух вещей:

  • Размещение ограничительной иерархии (например, AABB) на патче, чтобы получить хорошее «начальное значение» для числового корневого искателя. Если вы делаете это хорошо, вы можете избежать проблемы «морщин».
  • Тесселирование патча в оболочку DDG и трассировка лучей как полигональные сетки.

Эта последняя точка звучит так, как будто она убивает требование «супергладкости», но она не так плоха, как если бы вы использовали лучевые дифференциалы . Сопоставление уровня тесселяции с «размером» луча красиво ограничивает ошибку. Кроме того, в любом случае, вам, возможно, понадобятся дифференциалы для координат текстуры, поэтому вы также можете использовать их для контроля точности теста пересечения.

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


9

это полная несбыточная мечта надеяться на алгебраическое решение пересечения поверхности Рэя и Безье

Да, это несбыточная мечта. Бикубический участок Безье является алгебраической поверхностью степени 18. Чтобы пересечь луч с этой поверхностью, вы должны найти корни многочлена степени 18. Для этих корней нет формулы - вы должны найти их численными методами. , Фактически, есть математические результаты ( теорема Абеля-Раффини ), говорящие нам, что никогда не может быть формул для корней уравнений после степени 4. Математика не просто говорит, что формулы еще не были найдены; он говорит, что их никогда не найдут, потому что они не могут существовать.

Если вы действительно хотите сделать аналитическую (алгебраическую) трассировку лучей изогнутых форм, вы можете попробовать использовать патчи Штейнера . Они имеют степень 4, поэтому пересечение лучей и пятен можно вычислить, найдя корни квартики (то есть многочлена степени 4). Существуют формулы для нахождения корней квартик, но они довольно неприятные, и на удивление сложно написать код, который надежно реализует формулы.


5

Другой вариант, который я использовал пару десятилетий назад (да!), Заключается в использовании схемы Тота 1985 года, в которой использовалась интервальная арифметика для сужения пространства поиска. IIRC, в конечном счете, прибегнет к Ньютон-Рапсону, но, опять же, IIRC, я думаю, что для достижения хорошего решения редко требуется более одного или двух шагов.

Хотя я не смотрел на это (ну, кроме быстрого взгляда), Митчелл опубликовал несколько более поздних работ по трассировке лучей с интервальной математикой.

(Я должен добавить, что если вы выполняете только поверхности Безье, то метод интервала может быть немного «излишним», поскольку вы можете использовать такие приемы, как цветение, для получения границ и производных. Если, однако, вы комбинируете кривые Безье с другими функциями, например, вращение вокруг оси, тогда ее общность более полезна.)


1

https://www.shadertoy.com/results?query=bezier сортируйте по возрасту, в случае проблем с совместимостью:

, ... показывает множество решений многих сплайн-подмножеств, либо возвращающих расстояние до 2-го сплайна, либо отслеживание 3d-патча. Сплайны и патчи бывают разных форм. небеса за простейшими, безье - простыми, нюры - слишком сложными. Чем больше ограничений вы добавляете в сплайн, тем проще он становится. NURBS - это расширение излишков; - его неравномерность весов («NU») снижает эффективность по сравнению с более симметричными сплайнами - его рациональное отношение (R) также добавляет некоторую сложность для сегментирования (нормирования) и смешивания с соседними сегментами (рекурсивно решено).

трассировка безье-патча решает корень, и с этим связана контекстуальная приоритетность точности; в каком порядке решить квадратное уравнение. это становится непрактичным для более высоких показателей, чем кубические, из-за экспоненциальной сложности и потери точности.

ray-marching == сферическое отслеживание - это более простой эвристический подход к решению корней, который, по-видимому, является простым и наиболее эффективным решением для рендеринга большинства сплайновых патчей.

Лагранжевое представление упрощает трассировку / марширование (поскольку L-точки находятся на сплайне, а ControlVector-точки (точно такого же сплайна) редко находятся на сплайне)

Особый случай небесного сплайна, где первые производные stat и end равны == 0. упрощает преемственность и включает меньше различий (меньше вычитание). Небесное пятно можно эффективно отследить за один проход: https://www.shadertoy.com/view/4djfW3, в то время как другие кубические (или более высокие) сплайны делают эвристический подход к отслеживанию сфер / маршированию лучей более эффективным (и " достаточно точный "), чем осмелился аналитически рассчитать все корни, чтобы сохранить наименьший положительный корень (с экспоненциально накапливающими погрешности точности для каждого корня).


В компьютерной графике сплайны и заплатки были почти полностью заменены z-чисткой к 2006 году. Z-чистка использует карты смещения с однородными координатами или даже использует «тип», который использует объединение сферы и сегментов линий (сегменты линий имеют радиус 0, сферы имеют длину 0, объединение простое и полезное). Для незначительной потери в точности для большого выигрыша в производительности при относительно низкой стоимости памяти для справочной таблицы, это легко сделать динамическим на GPU.


Ничего. Все решения для 3d патчей выполняются с помощью отслеживания сфер.
ollj

это просто значительно увеличивает производительность и точность, когда патч проще. до точки, где участок небесных небес seamess уводит вас очень далеко за несколько итераций:
ollj

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.