марширующие кубики, очень маленькие треугольники

Поэтому я пытаюсь сгенерировать ландшафт, используя алгоритм движущихся кубов. На данный момент я реализую диффузное освещение (фрагментный шейдер). Я рассчитал нормали для каждой вершины и получил это:
результат

В левой части изображения отображаются нормали (для каждой вершины и треугольника) и каркас, справа — освещенный пейзаж с того же угла камеры.

Итак, мне любопытно, что я делаю не так?

Я вычисляю нормали так:

for (int t = 0; t < all_triangles.size(); t++) {

Vertex v0 = all_vertices[triangle.get_vertex(0)];
Vertex v1 = all_vertices[triangle.get_vertex(1)];
Vertex v2 = all_vertices[triangle.get_vertex(2)];

QVector3D edge1 = v1 - v0;
QVector3D edge2 = v2 - v0;

QVector3D normal = QVector3D::crossProduct(edge1, edge2);
//        triangle.set_normal(normal.normalized());

for (int v = 0; v < 3; v++) {
all_vertices[triangle.get_vertex(v)].add_normal(normal.normalized());
}
}

for (int v = 0; v < all_vertices.size(); v++) {
auto normal = all_vertices[v].get_normal();
normal.normalize();
all_vertices[v].set_normal(normal);

}

обн: vcs

источник битбакета

1

Решение

Ваша математика верна.
Вы, нормальные, выглядите нормально, но на 100% очень сложно понять вашу картину.

Общий подход для устранения таких проблем:
— плоское затенение (без нормального сглаживания)
— используйте треугольник / вершину нормали в качестве цвета для визуализации нормалей

Также, пожалуйста, поделитесь своим кодом затенения.

1

Другие решения

Это нормально для марширующих кубов. Это известная проблема алгоритма с таким техническим названием, как избыточные треугольники. Существует очень простая настройка для этого, если вам нужно меньше треугольников и вы не возражаете добавить линию сравнения для каждой вершины, исправьте то, чтобы привязать значения iso к углам кубов, если они более чем на 95% ближе к ним. Оптимизация MC очень крутая, лучше всего было бы воспринимать октри использованные кубы и изменять их размер в зависимости от сложности или плоскостности поверхности в этой зоне. есть отличные статьи на эту тему.

Вот демонстрация быстрого исправления путем привязки значений к углам, если близость пересечения ребер к углу меньше 5% или более 95%, настраивается, можно попробовать 90%, если хотите.

Общий MC:
введите описание изображения здесь

Простейшая возможная оптимизация:
введите описание изображения здесь

SnapMC похож:

введите описание изображения здесь

1

Несколько вещей, чтобы попробовать:

(1) Вес ваших нормалей. add_normal (normal.normalized () * weight), где weight может иметь много значений, например площадь треугольника или внутренний угол

(2) Вычислите нормаль из вашей области. Вы получаете поверхность, где f (x, y, z) = 0. Оцените f (x-eps, y, z) -f (x + eps, y, z), чтобы получить нормальный x, то же самое для y, z.

(3) Просто размыть это. Для каждой вершины добавьте все смежные нормали по ребрам и средним.

Я думаю, что вы хотите (2). Особенно для местности.

0
По вопросам рекламы [email protected]