构造实体几何与边界表示

时间:2014-09-24 11:11:36

标签: computational-geometry csg

我想在非凸多面体对象上实现布尔运算,并希望用OpenGL渲染它们。我已经阅读了关于在多面体上进行布尔运算的两种主要技术:边界表示(BReps)和构造实体几何(CSG)。 根据一些论文,用CSG实现布尔应该更容易,所以我考虑使用CSG而不是BReps。 我知道BReps通过顶点和多边形描述几何,而CSG使用基本的原始对象,如圆柱体或球体,它们在树结构中结合在一起。 我知道在BReps上执行布尔是通过切割相交的多边形并移除那些不需要的多边形来实现的(取决于操作符是联合或差异还是......)。 但是如何用CSG实现布尔运算?如何实现CSG布尔运算?我已经在互联网上查找了例如http://evanw.github.io/csg.js/https://www.andrew.cmu.edu/user/jackiey/resources/CSG/CSG_report.pdf 奇怪的是,这些算法只使用BReps作为他们的布尔值。所以我不明白CSG的优势在哪里,或者为什么CSG布尔应该更容易实现。

3 个答案:

答案 0 :(得分:1)

CSG模型只表示应用于转换的prmitives的所需操作(联合,交叉点等)。它并没有真正修改基元(例如修剪立方体的角落)。您可以看到屏幕上显示复杂模型的原因是渲染引擎正在执行此操作。在显示CSG模型时,通常有两种方式:第一种方法是动态转换为Brep模型,第二种方式是使用CSG直接显示算法,该算法通常基于扫描线算法。

所以,如果你已经有一个好的CSG渲染引擎,那么你不必担心修剪Brep模型,你的生活确实更容易。但是如果你必须自己编写渲染引擎,那么通过使用CSG就不会节省太多时间。

答案 1 :(得分:1)

你在某种程度上谈论苹果和梨。

CSG是描述原始复杂实体的一般方法,算法"如果你想要固体该过程与这些固体的精确表示无关。替代/补充建模技术的例子是免于表面生成,广义圆柱,代数方法......

BRep是基于顶点/边/面图结构的实体的可能表示之一。一些替代表示是空间占用模型,例如体素和八叉树。

通常,使用手头的表示来评估CSG表达式;在某些情况下,原始的CSG树保持原样,在叶子上有基本原语。

多面体BRep模型在概念上很容易实现;无论如何,CSG表达式评估是艰巨的(多面体交叉引起了不安的数值和拓扑问题)。

渲染BRep需要对面进行三角测量,然后可以通过标准渲染管道进行处理。

体素模型既易于实现又使得CSG表达式处理起来很简单;另一方面,它给出了形状的粗略近似值。

原始CSG树可用于通过光线跟踪技术进行直接渲染:在通过光线遍历所有图元之后,使用CSG表达式组合光线截面。这种方法结合了相对简单的实现和准确性,代价是高计算成本(一切都需要在图像的每个像素和每个视图上重复)。

答案 2 :(得分:0)

在我看来CSG并不容易

  • 但更准确
  • 没有使用过气缸,球体......
  • 而是使用曲线的旋转表面

CSG的行动

  • 如果您对具有相同轴的旋转曲面执行(bool)操作
  • 然后只是你对曲线进行操作......(这是CSG比BRep更好的地方)
  • 当轴不相同时,您必须在CSG树中创建新条目
  • 也可以通过简单地更新它们的大小来完成对兼容对象的操作(比如用相同的连接/交叉表面连接/切割框)...
  • 但是大多数实现都没有这样做,而是每个操作都存储在树
  • ,这使得在树中的任何更改后渲染变慢
  • 此外,渲染必须完成所有操作,而不是在渲染或预渲染阶段
  • 的操作过程中
  • 使CSG实施更加复杂。
  • 我看到的唯一优势是模型可以有分析表示
  • 这是更准确的,特别是如果多个操作在它之上......