在3D空间中的点之间进行插值以形成光滑表面的简单方法

时间:2008-11-24 02:37:24

标签: math 3d geometry

我正在努力想出一种简单而有效的方法来创建一个与许多给定“样本”点相交的光滑表面。

对于表面上的任何X,Y点,我在4个方向中的每个方向上识别最多4个采样点(X上的下一个较高点和较低点,然后是Y轴)。鉴于这一点,我想要一种计算在4个样本点之间插值的Z值的方法。

当然,给定4个采样点中的任何一个的X,Y位置的算法应输出该点的Z值。另请注意,可能少于4个采样点。

我猜测4个样本点的Z值的某些函数,不知何故被样本点的距离反向偏置,但我无法弄清楚如何做到这一点。

任何人都有任何关于这种简单方法的想法吗?

6 个答案:

答案 0 :(得分:10)

您可以通过构建Catmull-Rom样条曲线中的补丁来完成此操作。这些样条线将击中每个控制点,并且它们在一阶导数中是连续的(尽管不是第二个)。我也发现它们非常容易使用。数学很简单,直观,控制点略有变化。

在最高级别,每个补丁需要16个点(在数据集的边缘,您可以在同一个样条曲线中使用两次角点和边缘点。)

首先,您需要在4x4矩阵的每一行中对点 p [i] [j] 进行插值,以创建一组四个中间控制点 q [i ] 。这是我粗略的ASCII草图。

p00 p01 q0 p02 p03
p10 p11 q1 p12 p13
p20 p21 q2 p22 p23
p30 p31 q3 p32 p33

现在,您可以在这四个中间控制点中的每一个之间进行插值,以在表面上找到最终的花键点。

Here is a construction of the Catmull-Rom spline四点。在此示例中,您使用两侧的控制点 p [i-1] p [i] 进行插值 p [i-2] p [i + 1] u 是从0到1的插值因子。 τ定义为样条上的张力,会影响花键表面与控制点的紧密程度。

                 | 0   1   0    0 | | p[i−2] |
                 |−τ   0   τ    0 | | p[i−1] |
p(u) = 1 u u2 u3 | 2τ τ−3 3−2τ −τ | | p[i]   |
                 |−τ  2−τ τ−2   τ | | p[i+1] |

注意:如何在Stackoverflow的gui中展示它并不是很明显,但 u2 u3 应该代表 u平方和<分别是

答案 1 :(得分:4)

您可以使用双线性/双三次插值,但可以使用三个方向(分别为三线性/三线性)。如果您了解这些插值形式如何工作,那将是非常重要的。有关详细信息,请参阅Tricubic Interpolation on Wikipedia

答案 2 :(得分:1)

您正在寻找表面插值还是网格足够?

对于表面插值,我看到其他人建议使用三角测量(例如使用它:http://en.wikipedia.org/wiki/Delaunay_triangulation

创建网格:我的一位同事使用热方程(http://en.wikipedia.org/wiki/Heat_equation)来计算给定样本点之外的像素值。这产生了极其逼真的地形表面,并行化很简单。

答案 3 :(得分:0)

使用catmull-rom补丁

答案 4 :(得分:0)

如果你想要对该点进行简单的线性插值,那么中心点的Z值就是4个相邻Z值的平均值,假设Y和X的距离都是对称的。

如果距离不对称,但中心点始终位于相同的X和Y线上,则可以计算Y和X插值,最终值是平均值。

因此Zc将是:Zc =(Zx1 + x *(Zx2-Zx1)/(x2-x1)+ Zy1 + y *(Zy2-Zy1)/(y2-y1))/ 2,其中x和y距离x1和y1。

答案 5 :(得分:0)

当使用在问题中建议的方案进行插值时的问题,其中从散乱集中选择最近邻居的一些子集,结果是结果不需要是连续的。

想一想。假设我沿着(x,y)平面的一些平滑,连续的路径移动。只要4个最近的邻居不改变,插值将是平滑的,但是你选择这样做。但是,在某些时候,最近邻居的子集会突然改变。此时,您必须使边界内的插值一致。最好是使用自变量集的三角测量。这确保了数据的凸包内的连续(线性)插值。通过更多的工作,也可以通过三角测量实现更高阶的插值。

如果您碰巧遇到地质统计学,径向基函数通常也可用于插值或克里金法。由于您正在研究基于距离的方法,因此请考虑径向基函数。例如,搜索“逆多次插值”。