主頁 >  其他 > 三維空間剛體運動4-3:四元數線性插值方法:Squad

三維空間剛體運動4-3:四元數線性插值方法:Squad

2020-12-30 11:27:38 其他

三維空間剛體運動4-3:四元數線性插值方法:Squad

  • 1. Squad的引出
  • 2. B e ˊ z i e r c u r v e B\acute{e}zier \space curve Beˊzier curve
    • 2.1 曲線的引出
    • 2.2 公式形式及影片演示
  • 3. 樣條
    • 3.1 基本概念
    • 3.2 樣條曲線
  • 4. 貝塞爾樣條
    • 4.1 基本概念
    • 4.2 Squad中的三次貝塞爾樣條
  • 5. de Casteljau演算法和Quad演算法
    • 5.1 de Casteljau演算法
    • 5.2 Quad演算法
  • 6. Squad演算法
    • 6.1 Squad公式形式
    • 6.2 連續一階可導性證明
      • 6.2.1 連續性證明
      • 6.2.2 一階可微性( C 1 C_{1} C1?)證明
    • 6.3 Squad產生的插值曲線
  • 6. 代碼實作
  • 參考文獻:

本篇系列文章參照高翔老師《視覺SLAM十四講從理論到實踐》,講解三維空間剛體運動,博文將原第三講分為四部分來講解,其中四元數部分較多較復雜,又分為四部分,總體目錄如下:

  1. 旋轉矩陣和變換矩陣;
  2. 旋轉向量表示旋轉;
  3. 歐拉角表示旋轉;
  4. 四元數包括以下部分:
    4-1. 四元數表示變換;
    4-2. 四元數線性插值方法:LinEuler/LinMat/Lerp/Nlerp/Slerp;
    4-3. 四元數多點插值方法:Squad;
    4-4. 四元數多點二次插值方法:Spring,

本文相對于原文會適當精簡,同時為便于全面理解,會收集其他網路好文,根據作者理解,加入一些注解和擴展知識點,如果您覺得還不錯,請一鍵四連(點贊關注收藏評論),讓更多的人看到,

1. Squad的引出

當在兩個旋轉之間做插值時,Slerp是最優的,但是對于單位四元數集合,Slerp插值曲線差不多等同于一條直線(但在表面是圓弧),此時多點旋轉之間的插值會出現以下問題:

  1. 插值曲線在控制點(即 p 1 , p 2 . . . p_{1},p_{2}... p1?,p2?...)不是平滑的;
  2. 角速度不是常量;
  3. 角速度在控制點處不連續,

如下圖所示:

圖1.1 多點間Slerp插值曲線和角速度圖
多點間Slerp插值

雖然再引數化(Reparameterization)可以確保整個插值曲線的連續性,實際上插值引數會被轉換成關鍵幀之間一系列離散的幀,因此一個再引數化的插值曲線與分配到的每個關鍵幀之間的間隙大小有關,兩個關鍵幀插值 q i , q i + 1 q_{i},q_{i+1} qi?,qi+1?的間隙與它們之間的夾角 θ \theta θ大小成正比,夾角 θ \theta θ可由 cos ? θ = q i ? q i + 1 \cos\theta=q_{i}\cdot q_{i+1} cosθ=qi??qi+1?給出,
由于每個子間隙之間的幀數必須是整數,因此角速度只能接近常量,而達不到常量,對比圖1.1和圖1.2,

圖1.2 多點間Slerp插值曲線和角速度圖–根據角度調整子間隙幀數后

在這里插入圖片描述

然而想要插值曲線變得平滑并不容易,比如類似下面這種情況:平面上兩點間插值一條直線很簡單,但是即使在最簡單的歐式空間中,在多點間創建一條平滑插值曲線也是相當困難的,如圖1.3中所示: a ) a) a)表示平面兩點間的直線簡單插值曲線; b ) b) b)表示多點間的線性插值曲線,關鍵點處不可微; c ) c) c)表示為保證可微性而使用的三次曲線,比如樣條,

圖1.3 三種不同的插值曲線

在這里插入圖片描述

我們希望能以犧牲固定角速度為條件,讓插值的曲線不僅是平滑連續的,而且讓它的一階甚至是高階導數是連續的(曲線連續我們稱為 C 0 C^{0} C0連續,達到一階導數連續就叫做 C 1 C^{1} C1連續,在此基礎上達到二階導數連續叫做 C 2 C^{2} C2連續,以此類推),注意:這里之所以犧牲角速度,是因為在實際應用中更注重路線,而不是特定的角速度,
解決這個問題的方法有很多,在網上能找到很多論文,但是每一種方法想要完全理解都不是那么容易的,而且它們一般都比普通的Slerp或者Nlerp要慢得多,我們在這里只會簡單介紹最常見到而且也是最直觀的球面四邊形插值 (Spherical and quadrangle),或稱Squad
Squad仍然是平面上的向量插值衍生到超球面的結果,所以我們關注的重點首先仍然是向量的插值,平面上多點間插值有多種使用三次曲線的插值方法,比如 B e ˊ z i e r B\acute{e}zier Beˊzier曲線,Squad也用到了 B e ˊ z i e r B\acute{e}zier Beˊzier曲線,因此在具體介紹Squad之前,先詳細了解下 B e ˊ z i e r c u r v e B\acute{e}zier \space curve Beˊzier curve和樣條的知識,

2. B e ˊ z i e r c u r v e B\acute{e}zier \space curve Beˊzier curve

下面的內容可能會需要一些 B e ˊ z i e r B\acute{e}zier Beˊzier曲線以及樣條的前置知識,但即便你不知道也沒有關系,我會在下面大致的講解這些知識,

2.1 曲線的引出

假設我們有一個向量的序列 v 0 , v 1 , . . . , v n \mathbf{v_{0}},\mathbf{v_{1}},...,\mathbf{v_{n}} v0?,v1?,...,vn?,如果我們想對這個序列進行插值,那么我們可以分別對每一對向量 v i \mathbf{v_{i}} vi? v i + 1 \mathbf{v_{i+1}} vi+1?進行插值,然后將插值的曲線連接起來,也就是我們所說的樣條(Spline),如果直接使用Lerp的話,我們會得到這樣的結果(假設我們只有五個向量需要插值 v 0 , v 1 , v 2 , v 3 , v 4 \mathbf{v_{0}},\mathbf{v_{1}},\mathbf{v_{2}},\mathbf{v_{3}},\mathbf{v_{4}} v0?,v1?,v2?,v3?,v4?):在這里插入圖片描述
很明顯,這個曲線雖然是連續的,但是它的一階導數(切線)在切換插值向量時都不是連續的,為了解決這個問題,我們最常使用的就是貝塞爾曲線,
貝塞爾曲線( B e ˊ z i e r c u r v e B\acute{e}zier\space curve Beˊzier curve),又稱貝茲曲線或貝濟埃曲線,是在1962年由法國數學家皮埃爾·貝塞爾(Pierre Bézier)所廣泛發表,并給出了詳細的計算公式,因此按照這樣的公式繪制出來的曲線就用他的姓氏來命名,稱為貝塞爾曲線,貝塞爾曲線為計算機矢量圖形學奠定了基礎,它的主要意義在于無論是直線或曲線都能在數學上予以描述,它是應用于二維圖形應用程式的數學曲線,一般的矢量圖形軟體通過它來精確畫出曲線,我們在繪圖工具上看到的鋼筆工具就是來做這種矢量曲線的,在一些比較成熟的位圖軟體中也有貝塞爾曲線工具,如PhotoShop等,
貝塞爾曲線是計算機圖形影像造型的基本工具,是圖形造型運用得最多的基本線條之一,它由起始點、終止點(也稱錨點或資料點,anchor point or data point)、控制點或輔助點(control point or auxiliary point)組成,通過調整控制點(通常有兩個或兩個以上)調整位于曲線中央的控制線(這條線是虛擬的,中間與貝塞爾曲線交叉,兩端是控制端點),移動兩端的端點時貝塞爾曲線改變曲線的曲率(彎曲的程度);移動控制點(也就是移動虛擬的控制線)在起始點和終止點鎖定的情況下做均勻移動,繪制出的一條光滑曲線,貝塞爾曲線變化時像可伸縮的皮筋,而貝塞爾曲線的有趣之處更在于它的“皮筋效應”,也就是說,隨著點有規律地移動,曲線將產生皮筋伸引一樣的變換,帶來視覺上的沖擊,注意,貝塞爾曲線上的所有控制點、節點均可編輯,這種“智能化”的矢量線條為藝術家提供了一種理想的圖形編輯與創造的工具,

2.2 公式形式及影片演示

貝塞爾曲線公式有多種形式,根據未知數 t t t的最高次冪劃分,包括線性公式、二次方公式、三次方公式及N次方的通用形式,也可以根據控制點的個數分為一階貝塞爾曲線(0個控制點)、二階貝塞爾曲線(1個控制點)、三階貝塞爾曲線(2個控制點)等等,貝塞爾曲線具有以下特征:

  1. 曲線通過起點和終點,并與特征多邊形首末兩邊相切于起點和終點,中間點將曲線拉向自己;
  2. 平面離散點控制曲線的形狀,改變一個離散點的坐標,曲線的形狀將隨之改變(點對曲線具有整體控制性);
  3. 曲線落在特征多邊形的凸包之內,它位元征多邊形更趨于光滑,

下面我們看一下它們的公式形式及影片演示:

  1. 線性公式(一階貝塞爾曲線)
    給定點 P 0 , P 1 P_{0},P_{1} P0?,P1?,線性貝茲曲線只是一條兩點之間由連續點組成的線段,這條線段由下式給出: B ( t ) = P 0 + ( P 1 ? P 0 ) t = P 0 ( 1 ? t ) + P 1 t , t ∈ [ 0 , 1 ] (2.1) B(t)=P_{0}+(P_{1}-P_{0})t=P_{0}(1-t)+P_{1}t,t\in[0,1]\tag{2.1} B(t)=P0?+(P1??P0?)t=P0?(1?t)+P1?t,t[0,1](2.1)
    其等同于線性插值,插值程序演示如下:在這里插入圖片描述

  2. 二次方公式(二階貝塞爾曲線)
    二次方貝茲曲線的路徑由給定點 P 0 , P 1 , P 2 P_{0},P_{1},P_{2} P0?,P1?,P2?的函式 B ( t ) B(t) B(t)追蹤: B ( t ) = P 0 ( 1 ? t ) 2 + P 1 2 t ( 1 ? t ) + P 2 t 2 , t ∈ [ 0 , 1 ] (2.2) B(t)=P_{0}(1-t)^{2}+P_{1}2t(1-t)+P_{2}t^{2},t\in[0,1]\tag{2.2} B(t)=P0?(1?t)2+P1?2t(1?t)+P2?t2,t[0,1](2.2)
    描述一條拋物線,其影片演示如下:在這里插入圖片描述

  3. 三次方公式(三階貝塞爾曲線)
    P 0 , P 1 , P 2 , P 2 P_{0},P_{1},P_{2},P_{2} P0?,P1?,P2?,P2?四個點在平面或在三維空間中定義了三次方貝茲曲線,曲線起始于 P 0 P_{0} P0?走向 P 1 P_{1} P1?,并從 P 2 P_{2} P2?的方向來到 P 3 P_{3} P3?,一般不會經過 P 1 P_{1} P1? P 2 P_{2} P2?,這兩個點只是在那里提供方向資訊, P 0 P_{0} P0? P 1 P_{1} P1?之間的間距,決定了曲線在轉而趨進 P 3 P_{3} P3?之前,走向 P 2 P_{2} P2?方向的“長度有多長”,
    曲線的引數形式為: B ( t ) = P 0 ( 1 ? t ) 3 + 3 P 1 t ( 1 ? t ) 2 + 3 P 2 t 2 ( 1 ? t ) + P 3 t 3 , t ∈ [ 0 , 1 ] (2.3) B(t)=P_{0}(1-t)^{3}+3P_{1}t(1-t)^{2}+3P_{2}t^{2}(1-t)+P_{3}t^{3},t\in[0,1]\tag{2.3} B(t)=P0?(1?t)3+3P1?t(1?t)2+3P2?t2(1?t)+P3?t3,t[0,1](2.3)
    現代的成象系統,如PostScript、Asymptote和Metafont,運用了以貝茲樣條組成的三次貝茲曲線,用來描繪曲線輪廓,影片演示如下:
    在這里插入圖片描述

  4. 一般引數公式
    n n n階貝茲曲線可如下推斷,給定點P0、P1、…、Pn,其貝茲曲線即: B ( t ) = ∑ i = 0 n ( n i ) P i ( 1 ? t ) n ? i t i = ( n 0 ) P 0 ( 1 ? t ) n t 0 + ( n 1 ) P 1 ( 1 ? t ) n ? 1 t 1 + . . . + ( n n ) P n ( 1 ? t ) 0 t n , t ∈ [ 0 , 1 ] (2.4) B(t)=\sum_{i=0}^{n}\binom{n}{i}P_{i}(1-t)^{n-i}t^{i}=\binom{n}{0}P_{0}(1-t)^{n}t^{0}+\binom{n}{1}P_{1}(1-t)^{n-1}t^{1}+...+\binom{n}{n}P_{n}(1-t)^{0}t^{n},t\in[0,1]\tag{2.4} B(t)=i=0n?(in?)Pi?(1?t)n?iti=(0n?)P0?(1?t)nt0+(1n?)P1?(1?t)n?1t1+...+(nn?)Pn?(1?t)0tn,t[0,1](2.4)
    在這里展示一下四次及五次貝塞爾曲線的影片形式,其方程可參照一般引數公式,四次貝塞爾曲線的影片形式:在這里插入圖片描述
    五次貝塞爾曲線的影片形式:
    在這里插入圖片描述
    一般引數公式包括遞回表達及其展開式,公式說明如下:
    1.開始于P0并結束于Pn的曲線,即所謂的端點插值法屬性;
    2.曲線是直線的充分必要條件是所有的控制點都位于曲線上,同樣的,貝塞爾曲線是直線的充分必要條件是控制點共線;
    3.曲線的起始點(結束點)相切于貝塞爾多邊形的第一節(最后一節),
    4.一條曲線可在任意點切割成兩潭訓任意多條子曲線,每一條子曲線仍是貝塞爾曲線;
    5.一些看似簡單的曲線(如圓)無法以貝塞爾曲線精確的描述,或分段成貝塞爾曲線(但可以小于千分之一的最大半徑誤差近似于圓);
    6.位于固定偏移量的曲線(來自給定的貝塞爾曲線),又稱作偏移曲線(假平行于原來的曲線,如兩條鐵軌之間的偏移)無法以貝茲曲線精確的形成(某些瑣屑實體除外),無論如何,現存的啟發法通常可為實際用途中給出近似值,

到此,我們就有了足夠的貝塞爾曲線知識,只要有足夠的控制點,任何曲線都可以使用貝塞爾方法繪制,這個說法聽上去很美好,但是在實際的曲線設計程序中,一條復雜的貝塞爾曲線的生成是計算高成本的(computationally expensive),試想一下,如果要設計一條經過12個固定點的曲線,最后生成的曲線方程就是12次的(t的指數的最高次數為12),那么每次微調這些控制點位置,計算機需要重新擬合這條復雜方程式,嚴重影響計算效率,因此,人們就想出樣條線(Spline)方法來完成點的多項式擬合,

3. 樣條

3.1 基本概念

樣條意思是指通過一組給定點集來生成平滑曲線的柔性帶,此概念源于生產實踐,“樣條”是繪制曲線的一種繪圖工具,是富有彈性的細長條,繪圖時用壓鐵使樣條通過指定的形值點(樣點),并調整樣條使它具有滿意的形狀,然后沿樣潭訓出曲線,
在數學學科數值分析中,樣條是一種特殊的函式,由多項式分段定義,樣條的英語單詞spline來源于可變形的樣條工具,那是一種在造船和工程制圖時用來畫出光滑形狀的工具,在中國大陸,早期曾經被稱做“齒函式”,后來因為工程學術語中“放樣”一詞而得名,
在計算機科學的計算機輔助設計和計算機圖形學中,樣條通常是指分段定義的多項式引數曲線,雖然樣條線可以采用單段和多段的方式創建,但對于單段樣條線來說,階次=點數-1,因此單段樣條線最多只能使用25個點,單段構造方式受到一定的限制,定義點的數量越多,樣條線的階次越高,而階次越高樣條線會出現意外結果,如變形等,而且單段樣條線不能封閉,因此不建議使用單段構造樣條線,另外,多段樣條線的階次由用戶自己定義(≤24),樣條線定義點數量沒有限制,但至少比階次多一點,在設計中,通常采用3~5階樣條線,由于多段樣條構造簡單,使用方便,擬合準確,并能近似曲線擬合和互動式曲線設計中復雜的形狀,所以多段樣條是這些領域中曲線的常用表示方法,
在插值問題中,樣條插值通常比多項式插值好用,用低階的樣條插值能產生和高階的多項式插值類似的效果,并且可以避免被稱為龍格現象的數值不穩定的出現,并且低階的樣條插值還具有“保凸”的重要性質,

3.2 樣條曲線

樣條曲線(Spline Curves): 是給定一系列控制點而得到的一條曲線,曲線形狀由這些點控制,一般分為插值樣條和擬合樣條,插值是在原有資料點上進行填充生成曲線,曲線必經過原有資料點;擬合是依據原有資料點,通過引數調整設定,使得生成曲線與原有點差距最小(最小二乘),因此曲線未必會經過原有資料點,
所謂的樣條曲線就是分段多項式(Piecewise Polynomials),所謂的“分段”,就是在不同的定義域區間里面,y值對應的運算式是不一樣的,樣條曲線起源于一個常見問題,即已知若干點的條件下,如何得到通過這些點的一條光滑曲線?
一個簡單且行之有效的方法是,把這些點作為限制點(即錨點),然后在這些限制點中放置一條具有彈性的金屬片,最后金屬片繞過這些點后的最終狀態即為所需曲線,而最終得到的形狀曲線,就是樣條曲線,這也是該名字的由來,其中金屬片就是樣條,形成的曲線就是樣條曲線,如下圖:
在這里插入圖片描述
樣條曲線是構建自由曲面的重要曲線,可以是平面樣條,也可以是空間樣條;可以封閉,也可以開環,可以是單段樣條線,也可以是多段樣條線,

4. 貝塞爾樣條

4.1 基本概念

從編輯便捷性角度看,分段多項式較單一段貝塞爾曲線有優勢,因為若需要調整曲線區域,只需要調整分段多項式里面的一條式子即可,其他式子維持不變,這樣計算機不需要耗費額外資源,重新計算整條12次方的曲線方程,但現在問題又來了,樣條線的每個分段,是怎樣的多項式呢?比如下圖這12個點,我們最容易想象到的,就是點與點之間,按順序兩兩相連,每個分段多項式,都是最簡單線性方程,
在這里插入圖片描述
但是這樣顯然是不夠的,因為這樣轉角尖銳的效果,不能模擬高次多項式的平滑效果,于是,計算機圖形學界,達到了一個共識:樣條線的每個分段多項式,使用n = 3的貝塞爾曲線(參考上面動圖),之所以采用三次曲線,是因為三次樣條函式要求在各個節點(插值點)處函式值、一階導數值、二階導數值連續,這個要求同時具有明顯的幾何與力學意義,從幾何角度而言,最高到二階導數連續的函式在各節點上光滑且對稱地連續,即在節點處左右微小范圍內該樣條函式是一段圓弧,曲率半徑相等,因為細梁(樣條函式)的彎矩與曲率成正比,因此在力學意義上,三次樣條函式等價于將彈性桿壓在各節點處自然彎曲所得到的結果,使用貝塞爾曲線連接的各點如下圖:
在這里插入圖片描述
使用n = 3的貝塞爾曲線原因是要限定相鄰的兩個分段多項式,在交接點位置的一階導數相等(斜率相等)和二階導數相等(斜率的變化率相等),這里留作第五節的證明,直觀來看,就是讓所有分段曲線能夠平滑順暢地連接起來,最終與單條的高次貝塞爾曲線在形狀上沒有區別,這里的每一個分段,就稱為貝塞爾樣條線(Bezier Spline),各位熟悉的矢量編輯軟體,如Illustrator,Coreldraw,inkscape,Gimp等,都是使用這個原理生成曲線,并可以通過每個控制點的把柄(Handles,實質也是控制點)來調整彎曲程度,

除了貝塞爾樣條,另外一種貝塞爾曲線的變種是B樣條,針對貝塞爾曲線在外形設計的應用中存在一些具體的不足之處,主要有一下三點:

  1. 確定了多邊形的頂點數(m個),也就決定了所定義的Bezier曲線的階次(m-1次),這樣很不靈活;
  2. 當頂點數(m)較大時,曲線的階次將比較高,此時,多邊形對曲線形狀的控制將明顯減弱;
  3. Bezier的調和函式的值,在開區間(0,1)內均不為0,因此,所定義的曲線在(0<t<1)的區間內的任何一點均要受到全部頂點的影響,即改變其中任一個頂點的位置,都將對整條曲線產生影響,因此對曲線進行區域修改是不可能的,

為了克服以上提到的在Bezier曲線中存在的問題,Gordon、Riesenfeld和Forrest等人拓展了Bezier曲線,用n次B樣潭訓函式替換了伯恩斯坦基函式,構造了B樣條曲線,B樣條曲線除了保持Bezier曲線所具有的有點外,還增加了可以對曲線進行區域修改這一突出的優點,除此之外,它還具有對特征多邊形更逼近以及多項式階次較低等優點,因此,B樣條曲線在外形設計中得到了更廣泛的重視和應用,

B樣條曲線曲面源于20世紀70年代早期Pierre Bézier的開創性作業,某種意義上,人們可以認為B樣條曲線曲面是貝塞爾曲線曲面之“子”,而非均勻有理B樣條(non-uniform rational b-spline, NURBS)是Bézier曲線曲面之“孫”.從時間上大致是對的,他們無疑已經走向成熟,對于B樣條曲線和NURBS,本篇沒有用到,故這里不再詳細講解,感興趣的同學,B樣條曲線可以參考參考文獻7,NURBS可以參考參考文獻8,
總結:貝塞爾曲線是由兩端的起始點和終止點(也可稱為錨點或資料點)構成,并有控制點控制方向的曲線,它并不通過控制點,樣條由各個錨點組成,樣條曲線穿過每個錨點,兩兩錨點之間可由任意曲線鏈接,樣條中兩兩錨點使用貝塞爾曲線連接的話,就稱之為貝塞爾樣條,
好了,終于鋪墊完前置知識,下面看如何根據Squad中貝茲樣條及推導演算法,

4.2 Squad中的三次貝塞爾樣條

回到第二節提到的插值問題,對于 v 0 , v 1 , v 2 , v 3 , v 4 \mathbf{v_{0}},\mathbf{v_{1}},\mathbf{v_{2}},\mathbf{v_{3}},\mathbf{v_{4}} v0?,v1?,v2?,v3?,v4?進行Lerp插值形成的曲線,如圖2.1,很明顯,這個曲線雖然是連續的,但是它的一階導數(切線)在切換插值向量時都不是連續的,我們一開始的想法可能會是將中間的 v 1 , v 2 , v 3 \mathbf{v_{1}},\mathbf{v_{2}},\mathbf{v_{3}} v1?,v2?,v3?作為控制點,直接使用一個四階 B e ˊ z i e r B\acute{e}zier Beˊzier曲線(因為有五個點)來生成這個近似曲線,但是 B e ˊ z i e r B\acute{e}zier Beˊzier曲線只會經過初始點與最終點(插值),一般不會經過中間的控制點(近似),所以這樣求出來的曲線雖然是可導的,但是插值曲線不會經過中間的三個向量:
在這里插入圖片描述
為了解決這個問題,我們可以分段對每兩個向量 v i \mathbf{v_{i}} vi? v i + 1 \mathbf{v_{i+1}} vi+1?之間使用 Bézier曲線進行插值,之后將所有的曲線(即貝塞爾樣條)連接起來,因為我們需要讓曲線的一階導數(或者說曲線的趨勢)連續,我們還需要知道它們的前一個向量 v i ? 1 \mathbf{v_{i-1}} vi?1?和后一個向量 v i + 2 \mathbf{v_{i+2}} vi+2?,并且用它們生成兩個控制點 s i \mathbf{s_{i}} si? s i + 1 \mathbf{s_{i+1}} si+1?來控制曲線的趨勢,我們會使用 v i \mathbf{v_{i}} vi? v i + 1 \mathbf{v_{i+1}} vi+1?作為端點(曲線會經過這兩個點), s i \mathbf{s_{i}} si? s i + 1 \mathbf{s_{i+1}} si+1?作為中間的控制點,使用一個三次貝塞爾樣條(Cubic Bézier Spline,四個點)來近似這個兩個向量之間的插值,

在我們的例子中,因為我們一共有四對向量( v 0 v 1 \mathbf{v_{0}}\mathbf{v_{1}} v0?v1? v 1 v 2 \mathbf{v_{1}}\mathbf{v_{2}} v1?v2? v 2 v 3 \mathbf{v_{2}}\mathbf{v_{3}} v2?v3? v 3 v 4 \mathbf{v_{3}}\mathbf{v_{4}} v3?v4?),我們會使用四個三次貝茲曲線對這五個點進行插值,我們知道,對于三次貝茲曲線所產生的樣條,如果想讓最終的插值曲線達到 C 1 C_{1} C1?連續,則需要讓前一個樣條在 s i \mathbf{s_{i}} si?的控制點與當前樣條在 s i \mathbf{s_{i}} si?的控制點分別處于最終曲線在 s i \mathbf{s_{i}} si?處切線對等的兩側:
在這里插入圖片描述
在上面的曲線中,藍色的線就是曲線在點 s i \mathbf{s_{i}} si?處的切線,紅色的點就是三次Bézier樣條的控制點 s i \mathbf{s_{i}} si?,分別處于切線對等的兩側( s i \mathbf{s_{i}} si?的推導方法放在 5.1 5.1 5.1),對于兩個端點 v 0 \mathbf{v_{0}} v0? v 4 \mathbf{v_{4}} v4?,我們直接將這兩個向量的控制點取為它們本身(這不是唯一的做法,但這樣是可行的),最終得到一個平滑的曲線,
我們希望將類似的邏輯帶到四元數的超球面上,得到四元數序列的插值的方法,但在此之前我們需要了解如何使用de Casteljau演算法構造一個三次 Bézier曲線,

5. de Casteljau演算法和Quad演算法

注意,Quad演算法是對de Casteliau演算法的簡化,

5.1 de Casteljau演算法

Bézier曲線的構造有個著名的遞回演算法叫做de Casteljau演算法(de Casteljau’s Algorithm),它對任意次方的 Bézier 曲線都是成立的,但是這里我們只關注三次Bézier曲線的情況,
這個演算法最基本的思想就是線性插值的嵌套,假設我們有四個向量
v 0 , v 1 , v 2 , v 3 \mathbf{v_{0}},\mathbf{v_{1}},\mathbf{v_{2}},\mathbf{v_{3}} v0?,v1?,v2?,v3?(這里容易混淆,可依次看做 v i , s i , s i + 1 , v i + 1 \mathbf{v_{i}},\mathbf{s_{i}},\mathbf{s_{i+1}},\mathbf{v_{i+1}} vi?,si?,si+1?,vi+1?),那么我們可以這樣子獲得最終的三次 Bézier 曲線:
首先,我們對每一對向量 v 0 v 1 \mathbf{v_{0}}\mathbf{v_{1}} v0?v1? v 1 v 2 \mathbf{v_{1}}\mathbf{v_{2}} v1?v2? v 2 v 3 \mathbf{v_{2}}\mathbf{v_{3}} v2?v3?進行線性插值,獲得 v 01 \mathbf{v_{01}} v01? v 12 \mathbf{v_{12}} v12? v 23 \mathbf{v_{23}} v23? v 01 = L e r p ( v 0 , v 1 ; t ) v 12 = L e r p ( v 1 , v 2 ; t ) v 23 = L e r p ( v 2 , v 3 ; t ) \begin{aligned} &\mathbf{v_{01}}=Lerp(\mathbf{v_{0}},\mathbf{v_{1}};t) \\&\mathbf{v_{12}}=Lerp(\mathbf{v_{1}},\mathbf{v_{2}};t) \\&\mathbf{v_{23}}=Lerp(\mathbf{v_{2}},\mathbf{v_{3}};t) \end{aligned} ?v01?=Lerp(v0?,v1?;t)v12?=Lerp(v1?,v2?;t)v23?=Lerp(v2?,v3?;t)?之后,我們對 v 01 v 12 \mathbf{v_{01}}\mathbf{v_{12}} v01?v12? v 12 v 23 \mathbf{v_{12}}\mathbf{v_{23}} v12?v23?這兩對向量進行線性插值,獲得 v 012 \mathbf{v_{012}} v012? v 123 \mathbf{v_{123}} v123? v 012 = L e r p ( v 01 , v 12 ; t ) v 123 = L e r p ( v 12 , v 23 ; t ) \begin{aligned} &\mathbf{v_{012}}=Lerp(\mathbf{v_{01}},\mathbf{v_{12}};t) \\&\mathbf{v_{123}}=Lerp(\mathbf{v_{12}},\mathbf{v_{23}};t) \end{aligned} ?v012?=Lerp(v01?,v12?;t)v123?=Lerp(v12?,v23?;t)?最后,對 v 012 \mathbf{v_{012}} v012? v 123 \mathbf{v_{123}} v123?進行線性插值獲得 v 0123 \mathbf{v_{0123}} v0123?,這個向量就是我們想要的最終結果,它就是三次 Bézier 曲線上的點: v 0123 = L e r p ( v 012 , v 123 ; t ) (5.1) \mathbf{v_{0123}}=Lerp(\mathbf{v_{012}},\mathbf{v_{123}};t)\tag{5.1} v0123?=Lerp(v012?,v123?;t)(5.1)雖然這個演算法看起來很繁瑣,但是我們可以通過一張圖來理解它(取 t = 0.4 t=0.4 t=0.4):
在這里插入圖片描述
可以看到,雖然我們一直在使用線性插值,最侄訓得的卻是一條三次 Bézier曲線(黑色的線),
如果將這些式子合并起來,我們就能得到三次 Bézier 曲線的遞回公式,因為這個式子太長了,我將 L e r p ( v i , v i + 1 ; t ) Lerp(\mathbf{v_{i}},\mathbf{v_{i+1}};t) Lerp(vi?,vi+1?;t)簡寫為 L ( v i , v i + 1 ; t ) L(\mathbf{v_{i}},\mathbf{v_{i+1}};t) L(vi?,vi+1?;t),得到三次 Bézier 曲線的遞回公式: B e ˊ z i e r ( v 0 , v 1 , v 2 , v 3 ; t ) = L ( L ( L ( v 0 , v 1 ; t ) , L ( v 0 , v 1 ; t ) ; t ) , L ( L ( v 0 , v 1 ; t ) , L ( v 0 , v 1 ; t ) ; t ) ; t ) (5.2) B\acute{e}zier(\mathbf{v_{0}},\mathbf{v_{1}},\mathbf{v_{2}},\mathbf{v_{3}};t)=L(L(L(\mathbf{v_{0}},\mathbf{v_{1}};t),L(\mathbf{v_{0}},\mathbf{v_{1}};t);t),L(L(\mathbf{v_{0}},\mathbf{v_{1}};t),L(\mathbf{v_{0}},\mathbf{v_{1}};t);t);t)\tag{5.2} Beˊzier(v0?,v1?,v2?,v3?;t)=L(L(L(v0?,v1?;t),L(v0?,v1?;t);t),L(L(v0?,v1?;t),L(v0?,v1?;t);t);t)(5.2)
如果將 L e r p Lerp Lerp的定義 L e r p ( v i , v i + 1 ; t ) = ( 1 ? t ) v i + t v i + 1 Lerp(\mathbf{v_{i}},\mathbf{v_{i+1}};t)=(1-t)\mathbf{v_{i}}+t\mathbf{v_{i+1}} Lerp(vi?,vi+1?;t)=(1?t)vi?+tvi+1?不斷代入并展開的話,我們能獲得這樣一個式子: B e ˊ z i e r ( v 0 , v 1 , v 2 , v 3 ; t ) = ( 1 ? t ) 3 v 0 + 3 ( 1 ? t ) 2 t v 1 + 3 ( 1 ? t ) t 2 v 2 + t 3 v 3 (5.3) B\acute{e}zier(\mathbf{v_{0}},\mathbf{v_{1}},\mathbf{v_{2}},\mathbf{v_{3}};t)=(1-t)^{3}\mathbf{v_{0}}+3(1-t)^{2}t\mathbf{v_{1}}+3(1-t)t^{2}\mathbf{v_{2}}+t^{3}\mathbf{v_{3}}\tag{5.3} Beˊzier(v0?,v1?,v2?,v3?;t)=(1?t)3v0?+3(1?t)2tv1?+3(1?t)t2v2?+t3v3?(5.3)因為每項的 t t t的最高次冪都是3,所以我們說它是一個三次Bézier曲線,以上就是de Castelijau演算法的全部內容,
我們可以直接將上面的遞回公式運用到四元數上,得到四元數的球面Bézier曲線公式,但因為球面的線性插值不是Lerp而是Slerp,我們需要將公式中所有的Lerp全部換成Slerp(你可以想象一下,將四個向量形成的四邊形看作是一個網格(Mesh),之后將這個網格貼在球面上),同樣因為公式太長,我會將 S l e r p ( q i , q i + 1 ; t ) Slerp(q_{i},q_{i+1};t) Slerp(qi?,qi+1?;t)簡寫為 S ( q i , q i + 1 ; t ) S(q_{i},q_{i+1};t) S(qi?,qi+1?;t),得到四元數的三次 Bézier 曲線的遞回公式:
S B e ˊ z i e r ( q 0 , q 1 , q 2 , q 3 ; t ) = S ( S ( S ( q 0 , q 1 ; t ) , S ( q 1 , q 2 ; t ) ; t ) , S ( S ( q 1 , q 2 ; t ) , S ( q 2 , q 3 ; t ) ; t ) ; t ) (5.4) SB\acute{e}zier(q_{0},q_{1},q_{2},q_{3};t)=S(S(S(q_{0},q_{1};t),S(q_{1},q_{2};t);t),S(S(q_{1},q_{2};t),S(q_{2},q_{3};t);t);t)\tag{5.4} SBeˊzier(q0?,q1?,q2?,q3?;t)=S(S(S(q0?,q1?;t),S(q1?,q2?;t);t),S(S(q1?,q2?;t),S(q2?,q3?;t);t);t)(5.4)
這個其實就是Ken Shoemake在1985年的那篇Paper里提出的插值方法,他也提供了控制點的公式,然而,很明顯這個方法實在是太復雜了,僅僅是一個 Slerp 就要使用四個三角函式,而我們這里一共有 7 個 Slerp,如果真的要使用它進行插值會對性能產生非常大的影響,

5.2 Quad演算法

于是,Shoemake在1987年提出了一個更高效的近似演算法,也就是我們熟悉的Squad,這里容易看暈,我已盡量使推理邏輯嚴密,請感到暈的讀者朋友多看幾遍,
我們首先仍然來看平面中向量的情況,我把向量的Squad演算法叫做Quad,代表「Quadrangle」,Quad雖有很多歧義,而且我好像沒看到別人這么叫過,但是為了簡便這里就暫時這樣稱呼它吧,Quad演算法是對de Casteliau演算法的簡化,
與三次Bézier曲線嵌套了三層一次插值不同,Quad使用的是一層二次插值嵌套了一層一次插值,我們首先是分別對 v 0 v 3 \mathbf{v_{0}}\mathbf{v_{3}} v0?v3? v 1 v 2 \mathbf{v_{1}}\mathbf{v_{2}} v1?v2?進行插值,獲得 v 03 \mathbf{v_{03}} v03? v 12 \mathbf{v_{12}} v12? v 03 = L e r p ( v 0 , v 3 ; t ) v 12 = L e r p ( v 1 , v 2 ; t ) \begin{aligned} &\mathbf{v_{03}}=Lerp(\mathbf{v_{0}},\mathbf{v_{3}};t) \\&\mathbf{v_{12}}=Lerp(\mathbf{v_{1}},\mathbf{v_{2}};t) \end{aligned} ?v03?=Lerp(v0?,v3?;t)v12?=Lerp(v1?,v2?;t)?之后,我們使用 2 t ( 1 ? t ) 2t(1?t) 2t(1?t)為引數,對 v 03 \mathbf{v_{03}} v03? v 12 \mathbf{v_{12}} v12?進行二次插值,獲得最終的 v 0312 \mathbf{v_{0312}} v0312? v 0312 = L e r p ( v 03 , v 12 ; 2 t ( 1 ? t ) ) (5.5) \mathbf{v_{0312}}=Lerp(\mathbf{v_{03}},\mathbf{v_{12}};2t(1?t)) \tag{5.5} v0312?=Lerp(v03?,v12?;2t(1?t))(5.5)注意最終的Lerp使用的引數是二次的 2 t ( 1 ? t ) 2t(1?t) 2t(1?t),不是我們一般使用的 t t t,而且它插值的兩個向量也變為了 v 03 \mathbf{v_{03}} v03? v 12 \mathbf{v_{12}} v12?,我們仍然可以使用圖片來理解它(取 t = 0.4 t=0.4 t=0.4):
在這里插入圖片描述
同樣,我們可以將 Quad 寫為遞回形式: Q u a d ( v 0 , v 1 , v 2 , v 3 ; t ) = L e r p ( L e r p ( v 0 , v 3 ; t ) , L e r p ( v 1 , v 2 ; t ) ; 2 t ( 1 ? t ) ) (5.6) Quad(\mathbf{v_{0}},\mathbf{v_{1}},\mathbf{v_{2}},\mathbf{v_{3}};t)=Lerp(Lerp(\mathbf{v_{0}},\mathbf{v_{3}};t),Lerp(\mathbf{v_{1}},\mathbf{v_{2}};t);2t(1-t))\tag{5.6} Quad(v0?,v1?,v2?,v3?;t)=Lerp(Lerp(v0?,v3?;t),Lerp(v1?,v2?;t);2t(1?t))(5.6)
可以看到,這樣的插值要比三次Bézier曲線簡單很多,將七次Lerp減少到了三次.雖然最終的曲線與三次Bézier曲線不完全相同,但是已經很近似了,我們可以看幾個對比,下圖中,左邊是三次Bézier曲線,右邊是Quad曲線:在這里插入圖片描述
如果利用Lerp的定義 L e r p Lerp Lerp的定義 L e r p ( v i , v i + 1 ; t ) = ( 1 ? t ) v i + t v i + 1 Lerp(\mathbf{v_{i}},\mathbf{v_{i+1}};t)=(1-t)\mathbf{v_{i}}+t\mathbf{v_{i+1}} Lerp(vi?,vi+1?;t)=(1?t)vi?+tvi+1?將遞回式展開的話,我們能得到這樣的式子: Q u a d ( v 0 , v 1 , v 2 , v 3 ; t ) = ( 2 t 2 ? 2 t + 1 ) ( 1 ? t ) v 0 + 2 ( 1 ? t ) 2 t v 1 + 2 ( 1 ? t ) t 2 v 2 + ( 2 t 2 ? 2 t + 1 ) t v 3 (5.7) Quad(\mathbf{v_{0}},\mathbf{v_{1}},\mathbf{v_{2}},\mathbf{v_{3}};t)=(2t^{2}-2t+1)(1-t)\mathbf{v_{0}}+2(1-t)^{2}t\mathbf{v_{1}}+2(1-t)t^{2}\mathbf{v_{2}}+(2t^{2}-2t+1)t\mathbf{v_{3}}\tag{5.7} Quad(v0?,v1?,v2?,v3?;t)=(2t2?2t+1)(1?t)v0?+2(1?t)2tv1?+2(1?t)t2v2?+(2t2?2t+1)tv3?(5.7)
它仍是一個三次的曲線,只不過系數有所不同,

6. Squad演算法

6.1 Squad公式形式

如果我們將 Quad 的遞回公式用于球面,就能得到用于四元數的Squad: S q u a d ( q 0 , q 1 , q 2 , q 3 ; t ) = S l e r p ( S l e r p ( q 0 , q 3 ; t ) , S l e r p ( q 1 , q 2 ; t ) ; 2 t ( 1 ? t ) ) (6.1) Squad(q_{0},q_{1},q_{2},q_{3};t)=Slerp(Slerp(q_{0},q_{3};t),Slerp(q_{1},q_{2};t);2t(1-t))\tag{6.1} Squad(q0?,q1?,q2?,q3?;t)=Slerp(Slerp(q0?,q3?;t),Slerp(q1?,q2?;t);2t(1?t))(6.1)

接下來,我們回到本章最初的主題,對多個單位四元數進行插值.如果我們有一個四元數序列 q 0 , q 1 , . . . , q n q_{0},q_{1},...,q_{n} q0?,q1?,...,qn?,我們希望對每一對四元數 q i q_{i} qi? q i + 1 q_{i+1} qi+1?都使用Squad進行插值,所以我們有: S q u a d ( q i , s i , s i + 1 , q i + 1 ; t ) = S l e r p ( S l e r p ( q i , q i + 1 ; t ) , S l e r p ( s i , s i + 1 ; t ) ; 2 t ( 1 ? t ) ) (6.2) Squad(q_{i},s_{i},s_{i+1},q_{i+1};t)=Slerp(Slerp(q_{i},q_{i+1};t),Slerp(s_{i},s_{i+1};t);2t(1-t))\tag{6.2} Squad(qi?,si?,si+1?,qi+1?;t)=Slerp(Slerp(qi?,qi+1?;t),Slerp(si?,si+1?;t);2t(1?t))(6.2)其中 s i , s i + 1 s_{i},s_{i+1} si?,si+1? q i q_{i} qi? q i + 1 q_{i+1} qi+1?之間的控制點: s i = q i exp ? ( log ? ( q i ? 1 ? 1 q i ) ? log ? ( q i ? 1 q i + 1 ) 4 ) (6.3) s_{i}=q_{i}\exp\left (\frac{\log(q^{-1}_{i-1}q_{i})-\log(q^{-1}_{i}q_{i+1})}{4} \right )\tag{6.3} si?=qi?exp(4log(qi?1?1?qi?)?log(qi?1?qi+1?)?)(6.3)Squad的運算式與Quad類似,不同的是Squad用于球面線性插值而非簡單線性插值,Squad的定義形式復雜,因此其產生的插值曲線的連續性和可導性都不明顯,下面來證明它的連續性和一階可導性,

6.2 連續一階可導性證明

Squad最初由Ken Shoemake于1987年發表,作者在原文中提供了可微性的一般性參考,但是原文已丟失,于是作者又在1997年重新發布了Squad的可微性及控制點 s i s_{i} si?的完整證明,
Squad的一階連續可導性在非控制點處是明顯成立的,因為其樣條是分段的三次貝塞爾曲線(實際上它是二階連續可導),現在需要證明其在錨點 q i q_{i} qi?也是成立的,

6.2.1 連續性證明

首先,相鄰分段在錨點處的值是必須相等的: S q u a d ( q i ? 1 , s i ? 1 , s i , q i ; 1 ) = S q u a d ( q i , s i , s i + 1 , q i + 1 ; 0 ) 6.4 ) (() Squad(q_{i-1},s_{i-1},s_{i},q_{i};1)=Squad(q_{i},s_{i},s_{i+1},q_{i+1};0)\tag(6.4) Squad(qi?1?,si?1?,si?,qi?;1)=Squad(qi?,si?,si+1?,qi+1?;0)6.4)(()其中: S q u a d ( q i ? 1 , s i ? 1 , s i , q i ; 1 ) = S l e r p ( S l e r p ( q i ? 1 , q i , 1 ) , S l e r p ( s i ? 1 , s i , 1 ) , 0 ) = S l e r p ( q i , s i , 0 ) = q i \begin{aligned}Squad(q_{i-1},s_{i-1},s_{i},q_{i};1) &= Slerp(Slerp(q_{i-1},q_{i},1),Slerp(s_{i-1},s_{i},1),0) \\&= Slerp(qi,si,0) = q_{i}\end{aligned} Squad(qi?1?,si?1?,si?,qi?;1)?=Slerp(Slerp(qi?1?,qi?,1),Slerp(si?1?,si?,1),0)=Slerp(qi,si,0)=qi?? S q u a d ( q i , s i , s i + 1 , q i + 1 ; 0 ) = S l e r p ( S l e r p ( q i , q i + 1 , 0 ) , S l e r p ( s i , s i + 1 , 0 ) , 0 ) = S l e r p ( q i , s i , 0 ) = q i \begin{aligned}Squad(q_{i},s_{i},s_{i+1},q_{i+1};0) &= Slerp(Slerp(q_{i},q_{i+1},0),Slerp(s_{i},s_{i+1},0),0) \\&= Slerp(qi,si,0) = q_{i}\end{aligned} Squad(qi?,si?,si+1?,qi+1?;0)?=Slerp(Slerp(qi?,qi+1?,0),Slerp(si?,si+1?,0),0)=Slerp(qi,si,0)=qi??
因此,Squad在錨點處是連續的,

6.2.2 一階可微性( C 1 C_{1} C1?)證明

下面開始證明Squad在錨點處的連續可微性,即 C 1 C_{1} C1?,我們通過推導其在錨點的導數來證明,和上邊一樣,必須證明下式成立: d d t S q u a d ( q i ? 1 , s i ? 1 , s i , q i ; 1 ) = d d t S q u a d ( q i , s i , s i + 1 , q i + 1 ; 0 ) 6.5 ) (() \frac{d}{dt}Squad(q_{i-1},s_{i-1},s_{i},q_{i};1)=\frac{d}{dt}Squad(q_{i},s_{i},s_{i+1},q_{i+1};0)\tag(6.5) dtd?Squad(qi?1?,si?1?,si?,qi?;1)=dtd?Squad(qi?,si?,si+1?,qi+1?;0)6.5)(()為了證明Squad的導數,這里需要《三維空間剛體運動4-2中》的Slerp的一階和二階導數公式(5.15)和(5.16),另外,我們知道 S l e r p ( q i , q i + 1 ; t ) = q i ( q i ? q i + 1 ) t Slerp(q_{i},q_{i+1};t)=q_{i}(q^{*}_{i}q_{i+1})^{t} Slerp(qi?,qi+1?;t)=qi?(qi??qi+1?)t(4-2篇中公式(5-7)),所以我們可以將Squad寫成指數形式: S q u a d ( q i , s i , s i + 1 , q i + 1 ; t ) = S l e r p ( q i , q i + 1 ; t ) ( S l e r p ( q i , q i + 1 ; t ) ? S l e r p ( s i , s i + 1 ; t ) ) 2 t ( 1 ? t ) (6.6) \begin{aligned}Squad(q_{i},s_{i},s_{i+1},q_{i+1};t) &=Slerp(q_{i},q_{i+1};t)\left(Slerp(q_{i},q_{i+1};t)^{*}Slerp(s_{i},s_{i+1};t) \right)^{2t(1-t)}\end{aligned}\tag{6.6} Squad(qi?,si?,si+1?,qi+1?;t)?=Slerp(qi?,qi+1?;t)(Slerp(qi?,qi+1?;t)?Slerp(si?,si+1?;t))2t(1?t)?(6.6)
引入以下簡寫: g i ( t ) = S l e r p ( q i , q i + 1 ; t ) ? S l e r p ( s i , s i + 1 ; t ) (6.7) g_{i}(t)=Slerp(q_{i},q_{i+1};t)^{*}Slerp(s_{i},s_{i+1};t) \tag{6.7} gi?(t)=Slerp(qi?,qi+1?;t)?Slerp(si?,si+1?;t)(6.7)
現在我們開始推導 S q u a d ( q i , s i , s i + 1 , q i + 1 ; t ) Squad(q_{i},s_{i},s_{i+1},q_{i+1};t) Squad(qi?,si?,si+1?,qi+1?;t)的導數并決定 s i s^{i} si s i + 1 s^{i+1} si+1的取值,以確保樣條在錨點處的可微性,類似于Bézier曲線樣條,我們同樣需要前一個 q i ? 1 q_{i-1} qi?1?以及 q i + 2 q_{i+2} qi+2?的資訊, s i s_{i} si?的推導還是比較復雜的,但是它最基本的理念非常簡單:讓Squad在切換點可導,從而達到 C 1 C_{1} C1?連續,也就是說,我們希望 q i ? 1 q i q_{i-1}q_{i} qi?1?qi?插值時在 t = 1 t=1 t=1處的導數,與 q i q i + 1 q_{i}q_{i+1} qi?qi+1?插值時在 t = 0 t=0 t=0處的導數相等,如公式(6.6)所示,下面我們就來看看 s i s_{i} si?的具體推導方法, S q u a d ( q i , s i , s i + 1 , q i + 1 ; t ) Squad(q_{i},s_{i},s_{i+1},q_{i+1};t) Squad(qi?,si?,si+1?,qi+1?;t)的關于 t t t導數為:
d d t S q u a d ( q i , s i , s i + 1 , q i + 1 ; t ) = d d t S l e r p ( S l e r p ( q i , q i + 1 ; t ) , S l e r p ( s i , s i + 1 ; t ) ; 2 t ( 1 ? t ) ) = d d t ( S l e r p ( q i , q i + 1 ; t ) g i ( t ) 2 t ( 1 ? t ) ) \begin{aligned}\frac{d}{dt}Squad(q_{i},s_{i},s_{i+1},q_{i+1};t) &= \frac{d}{dt}Slerp(Slerp(q_{i},q_{i+1};t),Slerp(s_{i},s_{i+1};t);2t(1-t)) \\&= \frac{d}{dt}\left(Slerp(q_{i},q_{i+1};t)g_{i}(t)^{2t(1-t)}\right)\end{aligned} dtd?Squad(qi?,si?,si+1?,qi+1?;t)?=dtd?Slerp(Slerp(qi?,qi+1?;t),Slerp(si?,si+1?;t);2t(1?t))=dtd?(Slerp(qi?,qi+1?;t)gi?(t)2t(1?t))?根據《三維空間剛體運動4-1》中節2.2中的當四元數指數函式微分法則可以得到: d d t S q u a d ( q i , s i , s i + 1 , q i + 1 ; t ) = d d t ( S l e r p ( q i , q i + 1 ; t ) g i ( t ) 2 t ( 1 ? t ) ) = ( d d t S l e r p ( q i , q i + 1 ; t ) ) g i ( t ) 2 t ( 1 ? t ) + S l e r p ( q i , q i + 1 ; t ) ( d d t g i ( t ) 2 t ( 1 ? t ) ) = S l e r p ( q i , q i + 1 ; t ) log ? ( q i ? q i + 1 ) g i ( t ) 2 t ( 1 ? t ) + S l e r p ( q i , q i + 1 ; t ) ( d d t g i ( t ) 2 t ( 1 ? t ) ) ) (6.8) \begin{aligned}\frac{d}{dt}Squad(q_{i},s_{i},s_{i+1},q_{i+1};t) &= \frac{d}{dt}\left(Slerp(q_{i},q_{i+1};t)g_{i}(t)^{2t(1-t)}\right) \\&= \left(\frac{d}{dt}Slerp(q_{i},q_{i+1};t)\right)g_{i}(t)^{2t(1-t)}+Slerp(q_{i},q_{i+1};t)\left(\frac{d}{dt}g_{i}(t)^{2t(1-t)} \right) \\&= Slerp(q_{i},q_{i+1};t)\log(q^{*}_{i}q_{i+1})g_{i}(t)^{2t(1-t)}+Slerp(q_{i},q_{i+1};t)\left(\frac{d}{dt}g_{i}(t)^{2t(1-t)})\right)\end{aligned}\tag{6.8} dtd?Squad(qi?,si?,si+1?,qi+1?;t)?=dtd?(Slerp(qi?,qi+1?;t)gi?(t)2t(1?t))=(dtd?Slerp(qi?,qi+1?;t))gi?(t)2t(1?t)+Slerp(qi?,qi+1?;t)(dtd?gi?(t)2t(1?t))=Slerp(qi?,qi+1?;t)log(qi??qi+1?)gi?(t)2t(1?t)+Slerp(qi?,qi+1?;t)(dtd?gi?(t)2t(1?t)))?(6.8)由于 g i ( t ) g_{i}(t) gi?(t)是單位四元數的乘積,所以它的值也在單元圓上,因此 g i ( t ) g_{i}(t) gi?(t)可以被寫為: g i ( t ) = [ cos ? θ g i ( t ) , sin ? θ g i ( t ) ) v g i ( t ) ] (6.9) g_{i}(t)=[\cos\theta_{g_{i}(t)},\sin\theta_{g_{i}(t)})\mathbf{v}_{g_{i}(t)}]\tag{6.9} gi?(t)=[cosθgi?(t)?,sinθgi?(t)?)vgi?(t)?](6.9)這里 v g i ( t ) \mathbf{v}_{g_{i}(t)} vgi?(t)?是單位向量,現在我們可以根據《三維空間剛體運動4-1》中節2.2中的微分法則,來推導 g i ( t ) 2 t ( 1 ? t ) g_{i}(t)^{2t(1-t)} gi?(t)2t(1?t)的導數: d d t g i ( t ) 2 t ( 1 ? t ) = [ ? sin ? ( 2 t ( 1 ? t ) θ g i ( t ) ) ( d d t ( 2 t ( 1 ? t ) ) θ g i ( t ) + 2 t ( 1 ? t ) d d t θ g i ( t ) ) , cos ? ( 2 t ( 1 ? t ) θ g i ( t ) ) ( d d t ( 2 t ( 1 ? t ) ) θ g i ( t ) + 2 t ( 1 ? t ) d d t θ g i ( t ) ) v g i ( t ) + sin ? ( 2 t ( 1 ? t ) θ g i ( t ) ) d d t v g i ( t ) ] = [ ? sin ? ( 2 t ( 1 ? t ) θ g i ( t ) ) ( ( 2 ? 4 t ) θ g i ( t ) + 2 t ( 1 ? t ) θ g i ′ ( t ) ) , cos ? ( 2 t ( 1 ? t ) θ g i ( t ) ) ( ( 2 ? 4 t ) θ g i ( t ) + 2 t ( 1 ? t ) θ g i ′ ( t ) ) v g i ( t ) + sin ? ( 2 t ( 1 ? t ) θ g i ( t ) ) v g i ′ ( t ) ] (6.10) \begin{aligned} \frac{d}{dt}g_{i}(t)^{2t(1-t)} &= [-\sin\left(2t(1-t)\theta_{g_{i}(t)}\right )\left( \frac{d}{dt}(2t(1-t))\theta_{g_{i}(t)}+2t(1-t)\frac{d}{dt}\theta_{g_{i}(t)}\right), \\& \quad \cos\left(2t(1-t)\theta_{g_{i}(t)}\right)\left( \frac{d}{dt}(2t(1-t))\theta_{g_{i}(t)}+2t(1-t)\frac{d}{dt}\theta_{g_{i}(t)}\right )\mathbf{v}_{g_{i}(t)}+\sin\left(2t(1-t)\theta_{g_{i}(t)}\right)\frac{d}{dt}\mathbf{v}_{g_{i}(t)}] \\&= [-\sin\left(2t(1-t)\theta_{g_{i}(t)}\right )\left( (2-4t)\theta_{g_{i}(t)}+2t(1-t)\theta_{g_{i}^{'}(t)}\right), \\& \quad \cos\left(2t(1-t)\theta_{g_{i}(t)}\right)\left((2-4t)\theta_{g_{i}(t)}+2t(1-t)\theta_{g_{i}^{'}(t)}\right )\mathbf{v}_{g_{i}(t)}+\sin\left(2t(1-t)\theta_{g_{i}(t)}\right)\mathbf{v}_{g_{i}^{'}(t)}] \end{aligned}\tag{6.10} dtd?gi?(t)2t(1?t)?=[?sin(2t(1?t)θgi?(t)?)(dtd?(2t(1?t))θgi?(t)?+2t(1?t)dtd?θgi?(t)?),cos(2t(1?t)θgi?(t)?)(dtd?(2t(1?t))θgi?(t)?+2t(1?t)dtd?θgi?(t)?)vgi?(t)?+sin(2t(1?t)θgi?(t)?)dtd?vgi?(t)?]=[?sin(2t(1?t)θgi?(t)?)((2?4t)θgi?(t)?+2t(1?t)θgi?(t)?),cos(2t(1?t)θgi?(t)?)((2?4t)θgi?(t)?+2t(1?t)θgi?(t)?)vgi?(t)?+sin(2t(1?t)θgi?(t)?)vgi?(t)?]?(6.10)上面展開了Squad的導數中所有的子運算式,現在我們根據公式(6.5)求出 s i s_{i} si?的取值,以使Squad的導數在每個錨點處是連續的,
對于公式(6.5)展開式中的 d d t ( g i ? 1 ( t ) 2 t ( 1 ? t ) ) \frac{d}{dt}\left( g_{i-1}(t)^{2t(1-t)} \right) dtd?(gi?1?(t)2t(1?t)) d d t ( g i ( t ) 2 t ( 1 ? t ) ) \frac{d}{dt}\left( g_{i}(t)^{2t(1-t)} \right) dtd?(gi?(t)2t(1?t)),當 t = 1 t=1 t=1時,將公式(6.10)代入公式(6.8),并使用代數相關計算規則和排版得到: d d t S q u a d ( q i ? 1 , s i ? 1 , s i , q i ; 1 ) = S l e r p ( q i ? 1 , q i ; 1 ) log ? ( q i ? 1 ? q i ) + S l e r p ( q i ? 1 , q i ; 1 ) ( d d t g i ? 1 ( t ) 2 t ( 1 ? t ) ) ∣ t = 1 = q i log ? ( q i ? 1 ? q i ) + q i [ 0 , ? 2 θ g i ? 1 ( 1 ) v g i ? 1 ( 1 ) ] = q i ( log ? ( q i ? 1 ? q i ) ? 2 log ? ( [ cos ? ( θ g i ? 1 ( 1 ) ) , sin ? ( θ g i ? 1 ( 1 ) ) v g i ? 1 ( 1 ) ] ) ) = q i ( log ? ( q i ? 1 ? q i ) ? 2 log ? ( g i ? 1 ( 1 ) ) ) = q i ( log ? ( q i ? 1 ? q i ) ? 2 log ? ( q i ? s i ) ) \begin{aligned} \frac{d}{dt}Squad(q_{i-1},s_{i-1},s_{i},q_{i};1) &= Slerp(q_{i-1},q_{i};1)\log(q^{*}_{i-1}q_{i})+ Slerp(q_{i-1},q_{i};1)\left( \frac{d}{dt}g_{i-1}(t)^{2t(1-t)} \right )|_{t=1} \\&= q_{i}\log(q^{*}_{i-1}q_{i})+q_{i}[0,-2\theta_{g_{i-1}(1)}\mathbf{v}_{g_{i-1}(1)}] \\&= q_{i}(\log(q^{*}_{i-1}q_{i})-2\log([\cos(\theta_{g_{i-1}(1)}),\sin(\theta_{g_{i-1}(1)})\mathbf{v}_{g_{i-1}(1)}])) \\&= q_{i}(\log(q^{*}_{i-1}q_{i})-2\log(g_{i-1}(1))) \\&= q_{i}(\log(q^{*}_{i-1}q_{i})-2\log(q^{*}_{i}s_{i}))\end{aligned} dtd?Squad(qi?1?,si?1?,si?,qi?;1)?=Slerp(qi?1?,qi?;1)log(qi?1??qi?)+Slerp(qi?1?,qi?;1)(dtd?gi?1?(t)2t(1?t))t=1?

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/242390.html

標籤:其他

上一篇:(四)基于Multisim的超外差接收系統:檢波器的設計

下一篇:C語言的考試題型

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more