版權聲明:本文為CSDN博主「i_dovelemon」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/i_dovelemon/article/details/47984241
作者:i_dovelemon
來源:CSDN,http://www.dxstudio.com/guide_content.aspx?id=70a2b2cf-193e-4019-859c-28210b1da81f
日期:2015 / 8 / 25
主題:Catmull-Rom Spline Interpolating
引言
在游戲開發中,我們經常會遇到如下的情景:我們已知了一些路徑點,我們希望我們的角色能夠平滑的沿着這些路徑點進行移動,而不是“直直的”從一個點走到另外一個點上去。對於這樣的問題,在游戲開發中大多使用一個名為Catmull-Rom Spline的曲線來貫穿這條路徑,然后只要沿着這條曲線進行移動即可。今天,我們就先從理論上來了解下什么是Catmull-Rom Spline。
特別申明
由於,我本人也是在進行開發的時候,遇到這樣的問題,自然而然想要從網絡上尋找解決方案。在尋找的過程中,也走了一些彎路,但是功夫不負有心人,最終還是找到了解決的方法。對於這個問題的理解,我主要是參考網絡上的一篇文章,我覺得它的講解十分的不錯,所以這里的文章就不再自己解釋給大家聽,而是將原文翻譯出來,分享給大家。
數學基礎
當存在一些點的時候,我們往往會根據這些點來繪制一條樣條線,而這條樣條線需要平滑的穿過這些點。如果你是想要這么做的,那么你可以看一下Catmull-Rom樣條線。Catmull-Rom樣條線的數學背景十分的復雜,也超出了本文的范圍,這里不再講解,感興趣的讀者可以自行搜索相關的文章去了解。
我們可以認為,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]。通過這樣的方法,就能夠繪制一條經過所有控制點的曲線了。
