在给定布尔函数的情况下渲染任意CSG实体?

时间:2015-05-28 07:06:20

标签: c# robotics csg

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

这足以执行碰撞检测。等等。本身,但我想实际渲染实体,所以我的问题是这个;有没有任何渲染实体的方法给出它的布尔函数如上所述?我非常乐意自己实现这一点,因为我希望理想地知道发生了什么,以便我可以根据需要简化和添加代码。如果它能让事情变得更容易,我也会接受以不同方式表示实体的建议!

有一点值得注意的是,如果我可以得到诸如实体的质心之类的东西,那将是有用的。

提前致谢! 李。

2 个答案:

答案 0 :(得分:2)

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

由于您正在使用C#,请查看此库,其开源并可免费使用。

https://github.com/johnmott59/CGSinCSharp

答案 1 :(得分:1)

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

我的建议是,您需要寻找一个高质量的计算几何库(理想情况下由良好的学术谱系支持并作为开源发布)。 CGAL是个不错的选择。

如果速度不是一个重要的优先事项(即/你可以在一个单独的工具中离线解决问题),那么这个问题很普遍,其他人已经做了很多艰苦的工作。查看OpenSCAD"程序员Solid 3D CAD建模器",它使用CGAL进行布尔操作。

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

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