沿样条曲线弯曲网格

Bend a mesh along spline

我正在尝试沿样条曲线弯曲网格,但目前没有想法……起初我以为我只是将样条点向量添加到网格的顶点,但我正在寻找它的更优化版本……

伙计们……

我怎样才能沿着样条曲线弯曲网格,以便具有一些前向轴矢量的网格跟随样条曲线并根据它弯曲并沿着样条曲线重复......

???

我相信有很多方法可以做你想做的事。几年前,我使用 Conformal Geometric Algebra. Of course you can do it using conventional 3D math as its described in Instant Mesh Deformation and Deformation styles for spline-based skeletal animation 篇论文制定了一种方法。

一个简单的方法如下:

你的样条函数是一个函数 S(t): R -> R^3,它取 [0:1] 之间的标量并给你 R^3 中的点。

  1. 将每个网格顶点投影到样条曲线上。投影是正交的,因为它遵循曲线的法向量方向。因此,您的网格顶点 v_i 被投影到样条中的点 v'_i,其中 S(t_i) = v'_i。形成向量 p_i = v_i - v'_i(垂直于曲线)所以每个网格顶点可以表示为:

    v_i = S(t_i) + p_i

  2. 计算样条“每个点”处的正交坐标系。该坐标系称为 Frenet-Serret frame。要确定的第一个向量是曲线的切线。它被唯一定义为 S(t) 的导数,因此正切 T = S(t)/dt。另外两个向量,法线N和副法线B,可以用不同的方式计算,查看上面的参考文献。

  3. 根据点 S(t_i) 的 Frenet-Serret 坐标系表达向量 p_i(来自步骤 1)。这样向量 p_i 是 T、N 和 B 的线性组合。创建一个包含 T、N 和 B 列的矩阵 A。您需要找到 x_i 使得:

    一个x_i = p_i

    可以通过对矩阵A求逆来解决(实际上进行转置就可以了)。所以每个网格顶点可以计算为:

    v_i = S(t_i) + A x_i

    您可以存储对 (t_i, x_i) 而不是 v_i(您不再需要存储 v_i,因为您可以从t_i 和 x_i).

  4. 要使网格变形变形,必须平移样条控制点,然后需要重新计算每个样条点的 Frenet-Serret 框架(取 S(t) 的导数来计算 T并按照上述参考文件中的建议更新 N 和 B)。更新 T、N 和 B 后,您可以定义矩阵 A,然后使用步骤 3 中的公式计算网格顶点位置。

结果见上述论文图片