我想在非凸多面体对象上实现布尔运算,并想用OpenGL渲染它们。我读过关于在多面体上进行布尔运算的两种主要技术:边界表示(BReps)和构造实体几何(CSG)。根据一些论文,使用CSG实现布尔应该更容易,所以我考虑使用CSG而不是BREP。我知道BREP通过顶点和多边形来描述几何体,而CSG使用基本的基本对象,如在树结构中组合的圆柱体或球体。我知道在BREP上执行布尔运算是通过切割相交的多边形并移除那些不需要的多边形来实现的(取决于运算是并集还是差集…)。但是布尔运算是如何在CSG中实现的呢?如何实现CSG布尔运算?我已经在互联网上找到了这个例子http://evanw.github.io/csg.js/或https://www.andrew.cmu.edu/user/jackiey/resources/CSG/CSG_report.pdf奇怪的是,这些算法只是使用BREP作为布尔值。所以我不明白CSG的优势应该在哪里,也不明白为什么CSG布尔值应该更容易实现。
你在说苹果和梨。
CSG是一种从原始实体描述复杂实体的通用方法,如果你愿意的话,这是一种对实体的"算术"。这个过程与这些固体的精确表示无关。替代/补充建模技术的示例不包括曲面生成、广义圆柱体、代数方法。。。
BRep是基于顶点/边/面图结构的实体的可能表示之一。一些替代表示是空间占用模型,例如体素和八叉树。
通常,CSG表达式是使用手头的表示进行评估的;在某些情况下,原始CSG树保持原样,在叶上具有基本基元。
多面体BRep模型在概念上易于实现;无论如何,CSG表达式的评估是艰巨的(多面体相交引起了令人不安的数值和拓扑问题)。
BRep的渲染需要对面进行三角测量,然后可以通过标准渲染管道进行处理。
体素模型既易于实现,又使CSG表达式的处理变得琐碎;另一方面,它给出了形状的粗略近似。
原始CSG树可用于光线跟踪技术的直接渲染:在光线遍历所有基本体后,使用CSG表达式组合光线部分。这种方法以高计算成本为代价,将相对简单的实现与准确度相结合(所有内容都需要在图像的每个像素和每个视图上重复)。
CSG模型仅表示应用于变换后的条件的所需运算(并集、交集等)。它并不会真正修改基本体(例如修剪立方体的角)。你之所以能在屏幕上看到一个复杂的模型,是因为渲染引擎正在发挥作用。当显示CSG模型时,通常有两种方法:第一种方法是在飞行中将其转换为Brep模型,第二种方法是使用CSG直接显示算法,该算法通常基于扫描线算法。
因此,如果你已经有了一个好的CSG渲染引擎,那么你就不必担心修剪Brep模型,你的生活确实更轻松了。但是,如果必须自己编写渲染引擎,使用CSG将不会节省那么多时间。
在我看来,CSG一点也不容易
- 但它更精确
- 没有使用过的圆柱体、球体
- 取而代之的是使用曲线的旋转曲面
CSG 上的操作
- 如果在具有相同轴的旋转曲面上执行(bool)操作
- 然后你在曲线上做运算。。。(这是CSG比BRep更好的地方)
- 如果轴不相同,则必须在CSG树中创建新条目
- 也可以通过简单地更新它们的大小来完成对兼容对象的操作(如具有相同连接/相交表面的长方体连接/切割)
- 但大多数实现都不做这样的事情,而是将每个操作存储到树中
- 这使得在树发生任何变化后渲染速度变慢
- 此外,渲染器必须执行所有操作,而不是在其自身的操作期间,而是在渲染或预渲染阶段
- 这使得CSG实现更加复杂
- 我在其中看到的唯一优点是该模型可以具有解析表示
- 这要准确得多,尤其是如果有多个操作