Я пытался понять рендеринг вокселей и смотрел на двойной контур (DC).
Пока я это очень понимаю
- Запустите функцию плотности для набора точек сетки (т.е. функцию шума)
- Найти, какие ребра в Gird содержат изменения между конечными точками
- Из этих ребер создают точки пересечения (то есть векторы)
Теперь это где я застрял, следующий будет генерировать нормали, но как? При просмотре этой темы это изображение обычно появляется.
Проведение исследований показывает, что нормали будут генерироваться из изоповерхности. Правильно ли думать, что я иду от шума к изоповерхности к нормальным? Если так, как бы я выполнил каждый шаг?
Насколько я понимаю, следующим шагом будет следующее из статьи DC ;
Для каждого ребра с изменением знака создайте квад, соединяющий минимизирующие вершины четырех кубов, содержащих ребро.
Представлена ли эта цитата изображением выше?
Наконец, следующим шагом будет запуск QEF с пересекающимися точками и нормалями, и это сгенерирует мои данные вершин. Это правильно?
источник
Ответы:
Нормали будут генерироваться на основе градиента функции плотности в то же время, когда вы получаете точки пересечения между краями и поверхностью. Если это что-то простое и замкнутого типа, как сфера, то вы можете вычислить нормали аналитически, но с шумом вам нужно будет брать образцы.
У вас есть следующие шаги в неправильном порядке. Сначала вы генерируете вершину для каждой ячейки, которая показывает изменение знака. QEF, который вы минимизируете, является просто общим расстоянием до каждой из плоскостей, которые определены парами точек пересечения / нормали для этой ячейки. Затем вы идете по краям, которые показывают изменения знака, и создаете четырехугольник, используя четыре смежные вершины (которые гарантированно были сгенерированы на последнем шаге).
Теперь, моим самым большим препятствием в реализации этого было решение QEF. Я на самом деле придумал простое итеративное решение, которое будет хорошо работать (например, параллельно) на GPU. По сути, вы начинаете вершину в центре ячейки. Затем вы усредняете все векторы, взятые из вершины в каждую плоскость, перемещаете вершину вдоль полученного результата и повторяете этот шаг фиксированное число раз. Я обнаружил, что перемещение его на ~ 70% по результату стабилизируется за наименьшее количество итераций.
источник
При чтении статьи до страницы 2 кажется, что веса объема хранятся по углам сетки, а не являются весом самого куба, как предпочитают обычные алгоритмы стиля Marching Cubes. Эти угловые веса определяют точку между краями между двумя углами, в которой происходит изменение знака от угла к углу. Края с изменением знака также сохраняют нормаль для края, являющегося угловой линией в 2D-представлении в OP. Эта нормальная информация определяется во время создания тома (каким бы ни был инструмент редактирования или метод создания процедурного тома), а не после того, как изоповерхность сгенерирована, как и следовало ожидать от алгоритма стиля Marching Cubes. Эти нормальные данные «заявляют», что линия / поверхность, проходящая через точку, должна иметь предварительно определенное нормальное значение. В тех случаях, когда Марширующие кубы будут сгибать линию в этой точке, чтобы совпасть с другой точкой на соседнем ребре, Расширенные марширующие кубы и Двойное контурное движение вытягивают линию / поверхность наружу, пока она не пересекается с линией / поверхностью, проходящей через точку на смежный край, который имеет другое нормальное значение. Это позволяет создавать острые углы из объемных данных, где базовые алгоритмы Marching Cubes несколько округлили бы поверхность. Я не совсем понимаю, как QEF (квадратичные функции ошибок) играют в этом, за исключением того, что кажется, что они облегчают вычисление расширенной точки в кубе, где будет расположен угол. Оба расширенных марширующих куба и двойное контурное удлинение расширяют линию / поверхность, пока она не пересекается с линией / поверхностью, проходящей через точку на соседнем ребре, которая имеет другое нормальное значение. Это позволяет создавать острые углы из объемных данных, где базовые алгоритмы Marching Cubes несколько округлили бы поверхность. Я не совсем понимаю, как QEF (квадратичные функции ошибок) играют в этом, за исключением того, что кажется, что они облегчают вычисление расширенной точки в кубе, где будет расположен угол. Оба расширенных марширующих куба и двойное контурное удлинение расширяют линию / поверхность, пока она не пересекается с линией / поверхностью, проходящей через точку на соседнем ребре, которая имеет другое нормальное значение. Это позволяет создавать острые углы из объемных данных, где базовые алгоритмы Marching Cubes несколько округлили бы поверхность. Я не совсем понимаю, как QEF (квадратичные функции ошибок) играют в этом, за исключением того, что кажется, что они облегчают вычисление расширенной точки в кубе, где будет расположен угол.
Обратите внимание, что я говорил о линиях и ребрах здесь в двумерном смысле, как это показано в представлении в OP. Мне нужно было бы еще немного почитать и подумать, чтобы расширить это до 3D для генерации объемных сеток.
Чтобы ответить на вторую половину вашего вопроса о том, как генерировать нормали, и, исходя из процедурной точки зрения, основанной на шуме, кажется, что вы бы заполнили свой объем данными о шумах, затем искали ребра со сменой знака, а затем изучили 4 куба. которые разделяют ребро, чтобы выяснить, где будут генерироваться треугольники, и вычислить нормаль вершины, как вы это делали бы для любого другого пересечения нескольких треугольников, взяв среднее значение нормали для каждого треугольника, который разделяет вершину. Это очень умозрительно с моей стороны, так как статья посвящена в основном операциям CSG и объемам, полученным из преобразованных в отсканированные сетки, которые имеют четко определенные нормали на поверхностях.
Я надеюсь, что, по крайней мере, в первой части этого ответа рассматриваются различия в том, как данные о весе представлены и используются способом, совершенно отличным от базовых марширующих кубов, и почему нормальные данные должны быть созданы довольно рано в процессе генерации объема, где с помощью базовых марширующих кубов нормали обычно создаются как последний этап в процессе генерации сетки.
источник