幾何圖形的基礎(chǔ)數(shù)據(jù)
哈嘍大家好,終于得空兒,來(lái)聊聊幾何圖形的數(shù)據(jù),是如何記錄的。

咱們常見(jiàn)的模型啊,一般有兩種:多邊形網(wǎng)格,和NURBS曲面。像咱們熟知的obj,fbx,abc等格式的模型,都屬于多邊形網(wǎng)格的范疇,而NURBS曲面呢,由于更擅長(zhǎng)表現(xiàn)平滑的表面,常用于工業(yè)建模。
這篇文兒出發(fā)點(diǎn),是為 Blender 幾何節(jié)點(diǎn)那期視頻做的補(bǔ)充,所以,咱們的主要話題,只圍繞多邊形網(wǎng)格展開(kāi)。
從一個(gè)最簡(jiǎn)單的正方體開(kāi)始,來(lái)瞧瞧,在計(jì)算機(jī)內(nèi),是如何畫(huà)出3D模型的?


第一步:按位置畫(huà)點(diǎn)
想要畫(huà)出一個(gè)正方體,首先,需要畫(huà)出8個(gè)頂點(diǎn),頂點(diǎn)的位置數(shù)據(jù),也就是這樣一組3維的矢量:
現(xiàn)在,就得到了一片離散的點(diǎn),也可以叫點(diǎn)云,每個(gè)點(diǎn)上只存儲(chǔ)了點(diǎn)的位置屬性。

稍微拓展一下,如果為每個(gè)點(diǎn)加上:速度,質(zhì)量,ID,生命,半徑,顏色等屬性的數(shù)據(jù),那就和粒子差不多了,所以,在幾何節(jié)點(diǎn)模塊,也是可以做粒子模擬的。

第二步:圍點(diǎn)成面
咱們接著第二步,開(kāi)始畫(huà)立方體的6個(gè)面。也很簡(jiǎn)單,記下每個(gè)面,所包含的頂點(diǎn)編號(hào),就可以把面畫(huà)出來(lái)了。
所以,面的數(shù)據(jù),是這樣一組對(duì)點(diǎn)編號(hào)的引用:
看起來(lái)像是一組4維矢量,其實(shí)也不一定哈,這會(huì)兒都是4邊面嘛,如果是三角面的話,那每個(gè)面就只有三個(gè)點(diǎn)的引用了。

至于邊,算是衍生數(shù)據(jù),包含在面的點(diǎn)引用之中,兩個(gè)相鄰點(diǎn),就可以看作是一條邊。
第三步:定義法向
接下來(lái),咱們定義下面的正反,也就是法向。

每個(gè)面的法向,其實(shí)也是衍生數(shù)據(jù),可以按照點(diǎn)的引用順序,根據(jù)右手螺旋定則來(lái)確定,比如5號(hào)面的點(diǎn)順序是:7,3,1,5,咱們用右手?jǐn)[出個(gè)點(diǎn)贊的手勢(shì),讓四指指向7,3,1,5,的螺旋方向,那么,大拇指指向的,就是5號(hào)面的法向。
第四步:展開(kāi)UV
展UV的過(guò)程,是把三維模型的表面,展開(kāi),投射到一個(gè)二維的坐標(biāo)上。

在這個(gè)過(guò)程中,咱們就不得不引入一個(gè)新的概念 - 面拐。
好奇怪的名字,感覺(jué)還是把英文:Face Corner,直譯成:面角,更容易理解一些。
它的本意就是,面上的每個(gè)角。

為啥要再弄個(gè)新概念呢,你看哈,在展UV的過(guò)程中,原先的頂點(diǎn)會(huì)隨著面,分裂成多個(gè),比如正方體的0號(hào)點(diǎn),在UV坐標(biāo)上,就分在了3個(gè)位置上,總不能把三個(gè)UV坐標(biāo)都存在這1個(gè)點(diǎn)上吧。
而面拐呢,它定義就是每個(gè)面所包含的角,所以先天性的,已經(jīng)把面都拆分好了。

二維的UV坐標(biāo),記錄在面拐上,順理成章,就可以把模型的表面展開(kāi)。

總結(jié)
這么四步下來(lái),3D的模型就算是構(gòu)建出來(lái)了,再往后就是渲染的步驟了。
最后總結(jié)下:
對(duì)于3D模型,最基礎(chǔ)的幾何數(shù)據(jù)是:點(diǎn)的位置,和面對(duì)點(diǎn)的引用。
邊和法向的數(shù)據(jù)都包含在面中,而UV數(shù)據(jù)存儲(chǔ)在面拐中。
現(xiàn)在,多邊形網(wǎng)格的4個(gè)數(shù)據(jù)域,或者說(shuō)數(shù)據(jù)層級(jí),點(diǎn),邊,面,面拐,就都帶到了。
再往后,就看大家如何修改和使用這些數(shù)據(jù)了。
OK,以上就是本期的全部?jī)?nèi)容了,感謝大家的支持,咱們下期再見(jiàn)。