Algorithm 构造实体几何网格

Algorithm 构造实体几何网格,algorithm,language-agnostic,graphics,geometry,wireframe,Algorithm,Language Agnostic,Graphics,Geometry,Wireframe,如果使用技术构造形状,如何构造线框网格进行渲染? 我知道直接渲染CSG形状的算法,但我只想将其转换为线框网格一次,以便“正常”渲染 再加一点细节。给出一个形状的描述,比如“这里是一个立方体,这里是一个球体的交点,这里减去一个圆柱体”,我想能够计算一个多边形网格。是一些可能有用的Google Scholar链接 根据我对这些摘要的了解,基本思想是从CSG模型中可用的体积数据生成点云,然后使用一些更常见的算法生成三维面网格以适合该点云 编辑:进一步研究后,这种操作称为“从CSG到B-Rep(边界表示

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

再加一点细节。给出一个形状的描述,比如“这里是一个立方体,这里是一个球体的交点,这里减去一个圆柱体”,我想能够计算一个多边形网格。

是一些可能有用的Google Scholar链接

根据我对这些摘要的了解,基本思想是从CSG模型中可用的体积数据生成点云,然后使用一些更常见的算法生成三维面网格以适合该点云

编辑:进一步研究后,这种操作称为“从CSG到B-Rep(边界表示)的转换”。在该字符串上搜索可得到有用的PDF:


为了进一步了解,密钥算法称为“”。本质上,CSG模型用于创建具有体素的对象的体积模型,然后使用Marching Cubes算法从体素数据创建3D网格。

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

1990年Naylor、Amanatides和Thibault 提供一个合并两个对象的算法 bsp树,从中形成新的bsp树 原来的两棵树。这就提供了 许多好处包括:合并 用BSP表示的移动对象 具有静态环境的树(也包括 由BSP树表示),非常 多面体上的高效CSG操作, O(logn)中的精确碰撞检测 *对数n),以及两个 互穿对象(已完成) 用于x射线视觉效果)

这张纸就在这里


或者,每个形状可以表示为空间上的函数(例如到曲面的有符号距离)。只要曲面定义为函数等于零的位置,就可以使用(MIN==相交)、(MAX==并集)和(否定=非)运算符组合函数,以模拟集合操作。然后,可以使用类似Marching Cubes的技术将生成的曲面提取为组合函数等于零的位置。还可以使用更好的曲面提取方法,如双重行进立方体或双重轮廓。当然,这将导致真实CSG曲面的离散近似。我建议使用,因为它能够重建立方体的棱角等尖锐特征。

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


例如,假设您的对象是立方体和圆柱体的并集,并假设这两个对象都是四面体。为了计算结果对象的边界表示,首先标记每个基本体对象四面体的所有边界面。然后,执行并集操作:如果两个四面体不相交,则无需执行任何操作;两个四面体都必须存在于生成的多面体中。如果它们相互交叉,那么就有许多案件(可能有十几起左右)需要处理。在每种情况下,两个四面体的体积都需要以尊重曲面约束的方式重新进行三角剖分。与更复杂的形状相反,您只需要担心四面体,这使得这一点变得更容易。在此过程中,需要保留边界面标签,以便在最终的四面体集合中,可以提取边界面以形成曲面的三角形网格。

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

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

另请参见“三角形多面体的构造实体几何”(1990)Philip M.Hubbard

我在BRL-CAD应用程序MGED中遇到了一些运气,我可以使用CSG通过相交平面构造凸多面体,然后使用命令行g-stl命令提取边界表示。检查
马尔科姆

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


式中,VA是a#VA乘以3个顶点位置的矩阵,FA是a#FA乘以3个三角形索引的矩阵,依此类推。libigl中使用的技术与Joe回答中提到的两种不同。所有成对的三角形彼此相交(使用空间加速度),然后生成的子三角形被分类为是否属于输出曲面。

您能更详细地解释一下吗?如果我理解正确,您的意思是为每个基本csg形状创建一个网格,然后在网格上执行设置操作?基本思想是在更简单的基本体(简单体)而不是实际的csg基本体中执行操作。我添加了一个更详细的示例,但是如何处理四面体-四面体相交的所有情况的实际细节比我在这里描述的要复杂得多(我从来没有实现过这样的方法,也没有见过实现,但想法非常简单)。我不认为这会降低复杂性。相交仍然是困难的,四面体化一个给定的曲面充其量是不平凡的
igl::mesh_boolean(VA,FA,VB,FB,"union",VC,FC);