Войти
ПрограммированиеФорумГрафика

Marching cubes

Страницы: 1 2 Следующая »
#0
17:47, 10 фев. 2013

Прочитал вот это, всё понял, но как вычислять потенциал вершин, если у нас есть только воксели?


#1
21:01, 10 фев. 2013

Marching cubes работает с расстояниями до поверхности, нужна либо функция которая вычислит расстояние до поверхности для всех углов каждого вокселя, либо трёхмерная сетка где каждый воксель это расстояние до поверхности.
То есть потенциал это просто расстояние, к примеру потенциал сферы с радиусом 2 можно вычислить с помощью этой функции:

float f(vec3 p) { return length(p) - 2.0; }

#2
21:30, 10 фев. 2013
потенциал это просто расстояние

Это я понял.

функция которая вычислит расстояние до поверхности для всех углов каждого вокселя

Вот про это можно подробнее?

#3
21:32, 10 фев. 2013

воксель имеет позицию

#4
22:10, 10 фев. 2013

05142
> Вот про это можно подробнее?
У каждого вокселя есть восемь углов, и для каждого угла можно вычислить расстояние если передать позицию угла в функцию которая считает расстояние.

#5
23:36, 10 фев. 2013

А как считать это расстояние? Я на этом и застрял, как получить эту поверхность из вокселей, marching cubes только делает из поверхности треугольники как я понял.

#6
0:00, 11 фев. 2013

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

#7
3:11, 11 фев. 2013

05142
тоесть можно построить поверхность, к примеру так:
- обозначить центр в воксельной сетке для построения фигуры
- заполнить объем воксельной сетки расстояниями до этого центра

#8
6:37, 11 фев. 2013

05142
> Прочитал вот это, всё понял, но как вычислять потенциал вершин
traptd
> Marching cubes работает с расстояниями до поверхности
Кажется мне, что это называется плотностью (density). И она никак не вычисляется, нельзя функцией предугадать все возможные формы (точнее вычислять можно, но это скорей всего будет не то, что нужно). Плотность просто храниться, float или 0..255 (uchar) в  трёхмерном массиве.

#9
13:29, 11 фев. 2013

alexes
Не совсем так. Marching cubes работает со скалярными значениями которые относительны выбранного порога. Для алгоритма важны только те воксели где этот порог пересекается, а остальные воксели никак не влияют на сгенерированную модель. Если этот порог равняется нулю, то расстояние до поверхности, которое можно вычислить с помощью функций, даст правильную триангуляцию. Но плотность тоже можно использовать, хотя возможно надо будет подбирать порог(и).

> нельзя функцией предугадать все возможные формы
Marching cubes не без изъянов и у него действительно есть неоднозначные случаи, но они могут проявляться вне зависимости от того используется ли расстояние или допустим плотность.

#10
17:03, 11 фев. 2013

хм, а +1 для занятых и -1 для свободных ячеек не подойдет? (при пороге 0)

Марширующие кубы строят "изоповерхность" на заданном уровне (пороге). то-есть поверхность появляется только между значениями по разную сторону "порога"

#11
17:20, 11 фев. 2013

achumack
> хм, а +1 для занятых и -1 для свободных ячеек не подойдет? (при пороге 0)
Не, там нужно интерполировать между значениями чтобы разместить вертекс, требуется более высокая точность. Даже однобайтого int8 вполне хватит.

#12
17:28, 11 фев. 2013

achumack
> хм, а +1 для занятых и -1 для свободных ячеек не подойдет? (при пороге 0)
Можно так строить, но гладкой поверхности не будет. Получиться угловатый меш.

Вот пример, 64x64x64. На первом плотность сгенерирована в диапазоне 0..255 (uint8), на втором 0..1.
Причем на первом видно шероховатости из-за небольшого разрешения, к примеру на 128x128x128 они почти не различимы. Если на втором примере увеличить разрешение, то угловатости просто станут мельче.

+ Показать

traptd
> Не совсем так. Marching cubes работает со скалярными значениями которые
> относительны выбранного порога. Для алгоритма важны только те воксели где этот
> порог пересекается, а остальные воксели никак не влияют на сгенерированную
> модель. Если этот порог равняется нулю, то расстояние до поверхности, которое
> можно вычислить с помощью функций, даст правильную триангуляцию. Но плотность
> тоже можно использовать, хотя возможно надо будет подбирать порог(и).
Если честно, то в теорию не сильно вникал. Использую готовую библиотеку, работает она здорово, нечего там внутри менять. Просто плотность проще воспринимается.

#13
18:05, 11 фев. 2013

да, я в курсе что в идеале надо иметь что-то вроде расстояния до поверхности (для вокселей - байта будет достаточно) и как бонус нормаль (ибо нормали не ахти выходят, сильно сглаживать надо)

Но если есть только boolean занято или нет, тогда без вариантов.

Статья просто про визуализацию скалярных полей, там слишком хитро написано, "потенциал" там итд...

#14
18:08, 11 фев. 2013

Давайте так: мне надо просто построить сетку ландшафта по воксельной модели, что мне нужно для этого?
Пока вижу решение строить со значениями как писали выше -1, 1, а потом сглаживать полученную сетку.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.