雙圓弧插值算法(一)
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。
從數學上講,這是: