計算機動畫的本質(zhì)上是解微分方程均践,因此本文主要介紹微分方程常用的一些解法桂躏。
particle system
首先從最簡單的內(nèi)容開始抢埋,也就是particle system宋渔。
上面是particle system的一個簡單的案例州疾,也就是一個彈簧+一個block,block在彈簧的作用下左右運動傻谁,其中彈簧不受力的情況下block所在的位置為原點孝治,這里用q表示位置,那么上述狀態(tài)可以用q=0來表示审磁,定義向左為負谈飒,向右為正,相應(yīng)的速度與加速度也可以基于下面的公式得到:
動能kinetic energy與勢能potential energy則由如下的公式進行表示:
其中m與k分別表示block的質(zhì)量與彈簧的彈性系數(shù)态蒂,而彈簧的彈力可通過下述公式計算得到:
根據(jù)前面的公式可以知道杭措,彈力是conservative force的一種。
所謂的conservative force指的是將一個particle從一個點移動到另一個點做的功是跟移動的路徑無關(guān)的力钾恢,在這個定義下手素,如果將一個particle沿著任意路徑移動最后回到原點,那么力的整體做功(微分下可以用表示)為0瘩蚪,在conservative force的作用下泉懦,不論沿著哪條路徑,只要保證首尾點是相同的疹瘦,那么都會導(dǎo)致勢能的變化幅度是相同的崩哩,常見的力中,重力跟彈力是conservative force,而摩擦力則不是conservative force邓嘹,從這個角度來理解酣栈,conservative force是跟位置相關(guān)的力,而這種力作用的效果就是將位置的變化轉(zhuǎn)換為勢能的變化汹押。
一個力場(force field)如果滿足下面三個公式中的任意一個矿筝,那么就可以說明這個力場是conservative的:
力的curl是0向量
在2D空間中,上述公式可以簡化為:
閉環(huán)移動時棚贾,做功為0
力可以通過對勢能的梯度取反來表示:
前面兩個公式計算比較復(fù)雜窖维,通常我們會使用第三個公式進行conservative force的判斷,根據(jù)前面彈簧粒子的公式鸟悴,我們可以判斷彈力就是conservative force陈辱。
再說回彈簧粒子系統(tǒng),根據(jù)能量守恒定律细诸,我們有:
其中C是常量,對這個公式的左右兩邊對時間進行求導(dǎo)陋守,就可以得到:
上述這個公式有兩個解:
其中第一個解的含義是速度不變震贵,也就是物件靜止,這種情況我們是不關(guān)心的水评,我們主要關(guān)心第二個解猩系,這個解我們換個寫法:
用中文的話翻譯一下,就是物體運動的加速度大小與物體的受力成正比中燥,跟物體的質(zhì)量成反比寇甸,這就是牛頓第二定律(作為回顧:牛頓第一定律也稱為慣性定律,可以表述為任何物體都要保持勻速直線運動或靜止狀態(tài)疗涉,直到外力迫使它改變運動狀態(tài)為止拿霉;牛頓第三定律可以表述為相互作用的兩個物體之間的作用力和反作用力總是大小相等,方向相反咱扣,作用在同一條直線上)绽淘。
下面再來看一個復(fù)雜一點的案例,block從一個變成兩個:
動能公式就變成了:
用矩陣來表示就可以寫成:
這里需要注意的是闹伪,我們前面說過沪铭,單個block的情況下,我們是以彈簧原始長度時block所在的位置為原點的偏瓤,而實際上我們這里選擇的坐標系是比較隨性的杀怠,而不是有固定的一套標準,而使用不同的坐標系厅克,得到的公式是不一樣的赔退,雖然他們輸出的結(jié)果是一樣的(能量不隨坐標系的變化),而這給了我們一個啟發(fā)已骇,在實際使用中要謹慎選擇坐標系离钝,不同的坐標系計算公式不一樣票编,導(dǎo)致計算效率會受影響,而這對于結(jié)果的輸出并沒有任何收益卵渴。
數(shù)值積分
重寫一下前面的牛頓第二定律的公式:
這是一個以q為變量的二階微分方程慧域,在物理動畫模擬中,我們最終需要的是計算各個時刻的位置浪读,也就是解出每個time step下的q昔榴,而求解微分方程的方式就是數(shù)值積分。
為了解前面這個二階微分方程碘橘,我們這里嘗試將之改寫成一個一階的常微分方程(目的是降低求解的復(fù)雜度互订?),令
那么有
上面為了進行一般化處理痘拆,用替代了仰禽,那么怎么來理解這個y以及y的微分呢?
如下圖所示纺蛆,我們以q作為橫坐標吐葵,作為縱坐標繪制一個坐標系(這個坐標系這里稱之為phase space,當然桥氏,這里只是一個近似温峭,真實的phase space的縱坐標是動量,不過不影響)字支,當我們?nèi)↑c來看凤藏,其微分結(jié)果為,也就是一條水平方向(向右)的向量堕伪,如下面所示:
同樣揖庄,如果我們?nèi)↑c來看,其微分結(jié)果為刃跛,也就是一條垂直方向(向下)的向量抠艾,如下面所示:
實際上,對單block的彈簧系統(tǒng)而言桨昙,對于每個y坐標检号,在phase space中得到的y的微分,稱為y的速度向量蛙酪,都可以得到這個向量是沿著順時針方向的齐苛,如果我們做特殊處理,取k = m桂塞,那么將所有點連起來凹蜂,我們就能得到一個正圓,如下圖所示:
不同半徑的正圓對應(yīng)于彈簧和諧運動的振幅,通過這個正圓也可以看到玛痊,在q為0的時候汰瘫,速度的絕對值最大,反之速度為0的時候擂煞,則是位置的絕對值最大的時候混弥;另外,對于任意一個y对省,其速度都是這個正圓上的切線蝗拿,也就是說下一刻的位置同樣是在正圓上,如果沒有摩擦力的存在蒿涎,那么就意味著這個block將在這個圓上永無止盡的運動下去哀托。
在進行數(shù)值積分方法介紹之前,我們先來看下不同的積分方法的評價標準劳秋,總的來說仓手,對于一個數(shù)值積分方法好不好,我們通常有如下三個評判標準:
- stability玻淑,穩(wěn)定性俗或,整個系統(tǒng)會隨著時間的變遷變得穩(wěn)定,不論是勻速運動岁忘,還是隨著能量的衰減逐漸趨于靜止,或者在某個有限的能量的范圍內(nèi)來回振蕩
- accuracy区匠,精確度干像,指的是我們通過數(shù)值積分模擬出來的結(jié)果跟真實的精確解之間的誤差
- convergence,收斂度驰弄,指的是我們在進行數(shù)值積分模擬計算的時候麻汰,模擬的time step在不斷收縮的情況下,其模擬的精度是否不斷逼近真實解戚篙。
將上面的公式做一下近似五鲫,這里用explicit euler(顯式歐拉)公式進行模擬,即中y取k:
從而得到
按照上面這個公式岔擂,由于是在y點的切線位喂,也就是說計算得到的下一個坐標點將落在當前坐標點所規(guī)范的圓形外面,那么經(jīng)過這個公式計算出來的運動軌跡將不能保證是圓形的乱灵,而是半徑不斷擴大的螺旋曲線塑崖,也就是說,這個方法是不穩(wěn)定的痛倚,即系統(tǒng)的能量越來越大(半徑對應(yīng)著振幅):
在顯式歐拉方法下规婆,我們看下整體方案的誤差,根據(jù)泰勒展式:
可以看到,顯式歐拉只使用了之前的部分抒蚜,也就是說是屬于一階微分方程掘鄙,其誤差自然就可以算出來等于了。
如果前面不用顯式歐拉嗡髓,而是使用implicit euler(隱式歐拉)操漠,即中y取k+1:
在這種情況下,右邊是一個方程器贩,在彈簧系統(tǒng)中颅夺,這個方程是可以顯式表達的,但是在其他的系統(tǒng)尤其是復(fù)雜系統(tǒng)中蛹稍,這個方程是沒有辦法表達出來的吧黄,也就是說這個公式通過解析方法是沒有辦法計算得到的。
根據(jù)上面的公式唆姐,仿造前面顯式歐拉的邏輯拗慨,我們可以看出來,y(k)是比y(k+1)半徑要大的奉芦,也就是說赵抢,在這個系統(tǒng)中,半徑在不斷減小声功,能量在不斷衰退烦却,最終衰減到0,那么就處于靜止先巴,也就是說這種方式得到的是一個穩(wěn)定的解(當然其爵,這里需要說清楚的是,不是所有的系統(tǒng)使用隱式歐拉都是穩(wěn)定的伸蚯,只有那些能量守恒的系統(tǒng)才是穩(wěn)定的)摩渺,不過呢由于沒有解析解,因此求解會很麻煩剂邮。
下面要介紹的是一個叫做symplectic euler(辛歐拉唁桩,或者半顯式歐拉火脉,半隱式歐拉方案)的數(shù)值積分方法局待,根據(jù)前面的公式亡问,我們有:
將之轉(zhuǎn)換為微分方程:
又回到前面的問題,右邊的向量中的q是應(yīng)該取k還是k+1時刻的值瑞眼,前面我們說過龙宏,取k的值是顯式歐拉的方案,好處是數(shù)值是已知的伤疙,這個方程可以解出來的银酗,缺點則是系統(tǒng)不穩(wěn)定辆影,而取k+1的時候則是隱式歐拉的方案,好處是方案是穩(wěn)定的黍特,而缺點則是方程求解困難蛙讥,基于這一點,我們這里考慮使用一個混合的方案灭衷,即上述方程中第二個分量使用顯式歐拉方案次慢,第一個分量則使用隱式歐拉方案,如下所示:
根據(jù)上面的公式翔曲,我們可以先根據(jù)第二個分量的公式迫像,計算出,之后這個數(shù)值可以代入到第一個公式瞳遍,求得闻妓,這里借用了顯式歐拉的好處,只是需要確定的是掠械,是否同時帶入了顯式歐拉的缺點——不穩(wěn)定由缆。
在彈簧系統(tǒng)中,上述公式可以表示為:
從而求得:
根據(jù)這公式通過不斷迭代可以得到:
好像也不能說明啥猾蒂,寫成矩陣形式:
這個等式右邊的2x2的矩陣均唉,我們可以很容易計算出其行列式=1,而根據(jù)線性代數(shù)的理論肚菠,我們可以知道舔箭,矩陣的行列式恰好等于變換前后兩個形狀的面積之比,也就是說蚊逢,某個區(qū)域的數(shù)據(jù)集合經(jīng)過這個矩陣變化后得到的新的區(qū)域限嫌,兩個區(qū)域的面積之比就恰好等于矩陣的行列式,而這里行列式為1就說明經(jīng)過這個矩陣的變換时捌,數(shù)據(jù)是基本維持穩(wěn)定的,不會膨脹炉抒,也不會坍縮奢讨,而是能量守恒的(自然也是穩(wěn)定的系統(tǒng))。
而雖然上述結(jié)論是在彈簧系統(tǒng)中推導(dǎo)出來的焰薄,但實際上這個結(jié)論的應(yīng)用面是可以推廣到一般的(當然拿诸,不是所有的系統(tǒng)都可以使用),對于系統(tǒng)內(nèi)僅包含動能和勢能的系統(tǒng)而言塞茅,在經(jīng)典力學范疇中亩码,這個結(jié)論是成立的,即通過辛歐拉算法得到的解都是穩(wěn)定的(甚至能量守恒的)野瘦。