Чи може хтось пояснити подвійний контур?


9

Я намагався зрозуміти віксельну візуалізацію і дивився на подвійний контур (DC).

Поки я це дуже розумію:

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

Тепер я тут застряг, наступним було б генерувати нормали, але як? Дивлячись на цю тему, це зображення зазвичай виростає.

                                                   Підписана сітка з краями, позначеними даними Hermite

Проведення досліджень свідчить про те, що нормали будуть породжуватися з ізоповерхні. Чи правильно вважати, що я переходжу від шуму від ізоповерхні до нормальної? Якщо так, як би я здійснив кожен крок?

Наскільки я розумію, наступним кроком було б наступне з паперу постійного струму ;

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

Чи представлена ​​ця цитата наведеним зображенням?

Нарешті, наступним кроком буде запуск QEF із пересічними точками та нормалами, і це створить мої вершинні дані. Це правильно?


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

Відповіді:


3

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

Наступні кроки у вас в неправильному порядку. По-перше, ви генеруєте вершину для кожної комірки, яка демонструє зміну знаків. QEF, який ви мінімізуєте, - це просто загальна відстань до кожної з площин, яка визначається точкою перетину / нормальними парами для цієї комірки. Потім ви пройдетеся по краях, які демонструють зміни знаків, і створіть квадру за допомогою чотирьох суміжних вершин (які гарантовано були сформовані на останньому кроці).

Тепер моєю найбільшою перешкодою у здійсненні цього було вирішення QEF. Я насправді придумав просте ітеративне рішення, яке буде добре працювати (наприклад) на GPU паралельно. В основному, ви починаєте вершину в центрі комірки. Потім ви оцінюєте всі вектори, взяті від вершини до кожної площини, і переміщуєте вершину вздовж цієї результуючої сили, і повторюєте цей крок фіксовану кількість разів. Я виявив, що переміщення його ~ 70% уздовж отриманого результату стабілізується в найменшій кількості ітерацій.


Тож скажімо, що у мене є комірка / воксель, який, наскільки я знаю, демонструє зміну знаків (тобто такий випадок, як MC), я застосував функцію шуму для кожного 8 куточка комірки, щоб знайти її щільність. Що у мене виникають проблеми з розумінням, - це звідки я знаходжу змінні x , n та p QEF?
Soapy

x - вершинне положення. Для кожної точки перетину у вас є p (положення) і n (нормальна), які складають площини, про які я говорив.
jmegaffin

p знаходимо, знаходячи, де середньозважене значення двох густин уздовж ребра дорівнює нулю. Тоді ви обчислюєте n , беручи градієнт функції густини на p .
jmegaffin

Отже, в основному для кожного куба я обчислюю p і n для кожні 12 ребер, а потім запускаю QEF для кожного краю комірок p і n в x , який у вашому прикладі знаходиться в центрі вокселя / комірки для початку? Тоді, якщо чотири клітинки мають один і той же край, я створюю квадратик, що з'єднує кожну чотири комірки x ? І чи є в результаті чотири мої полігональні дані?
Soapy

Не кожне ребро має перетин, тому вам не обов'язково вирішувати QEF для 12 площин. Крім того, що у вас це є!
jmegaffin

1

Зчитавши папір до сторінки 2, здається, що об'ємні ваги зберігаються в кутах сітки, а не вага самого куба, як вважають за краще звичайні алгоритми стилю Marching Cubes. Ці кутові ваги визначають точку між ребром між двома кутами, де відбувається зміна знаку від кута до кута. Краї зі змінами знаків також зберігають нормальну для краю, яка є кутовою лінією у вашому двовимірному поданні в ОП. Ця нормальна інформація визначається під час створення тома (будь-яким інструментом редагування чи процедурним методом створення томів), не після того, як буде створена ізоповерхня, як можна було б очікувати алгоритмом стилю Marching Cubes. Ці нормальні дані "констатують", що лінія / поверхня, що проходить через точку, повинна мати заздалегідь задане нормальне значення. У випадках, коли маршові кубики будуть згинати лінію в цій точці, щоб поєднатися з іншою точкою на сусідньому краї, розширені маршируючі кубики і подвійний контур продовжують лінію / поверхню, поки вона не перетинається з лінією / поверхнею, що проходить через точку на сусідній край, який має інше нормальне значення. Це дозволяє створити гострі кути з даних про обсяг, де основні алгоритми маршируючих кубів дещо закругляють поверхню. Я не зовсім розумію, як грають QEF (квадратичні функції помилок), за винятком того, що, здається, вони полегшують обчислення розширеної точки в кубі, де буде розташований кут. Розширені маршируючі кубики та подвійний контур розширюють лінію / поверхню, поки вона не перетинається з лінією / поверхнею, що проходить через точку на сусідньому краї, яка має інше нормальне значення. Це дозволяє створити гострі кути з даних про обсяг, де основні алгоритми маршируючих кубів дещо закругляють поверхню. Я не зовсім розумію, як грають QEF (квадратичні функції помилок), за винятком того, що, здається, вони полегшують обчислення розширеної точки в кубі, де буде розташований кут. Розширені маршируючі кубики та подвійний контур розширюють лінію / поверхню, поки вона не перетинається з лінією / поверхнею, що проходить через точку на сусідньому краї, яка має інше нормальне значення. Це дозволяє створити гострі кути з даних про обсяг, де основні алгоритми маршируючих кубів дещо закругляють поверхню. Я не зовсім розумію, як грають QEF (квадратичні функції помилок), за винятком того, що, здається, вони полегшують обчислення розширеної точки в кубі, де буде розташований кут.

Зауважте, що я тут говорив про лінії та ребра в 2D-сенсі, як зображено представленням в ОП. Мені довелося б ще трохи прочитати та подумати, щоб розширити це на 3D для об'ємної генерації сітки.

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

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

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