Graphics 如何使用CSGTree进行多个布尔运算

Graphics 如何使用CSGTree进行多个布尔运算,graphics,computational-geometry,cgal,csg,libigl,Graphics,Computational Geometry,Cgal,Csg,Libigl,我试图利用libigl一次执行多个布尔运算。在链接教程中,只有这一行: //计算(A)的结果∩ B) \((C)∪ (D)∪ (E) igl::copyleft::cgal::CSGTree CSGTree= {{VA,FA},{VB,FB},“i”},{{{VC,FC},{VD,FD},“u”},{VE,FE},“u”},“m”}; 我想不出如何使用这个工具。任何人都可以通过样板示例提供理想的帮助吗?根据libigl教程: Libigl在内部使用精确算法稳健地构造中间布尔结果。将此结果“舍入

我试图利用libigl一次执行多个布尔运算。在链接教程中,只有这一行:

//计算(A)的结果∩ B) \((C)∪ (D)∪ (E)
igl::copyleft::cgal::CSGTree CSGTree=
{{VA,FA},{VB,FB},“i”},{{{VC,FC},{VD,FD},“u”},{VE,FE},“u”},“m”};

我想不出如何使用这个工具。任何人都可以通过样板示例提供理想的帮助吗?

根据libigl教程:

Libigl在内部使用精确算法稳健地构造中间布尔结果。将此结果“舍入”为浮点(甚至双精度),如果重新注入到进一步的布尔运算中,将导致问题。为了促进CSG树操作并鼓励调用方不要显式多次调用igl::copyleft::cgal::mesh_boolean,libigl实现了一个类igl::copyleft::cgal::CSGTree

简单地说,您可以使用
mesh\u boolean
函数构造网格,但在这种情况下,您必须明确注意中间计算的稳健性。
CSGTree
类会自动为您执行此操作,因为它使用精确的算法进行所有带坐标的中间计算。
CSGTree
类的另一个好处是,您可以在一行代码中构建多级CSG树。下面的示例演示如何从两个网格构造最简单的CSG树并将其可视化:

#包括
#包括
#包括
#包括
int main()
{
//----荷载网格#1
本征::矩阵XXD V1;
本征::MatrixXi F1;
igl::读取三角形网格(“data/sphere.obj”,V1,F1);
//----荷载网格#2
本征::矩阵x2d V2;
本征::MatrixXi F2;
igl::读取三角形网格(“data/xcylinder.obj”,V2,F2);
//----组合网格1和2
const-igl::copyleft::cgal::CSGTree t{{V1,F1},{V2,F2},“union”};
//-----绘制组合网格
const auto V=t.castu V();
常数自动F=t.F();
igl::opengl::glfw::查看器;
viewer.data().设置网格(V,F);
viewer.launch();
}
这种单行构造是可能的,因为
CSGTree
具有以下构造函数(以及其他构造函数):

如上图所示-如果需要,可以通过
cast_V
模板化函数将生成的坐标数组转换为双倍数组-例如,为了可视化。此可视化的结果如下所示:

有,但还不太清楚……还有,有一个只是在做一个操作。。。
CSGTree(const CSGTree & A, const CSGTree & B, const MeshBooleanType & type)