Запись простой поверхностной сетки с помощью CGAL выводит только 2 грани.

Вопрос или проблема

Я тестирую библиотеку CGAL на машине с Linux. В рамках моего тестирования я хотел создать простую поверхностную сетку куба.

Это мой тест Catch2:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>

#include <catch2/catch_test_macros.hpp>
#include <cmath>
#include <fstream>
#include <iostream>

using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
using Mesh = CGAL::Surface_mesh<Kernel::Point_3>;

// Функция для создания приближенной параметрической сферы
Mesh create_mesh(double size) {
    Mesh mesh;

    // Куб.
    // Определите 8 вершин куба
    auto v0 = mesh.add_vertex(Kernel::Point_3(0, 0, 0));
    auto v1 = mesh.add_vertex(Kernel::Point_3(size, 0, 0));
    auto v2 = mesh.add_vertex(Kernel::Point_3(size, size, 0));
    auto v3 = mesh.add_vertex(Kernel::Point_3(0, size, 0));
    auto v4 = mesh.add_vertex(Kernel::Point_3(0, 0, size));
    auto v5 = mesh.add_vertex(Kernel::Point_3(size, 0, size));
    auto v6 = mesh.add_vertex(Kernel::Point_3(size, size, size));
    auto v7 = mesh.add_vertex(Kernel::Point_3(0, size, size));

    // Определите 6 граней куба (каждая грань - четырехугольник, состоящий из 2 треугольников)
    mesh.add_face(v0, v1, v2, v3);  // Низ
    mesh.add_face(v4, v5, v6, v7);  // Верх
    mesh.add_face(v0, v4, v7, v3);  // Лево
    mesh.add_face(v1, v5, v6, v2);  // Право
    mesh.add_face(v0, v4, v5, v1);  // Спереди
    mesh.add_face(v3, v7, v6, v2);  // Сзади

    return mesh;
}

TEST_CASE("Экспорт OBJ куба") {
    const std::string filename = "test_output.obj";

    // Удалить файл, если он существует, чтобы начать с чистого листа
    std::remove(filename.c_str());

    auto mesh = create_mesh(1);
    // Используйте CGAL для сохранения комбинированной сетки в формате OBJ
    CGAL::IO::write_OBJ(filename, mesh);

    REQUIRE(std::ifstream(filename).good());
}

Проблема

К моему удивлению, куб не полный. В файле OBJ для куба записаны только две грани. Я не понимаю, в чем дело. Что я делаю не так?

Это файл test_output.obj:

# файл записан инструментом CGAL в формате Wavefront obj
# 8 вершин
# 16 половинных рёбер
# 2 фасета


# 8 вершин
# ------------------------------------------

v 0 0 0
v 1 0 0
v 1 1 0
v 0 1 0
v 0 0 1
v 1 0 1
v 1 1 1
v 0 1 1

# 2 фасета
# ------------------------------------------

f  1 2 3 4
f  5 6 7 8

# Конец формата Wavefront obj #

Ответ или решение

Исправление Проблемы Выхода Модели Cube с использованием CGAL

Ваша задача с использованием библиотеки CGAL для создания кубической модели привела к результату, в котором отображаются только две грани. Это поведение может быть результатом нескольких причин. Давайте рассмотрим основные проблемы, которые могут вызывать это.

Возможные Причины

  1. Недостаточно грани для полной мортализации куба:
    Ваша реализация использует метод add_face для добавления граней. При этом каждая грань куба фактически является четырехугольником. CGAL может обрабатывать только треугольники как плоские грани. Таким образом, вам необходимо разбить каждую четырехугольную грань куба на два треугольника.

  2. Расчет нормалей:
    Если для граней не вычисляются нормали, CGAL может не распознавать их как валидные. Убедитесь, что настройки нормалей активны и корректны для вашей сетки.

  3. Ошибки в структуре сетки:
    Проверьте, правильно ли созданы и связаны вершины и ребра. Некорректные связи или дубликаты могут приводить к отсутствию или искажению некоторых граней.

Исправление Кода

Изменим ваш код, чтобы правильно создавать треугольные грани для куба. Мы будем добавлять треугольники вместо четырехугольников.

// Определяем грани куба как два треугольника
mesh.add_face(v0, v1, v2);  // Нижняя грань
mesh.add_face(v0, v2, v3); 

mesh.add_face(v4, v5, v6);  // Верхняя грань
mesh.add_face(v4, v6, v7); 

mesh.add_face(v0, v4, v7);  // Лицевая грань
mesh.add_face(v0, v7, v3); 

mesh.add_face(v1, v5, v6);  // Задняя грань
mesh.add_face(v1, v6, v2); 

mesh.add_face(v0, v1, v5);  // Передняя грань
mesh.add_face(v0, v5, v4); 

mesh.add_face(v3, v2, v6);  // Задняя грань
mesh.add_face(v3, v6, v7); 

После внесения этих изменений, ваша функция create_mesh будет добавлять все шесть граней куба корректно, и при экспорте в формат OBJ вы получите полное представление куба.

Заключение

Теперь, после внесений исправлений, ваша модель куба должна включать все его грани при экспорте в формате OBJ. Обратите внимание на важность работы с треугольниками в 3D графике, а также на детальные проверки структуры сетки. Убедитесь, что все связи и нормали корректны, что существенно повлияет на правильное представление вашей 3D модели.

Оцените материал
Добавить комментарий

Капча загружается...