2

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

在此处输入图像描述

对于每个单元格,我都有一个表面列表和每个表面的 +/- 意义。有了这个,很容易确定一个 x,y,z 点是否位于单元格内,方法是将该点插入每个边界表面的方程中,如果结果是所有 + 表面的 + 和 - 所有 - 表面的点位于里面。显然,如果任何表面的结果为零,则该点位于该表面上。

我可以测试数千个网格点,为每个单元格记下位于该单元格内的那些点,然后使用这些点的最外层为该单元格创建一个网格。但是,我有数千个细胞,这根本不够快。与其他单元格相比,许多单元格非常小或纵横比低,所以如果我要这样做,我需要一个非常精细的点网格。

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

谢谢,尼克

4

1 回答 1

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)

类似的东西应该可以让你近似边缘和角落点。可能更难弄清楚如何将这些类型的点连接到一个网格中,虽然......

于 2010-11-24T21:46:03.300 回答