再补充一点细节。假设给定一个形状的描述,例如“这里是一个立方体,在这里与一个球相交,在这里减去一个圆柱体”,我希望能够计算出一个多边形网格。
主要有两种方法。如果你有一组多边形形状,可以为每个形状创建一个BSP树,然后将这些BSP树合并。来自维基百科,
1990年Naylor、Amanatides和Thibault提供了一种算法,用于合并两个BSP树,从而从两个原始树形成一个新的BSP树。这提供了许多好处,包括:将由BSP树表示的移动对象与静态环境(也由BSP树表示)合并,对于多面体非常高效的CSG操作,O(logn * logn)的精确碰撞检测,并且透明表面的正确排序包含在两个相互穿插的物体中(已用于X射线视觉效果)。
该论文可在此处找到Merging BSP trees yields polyhedral set operations。
或者,每个形状可以表示为空间函数(例如到表面的符号距离)。只要将表面定义为函数等于零的位置,就可以使用(MIN ==交集),(MAX ==联合)和(NEGATION = not)运算符组合这些函数以模拟集合操作。然后,可以使用像Marching Cubes这样的技术提取组合函数等于零的位置作为结果表面。也可以使用更好的表面提取方法,例如Dual Marching Cubes或Dual Contouring。当然,这将导致真实CSG表面的离散近似。我建议使用Dual Contouring,因为它能够重构像立方体角落这样的尖锐特征。
这里是一些可能有用的Google学术链接。
从摘要中可以看出,基本思想是从CSG模型中可用的体积数据生成点云,然后使用一些更常见的算法在三维空间中生成面网格来适应该点云。
编辑:做进一步的研究,这种操作被称为“从CSG到B-Rep(边界表达)的转换”。搜索该字符串会导向一个有用的PDF文件:
http://www.scielo.br/pdf/jbsmse/v29n4/a01v29n4.pdf
而且,进一步的信息是,关键算法被称为“Marching Cubes Algorithm”。基本上,CSG模型用于使用体素创建物体的体积模型,然后使用Marching Cubes算法将体素数据转换为3D网格。igl::mesh_boolean(VA,FA,VB,FB,"union",VC,FC);
VA是一个#VA乘3的顶点位置矩阵,FA是一个#FA乘3的三角形索引矩阵,等等。libigl中使用的技术与Joe答案中提到的两种技术不同。所有的三角形对都会相互交叉(使用空间加速),然后产生的子三角形被归类为属于输出表面或不属于输出表面。
我在BRL-CAD应用程序MGED中有一些运气,可以使用CSG通过相交平面构造凸多面体,然后使用命令行g-stl命令提取边界表示。请查看http://brlcad.org/。 马尔科姆