插值技术之Catmull-Rom Spline Interpolating(2)

做者:i_dovelemon网络

来源:CSDN,http://www.dxstudio.com/guide_content.aspx?id=70a2b2cf-193e-4019-859c-28210b1da81fide

日期:2015 / 8 / 25ui

主题:Catmull-Rom Spline Interpolatingspa


引言


在游戏开发中,咱们常常会遇到以下的情景:咱们已知了一些路径点,咱们但愿咱们的角色可以平滑的沿着这些路径点进行移动,而不是“直直的”从一个点走到另一个点上去。对于这样的问题,在游戏开发中大多使用一个名为Catmull-Rom Spline的曲线来贯穿这条路径,而后只要沿着这条曲线进行移动便可。今天,咱们就先从理论上来了解下什么是Catmull-Rom Spline。翻译


特别申明


因为,我本人也是在进行开发的时候,遇到这样的问题,天然而然想要从网络上寻找解决方案。在寻找的过程当中,也走了一些弯路,可是功夫不负有心人,最终仍是找到了解决的方法。对于这个问题的理解,我主要是参考网络上的一篇文章,我以为它的讲解十分的不错,因此这里的文章就再也不本身解释给你们听,而是将原文翻译出来,分享给你们。code


数学基础


当存在一些点的时候,咱们每每会根据这些点来绘制一条样条线,而这条样条线须要平滑的穿过这些点。若是你是想要这么作的,那么你能够看一下Catmull-Rom样条线。Catmull-Rom样条线的数学背景十分的复杂,也超出了本文的范围,这里再也不讲解,感兴趣的读者能够自行搜索相关的文章去了解。blog


咱们能够认为,Catmull-Rom样条线,是一根比较特殊的Bezier曲线,而这条Bezier曲线可以保证它会穿过从控制点的第二个点到控制点的倒数第二点之间的全部点。因此说,Catmull-Rom样条线最少须要4个控制点来进行控制。游戏



下面的公式给出了,如何计算某两个指定点之间的点:游戏开发

 

Output_point = P0 * (-0.5*t*t*t + t*t – 0.5*t) +开发

P1 * (1.5*t*t*t - 2.5*t*t + 1.0) +

P2 * (-1.5*t*t*t + 2.0*t*t + 0.5*t) +

P3 * (0.5*t*t*t – 0.5*t*t);

这里的P0,P1,P2,P3都是曲线上的点,可是要知道,上面公式只可以计算出从点P1到点P2之间的点。


公式中的t取值范围为[0,1],当t从0到1线性变化的时候,曲线就会从点P1(此时t=0),慢慢移动到P2(此时t=1)。这个曲线另一个特色就是,咱们计算出来的点P的切向量和这个点的周围两个起点和终点的切向量是平行的。


若是你想要处理更多的点,那么只有用前面的点,当前的点和接下来的两个点来构造这条曲线就能够了。举例来讲,若是你如今有5个点,分别为P1,P2,P3,P4,P5,那么咱们就能够构造两条不一样的曲线,他们的控制点分别为[P1,P2,P3,P4]和[P2,P3,P4,P5]。当咱们使用这两条曲线去分别从t=[0,1]上去绘制,将获得P2-P3,P3-P4这两条曲线。


补充说明


细心的读者可能发现了,咱们的控制点虽然有4个,可是绘制的曲线却只可以经过中间的两个点。这就致使了,若是我想曲线同时过这四个点,该怎么处理了。其实处理的方法,十分的简单,咱们只要认为的构造一个起点和终点来构成四个控制点便可。好比如今有P0,P1,P2,P3,若是用[P0,P1,P2,P3]构造曲线,曲线将只可以经过P1-P2,为了让曲线可以经过P0和P3,咱们能够人为的构造出以下的控制点[2P0 - P1, P0, P1, P2],以及[P1,P2,P3,2P3 - P2]。经过这样的方法,就可以绘制一条通过全部控制点的曲线了。