Дані про суміжність трикутника


9

Надаючи список індексів трикутників, як саме можна перетворити його на перелік індексів із суміжністю для шейдера геометрії?

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

Я знаю, що для будь-якого заданого трикутника у списку індекси {0, 1}, {1, 2} та {2, 0} (або {n, n + 1}, {n + 1, n + 2}, { n + 2, n}, якщо ви віддаєте перевагу) його утворюють його краї; список індексів добре сформований і правильно дотримується порядку намотування.

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

Я знаю, що у списку суміжності кожен оригінальний трикутник представлений 6 індексами, вихідні індекси переходять у слоти 0, 2, 4; нові індекси для завершення суміжності переходять у прорізи 1, 3, 5. Індекс для завершення для краю {0, 1} переходить у проріз 1, індекс для завершення для краю {1, 2} переходить у слот 3, індекс для завершення для краю {2, 1} переходить у слот 5.

Що я спробував?

Я спробував жорстоке форсування, і так, це спрацює, але я після більш елегантного підходу.

Я спробував створити краєвид списку Еріка Ленгіеля, але (1) він, схоже, не поважає початковий порядок трикутників, (2) він, схоже, не поважає звивистий порядок, (3) це так просто, як грязь, куди йти. далі після того, як ви створили список ребер, і (4) у мене є підозра на зразок коду, який має такі очевидні явні помилки, як "трикутникІндекс" проти "faceIndex" - чи автор навіть склав код, не маючи на увазі, запустіть його перевірити це?

Отже - якісь пропозиції чи вказівки звідси далі?


Джиммі, я відредагував матеріали про тіньові томи і змінив назву, оскільки це не здавалося актуальним і потенційно заплутане - питання насправді полягає лише у створенні даних про суміжність, хоча ваша кінцева мета - використовувати його для тіньових томів.
Натан Рід

Відповіді:


11

Я б спробував використовувати для цього хеш-таблицю (наприклад, std::unordered_mapякщо ви перебуваєте в C ++). Побудуйте хеш-таблицю, яка відображається від пів-краю (виражається у вигляді пари індексів у порядку) до третього індексу трикутника, до якого належить пів-краю.

Це можна побудувати, просто перебравши список трикутників і додавши три півграні кожного трикутника до таблиці хешу. Якщо у вашому початковому списку індексів була пара суміжних трикутників (0, 1, 2, 2, 1, 3), ви отримаєте хеш-таблицю, що містить:

(0, 1) -> 2
(1, 2) -> 0
(2, 0) -> 1
(2, 1) -> 3
(1, 3) -> 2
(3, 2) -> 1

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

Потім, щоб створити дані суміжності, все, що вам потрібно зробити, це повторити перелік списку трикутників і запитувати краї кожного трикутника з протилежною обмоткою. Тож при обробці трикутника (0, 1, 2) слід запитати ребра (1, 0), (2, 1) і (0, 2). Це знайде протилежну вершину кожного ребра, якщо вона існує.


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

2

Подивіться на півгранічну структуру даних .

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

Структура даних робить запити про підключення, суміжність тощо, дуже ефективними. Існують алгоритми для ефективного генерування даних, але це не обов'язково ефективно "час роботи гри" (можливо, ви хочете зробити це в автономному режимі у вашому конвеєрі активів).

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


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