Может кто-нибудь объяснить двойное очертание?


9

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

Пока я это очень понимаю

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

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

                                                   Сетка со знаком с ребрами, помеченными данными Эрмита

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

Насколько я понимаю, следующим шагом будет следующее из статьи DC ;

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

Представлена ​​ли эта цитата изображением выше?

Наконец, следующим шагом будет запуск QEF с пересекающимися точками и нормалями, и это сгенерирует мои данные вершин. Это правильно?


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

Ответы:


3

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

У вас есть следующие шаги в неправильном порядке. Сначала вы генерируете вершину для каждой ячейки, которая показывает изменение знака. QEF, который вы минимизируете, является просто общим расстоянием до каждой из плоскостей, которые определены парами точек пересечения / нормали для этой ячейки. Затем вы идете по краям, которые показывают изменения знака, и создаете четырехугольник, используя четыре смежные вершины (которые гарантированно были сгенерированы на последнем шаге).

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


Допустим, у меня есть ячейка / воксел, которая, как я знаю, показывает изменение знака (то есть такой случай, как MC), я запустил функцию шума для каждых 8 углов ячейки, чтобы найти ее плотность. Что мне трудно понять, так это то, как мне найти переменные x , n и p QEF?
Мыльный

х - позиция вершины. Для каждой точки пересечения у вас есть p (позиция) и n (нормаль), которые составляют плоскости, о которых я говорил.
jmegaffin

p определяется путем нахождения нулевого средневзвешенного значения двух плотностей вдоль ребра. Затем вы вычисляете n , беря градиент вашей функции плотности при p .
jmegaffin

Таким образом, в основном для каждого куба я вычисляю p и n для каждых 12 ребер, а затем запускаю QEF для каждого ребра ячейки p и n в x , который в вашем примере находится в центре воксела / ячейки для начала? Тогда, если четыре ячейки имеют одно и то же ребро, я создаю четырехугольник, соединяющий каждые четыре ячейки х ? И является ли полученная четверка моими многоугольными данными?
Мыльный

Не каждое ребро будет иметь пересечение, поэтому вы не обязательно решаете QEF для 12 плоскостей. Кроме этого у вас есть это!
jmegaffin

1

При чтении статьи до страницы 2 кажется, что веса объема хранятся по углам сетки, а не являются весом самого куба, как предпочитают обычные алгоритмы стиля Marching Cubes. Эти угловые веса определяют точку между краями между двумя углами, в которой происходит изменение знака от угла к углу. Края с изменением знака также сохраняют нормаль для края, являющегося угловой линией в 2D-представлении в OP. Эта нормальная информация определяется во время создания тома (каким бы ни был инструмент редактирования или метод создания процедурного тома), а не после того, как изоповерхность сгенерирована, как и следовало ожидать от алгоритма стиля Marching Cubes. Эти нормальные данные «заявляют», что линия / поверхность, проходящая через точку, должна иметь предварительно определенное нормальное значение. В тех случаях, когда Марширующие кубы будут сгибать линию в этой точке, чтобы совпасть с другой точкой на соседнем ребре, Расширенные марширующие кубы и Двойное контурное движение вытягивают линию / поверхность наружу, пока она не пересекается с линией / поверхностью, проходящей через точку на смежный край, который имеет другое нормальное значение. Это позволяет создавать острые углы из объемных данных, где базовые алгоритмы Marching Cubes несколько округлили бы поверхность. Я не совсем понимаю, как QEF (квадратичные функции ошибок) играют в этом, за исключением того, что кажется, что они облегчают вычисление расширенной точки в кубе, где будет расположен угол. Оба расширенных марширующих куба и двойное контурное удлинение расширяют линию / поверхность, пока она не пересекается с линией / поверхностью, проходящей через точку на соседнем ребре, которая имеет другое нормальное значение. Это позволяет создавать острые углы из объемных данных, где базовые алгоритмы Marching Cubes несколько округлили бы поверхность. Я не совсем понимаю, как QEF (квадратичные функции ошибок) играют в этом, за исключением того, что кажется, что они облегчают вычисление расширенной точки в кубе, где будет расположен угол. Оба расширенных марширующих куба и двойное контурное удлинение расширяют линию / поверхность, пока она не пересекается с линией / поверхностью, проходящей через точку на соседнем ребре, которая имеет другое нормальное значение. Это позволяет создавать острые углы из объемных данных, где базовые алгоритмы Marching Cubes несколько округлили бы поверхность. Я не совсем понимаю, как QEF (квадратичные функции ошибок) играют в этом, за исключением того, что кажется, что они облегчают вычисление расширенной точки в кубе, где будет расположен угол.

Обратите внимание, что я говорил о линиях и ребрах здесь в двумерном смысле, как это показано в представлении в OP. Мне нужно было бы еще немного почитать и подумать, чтобы расширить это до 3D для генерации объемных сеток.

Чтобы ответить на вторую половину вашего вопроса о том, как генерировать нормали, и, исходя из процедурной точки зрения, основанной на шуме, кажется, что вы бы заполнили свой объем данными о шумах, затем искали ребра со сменой знака, а затем изучили 4 куба. которые разделяют ребро, чтобы выяснить, где будут генерироваться треугольники, и вычислить нормаль вершины, как вы это делали бы для любого другого пересечения нескольких треугольников, взяв среднее значение нормали для каждого треугольника, который разделяет вершину. Это очень умозрительно с моей стороны, так как статья посвящена в основном операциям CSG и объемам, полученным из преобразованных в отсканированные сетки, которые имеют четко определенные нормали на поверхностях.

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

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