5

我需要在 C# (Unity) 中以曲线的形式实现连接。我希望得到与 Miro.com 中的实现尽可能相似的结果(见截图)。

附加曲线后,我计算三次贝塞尔曲线的路径。对于第一段,使用锚点和与其连接的对象的偏移量。在这个阶段没有任何问题。

问题:当通过单击并拖动线段的一个蓝点(见截图)将曲线分割成线段时,它在中间被一分为二。在两条新曲线的交界处,形成了一个新的交互(可移动)点,其控制点的切线和坐标是未知的。每次交互点的位置发生变化(下图中的白点)时,我都需要找到这些控制点的位置。此外,曲线在分割时不应剧烈改变其位置,而不是形成循环,具有不同长度的控制点向量(我不确定这里)并尽可能充分地表现(就像在 Miro 的板上)。

控制点是指 Bezier 段的 2 个不可见的引导点。

我用黑色绘制了已知的控制点,用红色绘制了我需要找到的那些。(Pn - 交互点,Cn - 控制点) Miro.com 中的弯曲连接

我试图找到它们的算法给出了不正确的控制点距离和方向。

测试了以下算法:

  1. Interpolation from Tacent - 分离时曲线的跳跃,控制点的方向和缩进量不合适;
  2. Chaikin 算法 - 分离过程中的曲线跳跃,创建循环;
  3. 基于猜测的“自定义”插值(考虑到线段起点和终点之间到线段中心的距离,以及起点和终点之间的方向) - 有所有相同的问题,但看起来比上面的稍微好一点。

我怀疑解决方案是使用 Catmull-Rom 样条对点进行弦内插,并将结果转换为贝塞尔曲线的点。但是,实施上仍然存在问题。

来自 3DMax 的曲线看起来也非常相似。在他们的文档中,我发现只提到了参数曲线。

3DMax中的曲线 米罗的相同曲线

我没有使用(或不起作用)的方法:

  1. Catmull-Rom 插值;
  2. B样条插值;
  3. 厄米插值;
  4. De Casteljau 的算法(虽然它似乎不适合这个)

我将非常感谢任何帮助,但我要求尽可能详细。

4

1 回答 1

0

在此处此处查找有用的资源以了解贝塞尔曲线。

为了做你想做的事,我会尝试 Catmull-Rom 方法,我认为它比 Bezier 方法简单得多,它是在itween资产中使用的一种,它是免费的,并且你实现了很多功能。

如果你想坚持贝塞尔曲线并找到控制点,我会告诉你我会怎么做才能找到它们。

对于 2 个控制点贝塞尔曲线的情况:

P = (1-t)P1 + tP2

要了解控制点 P1(x1,y1) 和 P2(x2,y2),您需要将方程应用于曲线的已知点。考虑到二维方程是矢量的,所以每个点提供 2 个方程,一个用于 x,一个用于 y,每个点都有 4 个未知数,x 和 y。

因此,对于曲线的第一个节点 (t=0),您将拥有:

Px = (1-0)P1x + 0*P2x

Py = (1-0)P1y + 0*P2y

对于最后一点 (t=1)

Px = (1-1)P1x + 1*P2x

Py = (1-1)P1y + 1*P2y

通过这 4 个方程,我将尝试实现控制点 P1 和 P2。您可以使用 t=0 和 t=1 来执行此操作,它们是您知道曲线的假定点,以及由于 t 值而简化数学的点,但只要您知道这些点,您就应该能够使用任何点确定的 t 曲线中的坐标。

如果曲线是 3 个控制点贝塞尔曲线,则 3 个控制点需要 6 个方程,依此类推。

我认为最好的方法是复合三次曲线合成曲线,并计算每个块的控制点,但我不确定这一点。

一旦理解了数学并实现了控制点,如果成功,我将尝试在代码中实现它。

于 2021-01-09T09:38:53.703 回答