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

标签 math 3d geometry

我试图想出一种简单有效的方法来创建与许多给定“样本”点相交的平滑表面。

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

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

我猜想 4 个样本点的 Z 值的某些函数,以某种方式与样本点的距离成反比,但我不知道如何做到这一点。

任何人都对一个简单的方法有任何想法吗?

最佳答案

您可以通过从 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    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 的平方和 u 的立方。

关于math - 在 3D 空间中的点之间进行插值以形成平滑表面的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/313297/

相关文章:

java - 如何在 Java 3d 场景上绘制 2d 叠加层?

image - OpenGL:渲染图像 3D 点云

java - 围绕球体移动相机

javascript - 在paperjs中在圆段上画线

c# - 计算卫星视星等

Python cos(90) 和 cos(270) 不是 0

php - 用php实现倒数计时器

c++ - 如何确定线段是否在多边形内部?

在 O(n log n) 时间内找到特殊点 k 的算法

c++ - 迭代循环中的所有 (i,j) 元素