2

我想对非凸多面体对象实现布尔运算,并想用 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 布尔值应该更容易实现。

4

3 回答 3

2

你不知何故在谈论苹果和梨。

CSG 是一种从原始实体描述复杂实体的通用方法,如果您愿意,它是实体的“算术”。此过程与这些实体的精确表示无关。替代/互补建模技术的示例包括无曲面生成、广义圆柱体、代数方法......

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

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

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

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

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

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

于 2014-09-29T07:56:36.370 回答
1

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

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

于 2014-09-24T20:59:20.783 回答
0

在我看来,CSG 一点也不简单

  • 但它更精确
  • 没有使用过的圆柱体,球体,...
  • 而是使用曲线的旋转表面

CSG上的操作

  • 如果您在具有相同轴的旋转表面上执行(布尔)操作
  • 然后你只需对曲线进行操作......(这是 CSG 比 BRep 更好的地方)
  • 当轴不相同时,您必须在 CSG 树中创建新条目
  • 也可以通过简单地更新它们的大小来完成对兼容对象的操作(例如具有相同连接/相交表面的框连接/切割)......
  • 但大多数实现不做这样的事情,而是每个操作都存储到树中
  • 在树中发生任何更改后,这会使渲染变慢
  • 渲染器也必须在渲染或预渲染阶段而不是在它自己的操作期间执行所有操作
  • 这使得 CSG 实现更加复杂。
  • 我在其中看到的唯一优点是模型可以具有分析表示
  • 这要准确得多,特别是如果在它上面有多个操作...
于 2014-09-25T07:27:34.683 回答