建模由表面交叉定义的3d单元格

时间:2010-11-23 01:06:23

标签: 3d intersection modeling mesh geometry-surface

我正在尝试创建由任意曲面的交集定义的单元格的交互式三维表示。我很难弄清楚如何从中创建一个网格(或者是否有一些比我应该用来表示3d体积的网格更好的东西?)。每个表面s由平面,球体,圆柱体,圆锥等的解析表达式给出,如s = f(x,y,z)= 0,如下所示:

enter image description here

对于每个细胞,我有一个表面列表和每个表面的+/-感。通过这种方法,可以很容易地确定x,y,z点是否位于单元格内,方法是将该点插入每个边界曲面的方程式中,如果结果为+所有+曲面,并且 - 对于所有曲面,则表示点在里面。显然,如果任何表面的结果为零,则该点位于该表面上。

我可以测试数千个网格点,注意每个单元格位于该单元格内的那些点,然后使用这些点的最外面的点来为该单元格创建网格。但是,我有成千上万的细胞,这根本就不够快。与其他细胞相比,许多细胞的体积比非常小或比例都很小,所以如果我这样做,我需要一个非常精细的点数。

有人能建议将以这种方式定义的单元格放入静态三维模型的有效方法吗?是否有任何类型的库可以使用这种可以为我构建3d网格的几何规范?我错过了一些明显的东西吗?

谢谢, 尼克

1 个答案:

答案 0 :(得分:1)

作为一般问题,这很难:我认为它基本上是一般的非线性规划问题。如果您的边界是由任意函数生成的,那么即使是一个这样的函数也可能存在任意数量的单元格;如果没有关于这些功能的更多信息,我认为你不能比检查网格点做得更好。

如果你对你的功能有所了解(例如,平面,球体,圆柱体和圆锥体都是圆锥形),你可能会做得更好。无论如何,您可能希望从组合方法开始;比如说,给定任何3个边界,确定是否有任何三个相交的点。

在任何情况下,一旦识别出单元格的边角和边缘,就可以使用基于网格的方法来构建显示网格 - 例如,使用轴对齐平面切割曲面,以确定顶点和三角形到发送到您选择的3D图形库。


另一个想法是:由于你是用f(x,y,z)=0定义表面,你可以先从一堆点开始,然后用牛顿方法步骤或其他方法将它们数字化地移动到附近的表面上:

point p = (x,y,z)
scalar value = f(p)
while abs(value) > epsilon:
  vector gradient = gradient_of_f(p)
  p -= gradient * (value / dot(gradient,gradient))
  value = f(p)

类似的东西应该允许你近似边缘和角点。虽然可能很难弄清楚如何将这些类型的点连接到网格中......