Я пытаюсь построить подходящую разрушаемую местность только для исследовательских целей. Ну, все прошло хорошо, но разрешение меня недостаточно удовлетворяет. Я видел много примеров, как люди реализуют алгоритм MC, но большинство из них, насколько я понимаю, используют функции для триангуляции финальной сетки, что мне не подходит.
Я попытаюсь кратко объяснить, как я строю свой ландшафт, и, возможно, кто-то из вас даст мне совет, как улучшить или увеличить разрешение окончательного ландшафта.
1) Предварительный расчет треугольников MC.
Я запускаю простой цикл по таблицам поиска MC для каждого случая (0-255) и вычисляю треугольники в ярости: [0,0,0] - [1,1,1]. Здесь нет проблем.
2) Местность
У меня есть класс ландшафта, в котором хранятся мои воксели. В общем, это выглядит так:
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);
чтобы включить или выключить расположение вокселя. (Помогает работать с битами).
Как только ландшафт выделен, я запускаю перлиновый шум и включаю или выключаю биты.
У моего класса ландшафта есть еще одна функция, чтобы извлечь номер дела Marching Cubes (0-255) из местоположения x, y, z:
unsigned char GetCaseNumber(x,y,z);
путем определения того, включены или выключены соседи этого вокселя. Здесь нет проблем.
3) Часть рендеринга
Я зацикливаюсь на каждой оси, извлекаю номер случая, затем получаю предварительно рассчитанные треугольники по каждому случаю, перевожу в координаты x, y, z и рисую эти треугольники. здесь нет проблем.
Таким образом, результат выглядит следующим образом:
Но, как вы можете видеть, в любом отдельном месте разрешение несопоставимо, например, с этим:
(источник: angelfire.com)
Я видел в примерах MC, что люди используют что-то, называемое «значения iso», чего я не понимаю. Любые предложения, как улучшить мою работу или что такое значения iso и как реализовать их в единой сетке, были бы действительно прекрасны.
r(x,y,z) = sqrt(x**2 + y**2 + z**2)
и проверка некоторого порогового значения, чтобы решить, находится ли позиция внутри или за пределами определенного порога. В вашей реализации MC вы должны использовать результат r(x,y,z) › t вместо бита заполнения вокселя. - person datenwolf   schedule 05.01.2012