CG仿真及3D特效編程教程(二)| 變換和運(yùn)動(dòng)學(xué)計(jì)算及代碼實(shí)現(xiàn)
回顧
上一期分享中,給大家回顧了一些基礎(chǔ)概念,參數(shù)方程及向量,然后引入了GLM的用法,希望大家都已經(jīng)配置成功,如果有任何問(wèn)題需要協(xié)助,可以隨時(shí)留言給我們,也可以通過(guò)虹圖美顏SDK開(kāi)發(fā)者社區(qū)進(jìn)行交流和分享。
這一期講會(huì)給大家講述關(guān)于3D變換,運(yùn)動(dòng)學(xué)基礎(chǔ)及代碼實(shí)現(xiàn)。
幾何vs拓?fù)?/strong>
首先我們看下幾何結(jié)構(gòu)和拓?fù)浣Y(jié)構(gòu)的區(qū)別。假定原始結(jié)構(gòu)是如下圖所示:

變成下圖所示,其實(shí)就是幾何結(jié)構(gòu)變化,可以觀察到的是幾何形狀發(fā)生了改變,但是拓?fù)漤樞虿⑽窗l(fā)生變化,仍然是1-2-3-4-1。

如果變成現(xiàn)在下面這張圖,就是拓?fù)渥兓?,可以觀察到的是幾何形狀沒(méi)有發(fā)生變化,但是拓?fù)漤樞蜃兓?,變成?-2-4-3-1。

那么幾何結(jié)構(gòu)其實(shí)就是圖形在坐標(biāo)系的位置,拓?fù)浣Y(jié)構(gòu)就是連接順序。
我們把在坐標(biāo)系中位置移動(dòng)成為坐標(biāo)變換Coordinate?Transformation,例如坐標(biāo)系中,P需要沿著X軸移動(dòng)2個(gè)單位,新坐標(biāo)變成P'=(P',P')=(P +2.,P)。

3D坐標(biāo)的線性變換可以用下面的公式來(lái)表達(dá):
x'=?Ax+By+Cz+D
y'?=?Ex +?Fy +?Gz +?H
z'?=?Ix +?Jy +?Kz +?L
比如位置的平移:

縮放:

旋轉(zhuǎn):

讓我們?cè)倩氐竭@個(gè)變換公式:
x'=?Ax+By+Cz+D
y’?=?Ex +?Fy +?Gz +?H
z'?=?Ix +?Jy +?Kz +?L
現(xiàn)在我們用矩陣的方式來(lái)看看如何實(shí)現(xiàn)。

同樣的方式我們能知道平移矩陣:

縮放矩陣:

正向運(yùn)動(dòng)學(xué)
相信類(lèi)似的機(jī)械臂大家都見(jiàn)過(guò),此處的正向運(yùn)動(dòng)學(xué)的對(duì)象是機(jī)械臂的運(yùn)動(dòng)狀態(tài)。一個(gè)機(jī)械臂由多個(gè)連桿(Link) 和鏈接他們的關(guān)節(jié)(Joint) 組成。這三個(gè)不同的部分看做三個(gè)不同的坐標(biāo)系統(tǒng),并且和地面都有一定的夾角。

那么抽象后它們每個(gè)部分都該如何運(yùn)動(dòng)呢?

對(duì)于模塊1之于地面,先是旋轉(zhuǎn)了θ1角度,平移量記為T(mén)1/G,可得到新的位置:

對(duì)于模塊2,先是旋轉(zhuǎn)了θ2角度,平移了模塊1的長(zhǎng)度,又旋轉(zhuǎn)了θ1角度,平移了T1/G,可得出新的位置:

同樣的方法能得出模塊3的位置:

那么我們通過(guò)代碼來(lái)實(shí)現(xiàn):
畫(huà)模塊這個(gè)可以使用OpenGL方法繪制:
繪制整個(gè)擺臂鏈條:
最后再繪制窗口定義一些3D視窗的信息等:
逆向運(yùn)動(dòng)學(xué)
正向運(yùn)動(dòng)學(xué)是在給定所有關(guān)節(jié)角度的情況下計(jì)算末端運(yùn)動(dòng)空間位置的過(guò)程,而逆向運(yùn)動(dòng)學(xué)則正好相反,它是在給定末端的空間位置的前提下,求解關(guān)節(jié)需要成多少角度。那么如何計(jì)算出這個(gè)角度呢?這里介紹一種循環(huán)坐標(biāo)下降(Cyclic Coordinate Descent ,CCD)算法。

簡(jiǎn)單來(lái)說(shuō)就是目標(biāo)坐標(biāo)如果是(X*,Y*),那么就先變?chǔ)?,讓?zhuān)╔,Y)盡可能接近(X*,Y*),然后再變?chǔ)?,然后θ3,不行就再次變?chǔ)?,然后θ2,然后θ3,以此類(lèi)推,最終達(dá)到(X*,Y*)。當(dāng)然,變?chǔ)?時(shí),保持θ2和θ3恒定,其他也是亦然。
本期給大家介紹了一些坐標(biāo)變換及變換矩陣,以及運(yùn)動(dòng)學(xué)模擬和代碼,重點(diǎn)還是正向運(yùn)動(dòng)學(xué)的例子,可以重點(diǎn)參考學(xué)習(xí)下。如果大家有問(wèn)題可以留言給我們,我們會(huì)進(jìn)行解答,如果需要更快獲得幫助,可以在虹圖AI開(kāi)放平臺(tái)開(kāi)發(fā)者社區(qū)板塊提問(wèn)。
關(guān)于虹圖AI人像人體特效的美顏SDK,3D Avatar SDK等產(chǎn)品.
敬請(qǐng)期待~??