构造实体几何网格

时间:2010-01-04 23:11:10

标签: algorithm language-agnostic graphics geometry wireframe

如果我使用constructive solid geometry技术构建形状,我如何构建线框网格以进行渲染? 我知道直接渲染CSG形状的算法,但我想将它转换为线框网格一次,以便我可以“正常”渲染它

添加更多细节。给定一个形状的描述,例如“这里的立方体,这里与球体相交,在这里减去一个圆柱体”我希望能够计算出一个多边形网格。

7 个答案:

答案 0 :(得分:21)

主要有两种方法。如果您有一组多边形形状,则可以为每个形状创建BSP树,然后可以合并BSP树。来自维基百科,

  

1990 Naylor,Amanatides和Thibault   提供合并两个的算法   bsp树从中形成一个新的bsp树   两棵原始的树木。这提供了   许多好处包括:结合   移动BSP代表的对象   树木与静态环境(也   由BSP树代表,非常   对多面体进行有效的CSG操作,   O中的精确碰撞检测(log n   * log n),以及包含在两个中的透明表面的正确排序   互穿物体(已经   用于X射线视觉效果)。

这篇论文在Merging BSP trees yields polyhedral set operations找到。

或者,每个形状可以表示为空间上的函数(例如到表面的有符号距离)。只要将曲面定义为函数等于零的位置,就可以使用(MIN == intersection),(MAX == union)和(NEGATION = not)运算符组合函数来模拟集合运算。然后可以使用诸如Marching Cubes之类的技术将得到的表面提取为组合函数等于零的位置。也可以使用更好的表面提取方法,如Dual Marching Cubes或Dual Contouring。当然,这将导致真实CSG表面的离散近似。我建议使用Dual Contouring,因为它能够重建像立方体角落这样的尖锐特征。

答案 1 :(得分:4)

这些库似乎可以满足您的需求:

www.solidgraphics.com/SolidKit/ carve-csg.com/ gts.sourceforge.net /

答案 2 :(得分:3)

另见“Triangulated Polyhedra的构造实体几何”(1990)Philip M. Hubbard doi:10.1.1.34.9374

答案 3 :(得分:2)

Here是一些可能有用的Google学术搜索链接。

从我所知的摘要中,基本思想是从CSG模型中可用的体积数据生成点云,然后使用一些更常见的算法在3D中生成面部网格以适合该点云。

编辑:进行一些进一步的研究,这种操作称为“从CSG转换为B-Rep(边界表示)”。搜索该字符串会产生有用的PDF:

http://www.scielo.br/pdf/jbsmse/v29n4/a01v29n4.pdf

并且,有关更多信息,关键算法称为“Marching Cubes Algorithm”。本质上,CSG模型用于创建具有体素的对象的体积模型,然后使用Marching Cubes算法从体素数据中创建3D网格。

答案 4 :(得分:1)

您可以尝试对每个基元进行三角测量(四面体化),然后在四面体网格上执行布尔运算,这样“更容易”,因为您只需要担心四面体 - 四面体运算。然后,您可以执行边界提取以获得B-rep。由于您可以分析地了解基元的形状,因此可以构建基元的自定义四面体,以满足您的需求,而不是依赖于网格生成库。

例如,假设您的对象是立方体和圆柱体的并集,并假设您具有两个对象的四面体化。为了计算结果对象的边界表示,首先标记每个基本对象的四面体的所有边界面。然后,你执行联合操作:如果两个四面体是不相交的,那么就不需要做任何事了;两个四面体必须存在于得到的多面体中。如果它们相交,那么有许多情况需要处理(可能大约十几个)。在这些情况中的每一种情况下,两个四面体的体积需要以尊重表面约束的方式重新三角化。由于您只需要担心四面体,而不是更复杂的形状,因此这样做更容易一些。边界小平面标签需要在过程中保持,以便在最终的四面体集合中,可以提取边界小平面以形成表面的三角形网格。

答案 5 :(得分:1)

我对BRL-CAD应用程序MGED运气不错,我可以通过使用CSG交叉平面构建凸多面体,然后使用命令行g-stl命令提取边界表示。检查http://brlcad.org/ 马尔科姆

答案 6 :(得分:0)

如果您可以将输入基元转换为多面体网格,那么您可以使用libigl的C ++网格布尔例程。以下计算网格(VA,FA)和另一个网格(VB,FB)的并集:

igl::mesh_boolean(VA,FA,VB,FB,"union",VC,FC);

其中VA是#VA乘3个顶点位置矩阵,FA是#FA乘3个矩阵的三角形指数进入VA,依此类推。 libigl中使用的技术与Joe的答案中提到的技术不同。所有三角形对彼此相交(使用空间加速度),然后生成的子三角形被归类为属于输出表面。