在《圖片是怎么畫到屏幕上的磁奖?》一文里,我們把圖片想象成一個圍棋盤某筐,棋盤上每個格子都有自己的顏色比搭,而顏色是可以表達(dá)成三個數(shù)字的,所以圖片最終被表達(dá)成一系列的數(shù)值南誊。在繪制圖片的時候身诺,游戲會把圖片的數(shù)值告訴屏幕,屏幕根據(jù)這些數(shù)值把這張圖片繪制出來抄囚。
這篇文章說說3D模型是怎么表達(dá)成一系列數(shù)值的霉赡,以及怎么把這些數(shù)值告訴屏幕,從而實現(xiàn)3D模型的繪制幔托。
先以《水果忍者》里的西瓜為例說下什么是3D模型穴亏。
假設(shè)我們到水果攤上買了一個西瓜(真正能吃的西瓜),完了拿一根針在西瓜皮上戳洞重挑,每戳一下嗓化,相當(dāng)于在西瓜表面上挑選一個點,戳了一個小時后谬哀,我們得到了成百上千的點蟆湖,然后我們再耐著性子,把鄰近的點用直線連起來玻粪,使它們之間形成一個個的小三角形,等把全部點連完诬垂,我們就大功告成了劲室。這些戳出來的點叫做3D模型的頂點,它們之間的直線叫做3D模型的邊结窘,而那些三角形叫做3D模型的面很洋。這些點、邊隧枫、面一起構(gòu)成了一個非常復(fù)雜的多面體喉磁,這就是西瓜的幾何模型谓苟。大家看看下邊這個海豚的模型就會有個直觀的感受。
顯然协怒,戳出來的點越多涝焙,多面體的面就會越多,整個模型也就越貼近真實的西瓜孕暇。如果你還記得《聲音是如何播放出來的仑撞?》一文里所提到的數(shù)字信號的采樣過程,你會發(fā)現(xiàn)妖滔,這個血腥殘忍的西瓜戳洞過程其實就相當(dāng)于對西瓜表面位置信息的一次采樣隧哮,采樣率越高,模型自然就越真實座舍。
現(xiàn)在沮翔,我們得記錄下每個點的位置以及每個面的顏色。點的位置容易理解曲秉,面的顏色得解釋一下采蚀。出于簡單考慮,我們定一個規(guī)則:如果這個面的三個點都戳在了黑色瓜紋上岸浑,我們就把這個面定成黑色搏存,否則我們把它定成綠色。記錄好后矢洲,我們就得到了這個西瓜模型的數(shù)值表述:這里面不僅有幾何位置璧眠,還有顏色。
接著读虏,我們說說怎么把3D模型畫到屏幕上责静。我們依然可以把這個繪制的過程看做是給屏幕上的每個像素格子賦予一個顏色值的過程,只不過如今賦值的方式會稍微復(fù)雜一些盖桥。
我們把西瓜的模型放在屏幕后方的某個地方灾螃,然后在屏幕前方選一個點,這個點叫做焦點(下圖中藍(lán)色的點)揩徊。我們知道兩點可以決定一條直線腰鬼,因此屏幕上的每個像素格子都可以和這個焦點一起,決定一條直線塑荒,如果這條直線和西瓜模型的某個面相交了熄赡,我們就把這個面的顏色(綠色或黑色)賦值給這個像素格子;如果這條直線沒有和西瓜模型相交齿税,我們就把背景的顏色(比如灰色)賦值給這個像素彼硫。這樣,等所有像素格子都掃過一遍,我們就畫出一個灰色背景下的西瓜了拧篮。
在《水果忍者》里词渤,一個西瓜飛上來的時候,它除了飛行以外串绩,還在翻滾缺虐。每一幀,游戲都得根據(jù)它的物理規(guī)則赏参,計算出模型上的每個頂點的位置志笼,然后按照上面所說的方法把模型渲染出來。由于每一幀都需要重新渲染把篓,所以我們說這個3D模型是通過即時渲染的方式繪制出來的纫溃。
最后得特別說明一下,本文并不是在敘述具體的建模過程韧掩,實際上從原畫紊浩、建模到貼圖、動作是一個十分繁復(fù)的流程疗锐;而渲染時除了位置和顏色外坊谁,還涉及到材質(zhì)、光源等許多因素滑臊。跟本系列的其它文章一樣口芍,本文還是希望以易讀為目的,不周全之處大家見諒雇卷。