Я пытаюсь построить подходящую разрушаемую местность, просто для исследовательских целей. Все идет хорошо, но разрешение меня не удовлетворяет. Я видел много примеров, как люди реализуют алгоритм MC, но большинство из них, насколько я понимаю, используют функции для триангуляции конечной сетки, что мне не подходит. что не подходит для меня.
Я попытаюсь вкратце объяснить, как я строю свой рельеф, и, возможно, кто-нибудь из вас подскажет мне, как улучшить или увеличить разрешение конечного рельефа.
Я запускаю простой цикл через таблицы поиска MC для каждого случая (0-255) и вычисляю треугольники. в ярости: [0,0,0] - [1,1,1]. Здесь проблем нет.
У меня есть класс 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);
определяя, включены или выключены соседи этого вокселя. Здесь проблем нет.
Я делаю цикл для каждой оси, извлекаю номер case, затем получаю предварительно рассчитанные треугольники по case, перевожу в координаты x,y,z и рисую эти треугольники. Здесь проблем нет.
Результат выглядит следующим образом:
Но, как видите, в любом отдельном месте разрешение не сравнимо, например, с этим:
(источник: angelfire.com)
Я видел в примерах MC, что люди используют что-то под названием "iso values", чего я не понимаю. Любые предложения, как улучшить мою работу, или что такое iso values, и как реализовать это в равномерной сетке, были бы поистине прекрасны.