双圆弧插值算法(一)
Biarc Interpolation
在游戏开发中经常出现两点间的插值问题。大多数情况下,只需要一个简单的线性插值。线性插值很好,因为不会真的弄错。只有一条可能的线连接这些点。跟着走。当需要曲线插值时,求解会变得复杂得多。有无限数量的曲线可供选择,并有许多方法来生成:NURBS、Catmull Rom、Bézier、Hermite等。
想讨论一种生成圆形圆弧的不太常见的方法。
为什么想要一个圆插值?一个原因可能是看起来很悦目,但也有一些实际用途。如果正在制作一个放置道路的水平编辑工具(或使用程序性道路制作游戏),可能希望转弯处与真实世界中的道路相似。第二个例子,也是经常遇到的一个例子,是在剑后产生轨迹。挥剑的动作通常非常快。当剑在攻击中弧线时,只能得到几个样本点。如果以慢动作播放动画,会发现剑尖的轨迹相当圆。通过在采样点之间生成圆弧,可以生成干净的轨迹。
这里有一个为间谍编程的剑迹的例子。整个旋转过程中可能只有五到六个样本,但能够创建一个平滑的顶点弧。Spyborgs算法与将要介绍的有点不同,但是产生了类似的结果(如果知道要查找什么,实际上会稍微差一点)。
那么,要如何创建这些曲线呢?解决方案在于一个称为biarc的几何学。
双圆弧
双圆弧是由两个圆弧组成的曲线,使与匹配的切线相连。几乎每一对控制点都可以通过一个biarc连接起来,而失败的控制点在实践中并没有出现。下面是一些将红色控制点连接到蓝色控制点的biarc示例。
一旦可以求解两个控制点之间的biarc,那么将一系列控制点与一系列biarc连接起来就很简单了。这就是所谓的分段圆曲线。
目标
将生成两个圆弧作为输入。
假设输入切线是标准化的。换句话说:
找到连接
在求解弧之前,需要找到连接点,pm。
现在可以选择d1的任意实数,得到系统的解。根据值的不同,可以得到一个短的biarc或一个长的螺旋biarc。在右边的图像中,可以看到d1的不同值如何生成连接相同两个控制点的不同biarc。稍后将讨论自动为d1选择一个令人满意的值的方法。
边缘案例
如果d2方程中的分母为零,需要处理d2为无穷大的情况。这意味着t2和连接点的切线是平行的。这将创建一个半圆(请参见右侧显示的蓝色弧)。知道连接切线是t2,可以说明以下内容:
连接点pm必须位于q1外与t2平行的线上。
从p2到pm的向量必须垂直于t2。
从数学上讲,这是: