在具有颜色的3d网格上的CGAL布尔运算

时间:2018-02-05 15:24:12

标签: c++ boolean geometry mesh cgal

我想要做的是在2个模型上执行CGAL布尔运算符(联合运算符),每个模型的每个顶点都有RGB颜色。但结果并没有保留颜色信息。 也许你知道如何解决这个问题。

以下是进行布尔运算的模型(coff格式):

model1

model2

image of input models

以下是我使用的代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/Polyhedron_items_with_id_3.h>

#include <CGAL/Polygon_mesh_processing/corefinement.h>

#include <fstream>


typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Polyhedron_3<K, CGAL::Polyhedron_items_with_id_3> Mesh;

namespace PMP = CGAL::Polygon_mesh_processing;

int main(int argc, char* argv[])
{
    const char* filename1 = (argc > 1) ? argv[1] : "data/b1.off";
    const char* filename2 = (argc > 2) ? argv[2] : "data/b2.off";
    std::ifstream input(filename1);

    Mesh mesh1, mesh2;
    if (!input || !(input >> mesh1))
    {
        std::cerr << "First mesh is not a valid off file." << std::endl;
        return 1;
    }
    input.close();
    input.open(filename2);
    if (!input || !(input >> mesh2))
    {
        std::cerr << "Second mesh is not a valid off file." << std::endl;
        return 1;
    }

    Mesh out;
    bool valid_union = PMP::corefine_and_compute_union(mesh1, mesh2, out);

    if (valid_union)
    {
        std::cout << "Union was successfully computed\n";
        std::ofstream output("union.off");
        output << out;
        return 0;
    }
    std::cout << "Union could not be computed\n";
    return 1;
}

我最后得到的是正确的网格,但不保留颜色信息。 有没有机会修复颜色信息?

union model as result

2 个答案:

答案 0 :(得分:1)

目前还不可能。 corefine中有一个隐藏参数来保留这些属性,但布尔操作的输出构建器缺少一个访问者(我希望有时间在CGAL 4.13中添加)。

有一些解决方法,但没有一个可以处理所有可能的情况。

修改: 在CGAL 4.13中,可以通过传入一个访问者的命名参数来实现。这个PR是添加支持的,并且已经合并到主分支中。以下example显示了如何执行此操作。

答案 1 :(得分:0)

  

我发现cgal库中有一个命令加载“coff”格式   其中包含RGB颜色。但我不知道如何使用它。我的第一次   尝试是如何定义数据类型。

据我所知,只有Surface_mesh数据结构能够使用COFF文件。您可以在Polyhedron / demo / Polyhedron中查看Surface_mesh_io_plugin的代码。 COFF格式是一个很好记录的标准。