Як відстежувати поверхні Безьє?


18

Я спробував це питання на math.SE, і дивно, що відповідь була "рівняння занадто неприємні, просто подайте функцію на числовий кореневик". Але якщо ви вважаєте себе "графічним хлопцем", як я, і грали широко з кривими Безьє для дизайнерських робіт, я мушу повірити, що краще можна зробити. Існує опублікований алгоритм від Kajiya, що я не маю досвіду для розуміння (Sylvester Matrices), але відповідна порада з математики.SE полягала в тому, що результат - поліном ступеня 18 в t, і вам все одно потрібно вирішити це чисельно. У мене була інша ідея з подібним результатом .

Отож, чи сподіватися на повне перехрестя променя Рей / Безьє поверхня алгебраїчно, таким чином дозволяючи чітко кодувати і мати надшвидку супергладку?

Якщо це забороняється, який найшвидший метод для виконання цього розрахунку? Чи можете ви "знайти ворушіння", щоб отримати чітку межу (і ціль) для рекурсивного підрозділу? Якщо вам доведеться скористатися цифровим кореневим шукачем (зітхання), які властивості йому потрібні і чи є кращий вибір швидкості?

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


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

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

Відповіді:


14

По-перше, ось метод Kajiya, який я думаю, ви думаєте про: Kajiya, Ray Tracing Parametric Patches , SIGGRAPH 82. Версія звіту про техніку може бути більш інформативною.

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

"Справжні" променеві відстежувачі, як правило, поєднують дві речі:

  • Розміщення обмежувальної ієрархії (наприклад, AABB) на патчі, щоб отримати хороше "початкове значення" для числового кореневого пошуку. Якщо ви це зробите добре, то можете уникнути проблеми «зморшок».
  • Тесселінг патча в оболонках DDG і простеження їх, як полігонні сітки.

Остання точка звучить так, ніби вона вбиває вимогу "надгладкість", але це не так вже й погано, як якщо ви використовуєте променеві диференціали . Відповідність рівня тесселяції до "розміру" променя добре обмежує помилку. Крім того, вам, напевно, потрібні диференціали для текстурних координат, так що ви можете також використовувати його для контролю точності тесту перетину.

Використання тимчасової узгодженості не є поганою ідеєю, але саме від того, як ви це зробите, багато що залежить від подання графіки на сцені. Можливо, ви хочете переглянути когерентність променів. Запитайте улюблену пошукову систему про відстеження пакетів променів та переупорядкування променів .


9

це сподіватися на повну мрію вирішити алгебраїчно перетин Рей / Безьє-поверхня

Так, це трубна мрія. Бікубічний патч Безьє - це алгебраїчна поверхня ступеня 18. Щоб перетинати промінь з цією поверхнею, ви повинні знайти коріння многочлена градуса 18. Немає формули для цих коренів - їх потрібно знайти числовими методами. . Насправді є математичні результати ( теорема Абеля-Руффіні ), які говорять нам про те, що ніколи не може бути формул для коренів рівнянь поза ступеня 4. Математика не просто говорить про те, що формули ще не знайдені; там сказано, що їх ніколи не знайдуть, бо вони не можуть існувати.

Якщо ви дійсно хочете зробити аналітичну (алгебраїчну) відстеження променевих фігур, ви можете спробувати використати патчі Штейнера . Вони мають ступінь 4, тому перетин променевого патча можна обчислити шляхом знаходження коренів квартика (тобто многочлена ступеня 4). Існують формули для знаходження коренів квартиків, але вони досить неприємні, і написати код, який реалізує формули, на диво важко.


5

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

Хоча я ще не дивився на це (ну, окрім швидкого погляду) Мітчелл опублікував ще декілька останніх робіт з трасування променів з інтервальною математикою.

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


1

https://www.shadertoy.com/results?query=bezier сортувати за віком у разі проблем із сумісністю:

, ... показує безліч рішень багатьох підмножин сплайну, або повернення відстані до 2d сплайну, або відстеження 3d-патча. Шпонки та пластирі бувають у багатьох формах. Небесна дура є найпростішою, безір - простою, медсестри - надмірно складною. Чим більше обмежень, які ти додаєш до свого сплайну, тим простіше він стає. NURBS - це надмірний рівень розширення; - його нерівномірність ваг ("NU") знижує ефективність порівняно з більш симетричними сплайнами - його Ration-al-ness (R) також додає певної складності для сегментації (нормування) та змішування з розташованими поруч сегментами (рекурсивно вирішено).

bezier-patch-tracing є вирішенням кореня, і з цим випливає контекстна пріоритетність на точність; в якому порядку розв’язати квадратичне рівняння. це стає непрактичним для вищих показників, ніж кубічних, через експоненціальну складність та втрату точності.

ray-marching == відстеження сфери - це простіший евристичний підхід до вирішення коренів, який, як видається, є простим і найефективнішим рішенням для надання більшості патчів сплайнів.

Представлення Lagrange спрощує трасування / марширування (оскільки L-точки ВКЛЮЧЕНО сплайн, тоді як точки ControlVector (точно такого ж сплайна) рідко знаходяться на сплайні)

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


У комп’ютерній графіці сплайни та виправлення майже повністю були замінені z-brushing до 2006 року. Z-brushing використовує карти зміщення з однорідними координатами, або навіть використовуючи "тип", який використовує нам об'єднання сфери та сегментів ліній (сегменти лінії мають радіус 0, сфери мають довжину 0, об'єднання просте і корисне). Для незначної втрати точності для великого збільшення продуктивності при порівняно низькій вартості пам'яті для оглядової таблиці, що легко робиться динамічним на gpu.


Не зважай. всі рішення 3D-патчів виконуються шляхом відстеження сфери.
ollj

це просто значно підвищує продуктивність і точність, коли виправлення простіше. до того моменту, коли плаття небесних моряків наблизить вас за кілька ітерацій:
ollj

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.