CG仿真及3D特效編程教程(一)| CG Simulation總覽及基礎(chǔ)數(shù)學(xué)概念回顧
前言
“What will matter is what you learned and how you used it.”這是本系列教程前,我們想對大家說的,希望本次系列教程能夠?qū)ο矚g圖形學(xué)的虹圖AI開放平臺的開發(fā)者有所幫助。當(dāng)然同時也為了推廣我們虹圖繼美顏SDK特效后推出的3D Avatar SDK。
最近上映的大型中國古代神話電影封神第一部,不禁感嘆這幾年CG的飛速發(fā)展,讓觀眾在享受觀感的同時已經(jīng)很難區(qū)分特效和現(xiàn)實了。大型游戲也早已從2D轉(zhuǎn)為3D,并且伴隨酷炫的特效,就連音視頻中的特效也不再滿足于美顏、貼紙,而是向元宇宙靠攏的3D化特效。而本系列教程,就圍繞仿真(Simulation)和3D特效編程(3D Programming)。
這個過程中涉及到的大多是很枯燥的理論和公式,需要有好的代數(shù)、幾何、少量微積分基礎(chǔ)。本系列預(yù)計會分為3-4篇幅,會整體講述3D坐標(biāo)變換、牛頓法求非線性方程根、逆向運動學(xué)、功能性動效、碰撞、脈沖動量、反彈、3D粒子系統(tǒng)等。另外,這并不是一個圖形學(xué)編程的教程,但是其中會有一些圖形學(xué)代碼框架用來才是我們的代碼,如果是尋找圖形學(xué)編程系列教程,可以關(guān)注我們另一系列關(guān)于OpenGL和Vulkan的教程。
那現(xiàn)在我們就從最基礎(chǔ)分析3D世界的參數(shù)方程開始吧。
參數(shù)方程
直線方程相信大家都很熟悉,y = ax + b,但是這個表達(dá)方式并不適用于圖形學(xué)和仿真3D編程。首先這個只能代表無窮直線,而不是一條有限長度的線段,其次這是2D的表達(dá),而不是3D。這里會有人說,那么z = ax + by + c不就是3D的嗎?這個是平面方程也不是空間直線方程,可以去額外了解下,這里不做贅述。
空間直線的參數(shù)方程,如下圖所示,P0(X0,Y0,Z0),P1(X1,Y1,Z1),那么參數(shù)方程這樣表達(dá):

當(dāng)然,也可以換一種表達(dá),都是同一個意思:

線性融合Liner Blending
在計算機(jī)圖形學(xué)相關(guān)的應(yīng)用里,線性融合是個常用的方式,比如在圖像、顏色、形狀、位置、旋轉(zhuǎn)角度等方面。我們基于以下公式進(jìn)行線性融合計算:

還可以使用雙線性融合,其核心思想就是從兩個方向分別進(jìn)行一次線性融合,例如在四邊形內(nèi)做雙線性融合:

先線性融合Q00和Q10形成的線段A,再融合Q01和Q11形成的線段B,然后進(jìn)行線段A和線段B的二次線性融合,得出以下:

當(dāng)然,還可以進(jìn)行三線性融合,例如在立方體里進(jìn)行:

向量
這個部分應(yīng)該大家還是比較熟悉的,但是還是不厭其煩再介紹一下吧。首先向量是有方向和大小的,它可以形象化成帶箭頭的線段,箭頭就是方向,長度就是大小。

方向就是箭頭所示,大小就是:

另外還有單位向量,模等于1的向量,也就是一個非零向量除以它的模,可得所需單位向量。
下面再引入兩個能勾起大家回憶的概念,向量積和向量的積,或者換個說法,向量點乘和向量叉乘,類似不同的叫法還有很多。

這是向量點乘,也叫標(biāo)量積Scalar Product。這個經(jīng)常用于計算A向量在B方向的值大小,因為它是向量a在向量b方向上的投影與向量b的模的乘積。

這是向量叉乘,也叫適量積Vector Product。叉乘后的方向遵守右手定則:

也正是由于遵循右手定律,叉乘所以不具備交換律:

叉乘在計算機(jī)圖形學(xué)中應(yīng)用就比較廣泛了,比如計算垂直于某一平面的向量,也就是法線向量:

而這通常在CG光照中經(jīng)常被使用。
OpenGL Mathematics(GLM)
最后再介紹下后續(xù)我們會用到的GLM。GLM是OpenGL中在進(jìn)行圖形變換的時候需要使用幾何數(shù)學(xué)庫,但它其實不是真實的庫的形式,而是.hpp頭文件參與源碼編譯的,可以在這個鏈接下載:https://github.com/g-truc/glm。
我們可以這樣引入GLM:
當(dāng)然也可以只引入你需要的頭文件,下面是如何使用GLM的一些例子:
關(guān)于GLM配置方面問題,網(wǎng)上也有不少參考資料,當(dāng)然也基于具體是win系統(tǒng)還是Linux系統(tǒng),有問題也可以私信聯(lián)系。
本期教程屬于預(yù)熱一些基礎(chǔ)知識,把必要的概念和GLM先介紹給大家,后續(xù)會進(jìn)一步深入,一起探索仿真和3D編程相關(guān)內(nèi)容。歡迎大家關(guān)注虹圖AI開放平臺公眾號獲取更多內(nèi)容,也請大家多多關(guān)注我們新發(fā)布的美顏SDK產(chǎn)品和3D Avatar SDK產(chǎn)品。
敬請期待~