给定布尔函数,渲染任意CSG实体

本文关键字:任意 CSG 实体 布尔 函数 | 更新日期: 2023-09-27 17:50:55

我希望实现我自己的CSG类机器人项目,我正在考虑实现每个实体作为返回布尔值的函数,给定一个3D点;如果3D点包含在实体内,此函数将返回true。我发现用这种方法,我可以很容易地进行立体的并、交、减法运算。

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

值得注意的一件有趣的事情是,如果我能推导出诸如固体的质心之类的东西,那将是有用的。

提前感谢!李。

给定布尔函数,渲染任意CSG实体

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

既然你在c#中工作,请检查这个库,它是开源的,可以免费使用。

https://github.com/johnmott59/CGSinCSharp

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

我的建议是,你转而寻找一个高质量的计算几何库(理想情况下,由良好的学术背景支持并作为开源发布)。CGAL是一个很好的选择。

如果速度不是一个巨大的优先级(即/你可以在一个单独的工具离线解决问题),这个问题是足够普遍的问题,其他人已经做了很多艰苦的工作。查看OpenSCAD"The Programmers Solid 3D CAD modelmodeler",它使用CGAL进行布尔运算。

如果你需要在非常低级和非常高级的接口之间进行折衷,SolidCode可能是一个不错的中间api,它可以让你像从Python代码中调用命令一样调用OpenSCAD。

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