1

我正在为机器人项目实现我自己的 CSG 类,并且我正在考虑将每个实体实现为一个返回布尔值的函数,给定一个 3D 点;如果 3D 点包含在实体中,此函数将返回 true。我想通过这种方式,我可以轻松地执行实体的并集、交集和减法。

这足以执行碰撞检测等。本身,但我想实际渲染实体,所以我的问题是这个;如上所述,鉴于其布尔函数,是否有任何渲染实体的方法?我很乐意自己实现这一点,因为我想准确地知道发生了什么,这样我就可以根据需要简化并添加到代码中。如果这会让事情变得更容易,我也愿意接受以不同方式表示固体的建议!

需要注意的一件有趣的事情是,如果我可以推导出诸如实体的质心之类的东西,那将会很有用。

提前致谢!李。

4

2 回答 2

2

实现构造实体几何 (CSG) 的一般方法是通过实体的镶嵌多边形上的二进制空间分区 (BSP) 树。CSG 操作(联合、交集、减法)是通过对 BSP 树执行操作来完成的,从而产生另一个 BSP 树。BSP 结果包含作为操作结果的多边形。

由于您使用 C# 工作,请查看此库,它是开源且免费使用的。

https://github.com/johnmott59/CGSinCSharp

于 2016-09-13T20:07:04.303 回答
1

构造实体几何看起来很简单,但像大多数几何问题一样,有足够的微妙之处,你真的不想自己实现它,除非它是你工作/研究的核心。

我的建议是,您应该寻找一个高质量的计算几何库(最好有良好的学术血统支持并作为开源发布)。CGAL是一个不错的选择。

如果速度不是一个重要的优先级(即/您可以在单独的工具中离线解决问题),那么这个问题很常见,其他人已经做了很多艰苦的工作。查看OpenSCAD “The Programmers Solid 3D CAD Modeller”,它使用 CGAL 进行布尔运算。

如果您需要在非常低级和非常高级接口之间进行折衷,SolidCode可能不是一个糟糕的中间 api,它允许您从 Python 代码调用 OpenSCAD 之类的命令。

对于渲染,我建议您考虑将所有内容视为(三角)表面网格或体积网格,并使用 CSG 或任何其他工具(例如/搅拌器)作为数据输入的机制。您可能还会发现碰撞库很容易用于三角网格 - 虽然您可能会因使用 CSG 而获得一些运行时性能改进,但开发整个项目可能需要更长的时间。

于 2015-05-31T14:32:41.100 回答