Marching Cubes, voxels, нужно немного предложений

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

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

1) Предварительный расчет треугольников MC.

Я запускаю простой цикл через таблицы поиска MC для каждого случая (0-255) и вычисляю треугольники. в ярости: [0,0,0] - [1,1,1]. Здесь проблем нет.

2) Terrain

У меня есть класс terrain, который хранит мои воксели. В общем, это выглядит так:

int size = 32;//Size of each axis.
unsigned char *voxels = new unsigned char[(size * size * size)/8];

Итак, каждая ось имеет размер 32 единицы в длину, но я храню информацию о вокселях на бит. То есть, если бит включен (1), то что-то есть, и что-то должно быть нарисовано.

У меня есть пара функций:

TurnOn(x,y,z);
TurnOff(x,y,z);

включить или выключить расположение вокселя. (Помогает работать с битами).

После выделения местности, я запускаю перлиновый шум, и включаю или выключаю биты.

Мой класс terrain имеет еще одну функцию, чтобы извлечь номер дела Marching Cubes (0-255) из расположения x,y,z:

unsigned char GetCaseNumber(x,y,z);

определяя, включены или выключены соседи этого вокселя. Здесь проблем нет.

3) Часть рендеринга

Я делаю цикл для каждой оси, извлекаю номер case, затем получаю предварительно рассчитанные треугольники по case, перевожу в координаты x,y,z и рисую эти треугольники. Здесь проблем нет.

Результат выглядит следующим образом:

terrain

Но, как видите, в любом отдельном месте разрешение не сравнимо, например, с этим: MC
(источник: angelfire.com)

Я видел в примерах MC, что люди используют что-то под названием "iso values", чего я не понимаю. Любые предложения, как улучшить мою работу, или что такое iso values, и как реализовать это в равномерной сетке, были бы поистине прекрасны.

8
задан Glorfindel 16 August 2019 в 01:15
поделиться