課程概述
如果您已經(jīng)通過(guò)前兩課教程進(jìn)展至斯,您現(xiàn)在可以開(kāi)始了寫(xiě)3D程序了。 然而,3D編程不是像土匪斗惡霸那么簡(jiǎn)單。它是嚴(yán)格的數(shù)學(xué),你必須了解三維數(shù)學(xué)概念,才能寫(xiě)好3D程序。 不要擔(dān)心這沒(méi)什么復(fù)雜的。 我保證您不會(huì)在數(shù)學(xué)上花費(fèi)比學(xué)C + +更多的時(shí)間。
這一課是純理論課。 我們將在下一課中實(shí)踐我們的理論。 在這一課中我們將介紹坐標(biāo)系統(tǒng)和它們?nèi)绾芜m用于Direct3D以及創(chuàng)造一個(gè)3D場(chǎng)景。
三維坐標(biāo)系
如果沒(méi)有基本的3D數(shù)學(xué)的理解,三維編程是不可能的。 而且我不是指大學(xué)數(shù)學(xué)都做一遍,我們只要理解三維坐標(biāo)的概念,它們是如何工作,以及你可能用到的和各種東西。
當(dāng)然,在你了解3D坐標(biāo)系統(tǒng)之前,您需要先理解笛卡爾坐標(biāo)。
直角坐標(biāo)系
笛卡爾坐標(biāo)系統(tǒng)會(huì)使你更好的認(rèn)識(shí)二維坐標(biāo)系統(tǒng)。 換句話(huà)說(shuō),它是一個(gè)在平面上確定一個(gè)點(diǎn)的位置的系統(tǒng)。
一個(gè)點(diǎn)是指沿軸的準(zhǔn)確位置。 如果我們想知道有多遠(yuǎn)的東西走了,我們通常給一個(gè)確切的數(shù)字,如“范跑跑跑了12米。” 12米,是沿著一個(gè)軸的距離。 我們說(shuō),0是這個(gè)的起點(diǎn),作為范跑跑,他的位置越來(lái)越遠(yuǎn)沿著這條軸線(xiàn)。 這是一個(gè)一維的坐標(biāo)系。
圖片3.1 - 一維坐標(biāo)系
當(dāng)我們看這情景,從側(cè)面圖片中,我們可以看到,作為范跑跑,他繼續(xù)朝著屏幕右側(cè)跑啊跑,他和那個(gè)'0'點(diǎn)的距離越來(lái)越遠(yuǎn)。 而這個(gè)'0'的由來(lái),是因?yàn)?/span>范跑跑從這里開(kāi)始跑(那間教室)。 在在向左的方向上,他的距離是一個(gè)負(fù)值。
但是,如果他此時(shí)轉(zhuǎn)90度,往不同的方向走會(huì)怎樣? 我們考慮一下實(shí)際情況,當(dāng)他向右跑了12米,沖出了教室,這時(shí)他來(lái)到了走廊,再往前就要跳下樓了,于是他只好左轉(zhuǎn)向著樓抵口跑。
圖片3.2 - 直角坐標(biāo)系
現(xiàn)在增加了一個(gè)軸,垂直軸,我們稱(chēng)其為Y軸。 首先在水平軸X軸上,沿此軸范跑跑跑了12米,然后他又沿著Y軸的方向跑起來(lái)。
當(dāng)然,這種新的軸,跟水平軸一樣,也有一個(gè)起源。 他是范跑跑在X軸上跑路的終點(diǎn),因?yàn)樗?/span>開(kāi)始沿著Y軸跑了。 請(qǐng)注意,在Y軸原點(diǎn)也給出了0值,并隨范跑跑在Y軸上的跑路Y軸愈來(lái)愈長(zhǎng)。
所以,現(xiàn)在我們有兩個(gè)軸(X軸和Y軸),每個(gè)有其起點(diǎn)。 嗯,這就是笛卡爾形式的直角坐標(biāo)系。 現(xiàn)在,我們可以找到任何在這個(gè)面上的點(diǎn)。 我們可以他離各軸原點(diǎn)的距離確定他的精確位置,所以我們可以說(shuō)他是在(x,y)或(12,4),12是他在X軸上跑的距離,4是他在Y軸上跑的距離。這兩個(gè)數(shù)字稱(chēng)為坐標(biāo),一個(gè)點(diǎn)離坐標(biāo)原點(diǎn)((),0)有多遠(yuǎn)。
三維坐標(biāo)系
其實(shí),三維坐標(biāo)系,只不過(guò)是我們剛剛討論的情況的拓展。 假如我們把直角坐標(biāo)系,并添加了第三軸(Z軸)上運(yùn)行垂直于X和Y軸,我們將有三維坐標(biāo)。 這里說(shuō)明了這一點(diǎn)。

圖片3.3 - 三維坐標(biāo)系
像笛卡爾坐標(biāo)一樣,三維坐標(biāo)既可以是正值也可以是負(fù)值,這取決于點(diǎn)處在改軸的哪個(gè)方向上。 然而和直角坐標(biāo)不一樣的是,三維坐標(biāo)是三個(gè)數(shù)字,例如:(的x,y,z)或(12,4,15)。 這表明在范跑跑老師在十五米的高空(6樓)。 它也可以寫(xiě)成(12,4,-15)。 也許這意味著他被埋在了煤窯。
三角幾何
現(xiàn)在讓我們討論三維坐標(biāo)如何應(yīng)用到游戲和游戲編程。 如果三維點(diǎn)坐標(biāo)系統(tǒng)中的一個(gè)點(diǎn)代表一個(gè)在空間中的點(diǎn),那么我們可以通過(guò)一組這樣的點(diǎn)最終生成一個(gè)三維模型。 當(dāng)然,這么多點(diǎn)的設(shè)置將在內(nèi)存中占用的空間很大,于是一種更方便,更快捷的方式就出現(xiàn)了,那就是設(shè)置使用三角形。
在任何跟數(shù)學(xué)相關(guān)的領(lǐng)域三角形都是一個(gè)非常有用的形狀,它們可以用于測(cè)量圓,他們可以用來(lái)加強(qiáng)建筑物,它們也可以被用來(lái)創(chuàng)建3D圖像。 究其原因,我們將要使用三角形是因?yàn)槿切慰梢?/span>組成幾乎任何形狀,比如下圖的正方體和球就是由一個(gè)個(gè)三角形構(gòu)成:

圖片3.4 - 從三角形制作出來(lái)的模型
由于三角形在創(chuàng)建三維模型方面的各種優(yōu)越性,Direct3D被設(shè)計(jì)為完全圍繞三角形并通過(guò)三角形組成各種形狀。為了要建立一個(gè)三角形,我們需要使用一種叫做頂點(diǎn)集的東西。
頂點(diǎn)集是由頂點(diǎn)組成的。一個(gè)頂點(diǎn)被定義為一個(gè)在三維空間中的確切的點(diǎn)。 它包括三個(gè)值x,y和z。 在Direct3D中,我們還有包含這一點(diǎn)的各種屬性。 因此,我們擴(kuò)展的定義是指“在三維空間中的精確點(diǎn)的屬性和位置”。
三角形是由三個(gè)順時(shí)針地在您的程序中定義頂點(diǎn)。 當(dāng)編碼完成后,這三個(gè)頂點(diǎn)形成一個(gè)平坦的可以自由旋轉(zhuǎn),添加質(zhì)感,定位和修改的表面。

圖片3.5 - 通過(guò)頂點(diǎn)集創(chuàng)建的三角形
在圖像顯示的三角形3.5有三個(gè)頂點(diǎn):
X = 0,Y = 5,Z = 1
X= 5,Ÿ = -5,Z = 1
X = 5,Ÿ = -5,Z = 1
你會(huì)發(fā)現(xiàn),上述所有頂點(diǎn)的Z都等于-1。 這是因?yàn)槲覀儾皇窃谡務(wù)撘粋€(gè)3D對(duì)象,而是在談?wù)撘粋€(gè)三角形,這是一個(gè)二維物體。 我們當(dāng)然可以改變這個(gè)Z值,但這并不會(huì)產(chǎn)生什么實(shí)質(zhì)的影響。
為了創(chuàng)建一個(gè)3D對(duì)象,我們將需要組合多個(gè)三角形。 在上面的圖3.4你可以看到如何用三角形組合出其他形狀。 比如說(shuō)這在個(gè)3-4里,立方體德一個(gè)邊就是由兩個(gè)簡(jiǎn)單的三角形組成。 這個(gè)立方體的每個(gè)面都是這樣組成的。
然而,定義三維坐標(biāo)游戲中的每個(gè)三角形多次不僅僅是愚蠢,這簡(jiǎn)直就是愚蠢!。 這里還有沒(méi)有必要為涉及(你會(huì)看到我在下一課的意思)。
而不是定義每一個(gè)游戲中的每一個(gè)三角形的角落,你需要做的就是創(chuàng)建一個(gè)頂點(diǎn),包含每一個(gè)頂點(diǎn)的坐標(biāo)和信息,以及他們進(jìn)去的順序
基元
基元(primitives,又稱(chēng)為圖元或者原語(yǔ)) ,是3D環(huán)境中的一個(gè)單一的元素,可以是一個(gè)三角形,一條線(xiàn),一個(gè)點(diǎn),或其他隨便什么。 以下是基元可以被合并以創(chuàng)建三維對(duì)象的方法列表:
1. 點(diǎn)列表 Point Lists
2. 線(xiàn)列表 Line Lists
3. 線(xiàn)帶 Line Strips
4. 三角形列表 Triangle Lists
5. 三角形帶Triangle Strips
6. 三角扇形 Triangle Fans
1. 點(diǎn)列表
一個(gè)點(diǎn)列表是一組為在屏幕上顯示的頂點(diǎn)的列表。 它們可用于渲染3D星空,創(chuàng)建虛線(xiàn),顯示在小地圖上的位置等。 圖片3.6說(shuō)明了點(diǎn)列是如何顯示在屏幕上。

圖片3.6 - 一個(gè)點(diǎn)列(6基元)
2. 線(xiàn)列表
線(xiàn)列表是一組頂點(diǎn)的列表,其中奇數(shù)的頂點(diǎn)和其下一個(gè)頂點(diǎn)會(huì)連成線(xiàn)段。 這些可用于各種效果,包括三維網(wǎng)格,暴雨,航點(diǎn)線(xiàn),等等。 圖片3.7說(shuō)明了線(xiàn)列如何在屏幕上顯示(這是和以前相同的一組頂點(diǎn))。

圖片3.7 - A線(xiàn)一覽(3基元)
3. 線(xiàn)帶
線(xiàn)帶是類(lèi)似于線(xiàn)列表,不同之處在于它所有的頂點(diǎn)(不分奇數(shù)還是偶數(shù))都和下一個(gè)頂點(diǎn)用線(xiàn)段連起來(lái)。 這對(duì)創(chuàng)建線(xiàn)框模型非常有用,如線(xiàn)框地形,草葉片,以及其他不是基于模型的對(duì)象。 這對(duì)于調(diào)試程序也是非常有用的。 圖片3.8說(shuō)明了如何線(xiàn)帶是在屏幕上顯示。

圖片3.8 - A線(xiàn)地帶(5基元)
4.三角形列表
一個(gè)三角形列表是把每三個(gè)頂點(diǎn)組成一個(gè)單一的獨(dú)立的三角形的頂點(diǎn)列表。 這可以在諸如力場(chǎng),爆炸效果,以及把對(duì)象拼湊在一起,圖3.9說(shuō)明了三角形列表如何在屏幕上顯示。

圖片3.9 - A線(xiàn)列表(2基元)
5.三角形帶
一個(gè)三角形地帶是一個(gè)頂創(chuàng)建一系列互相連接的三角形的頂點(diǎn)列表,。 這是三維圖形處理最常用的方法。 這些大多是用于創(chuàng)建你的游戲的3D模型。 圖片3.10三角形帶說(shuō)明了是如何顯示在屏幕上。請(qǐng)注意,前三個(gè)頂點(diǎn)創(chuàng)建一個(gè)三角形,然后下個(gè)頂點(diǎn)和它的前兩個(gè)頂點(diǎn)構(gòu)成一個(gè)三角形。

圖像3.10 - 一個(gè)三角地帶(4圖元)
6。 三角扇形
三角扇形類(lèi)似于三角形帶,不同的是所有三角形共用一個(gè)頂點(diǎn)。 見(jiàn)圖3.11:

圖像3.11 - 三角形扇(4圖元)
一個(gè)基元的問(wèn)題
繪制基元的時(shí)候有一個(gè)小問(wèn)題出現(xiàn)了,那就是你的三角形只有一面要顯示,但是系統(tǒng)畫(huà)了兩面。 沒(méi)錯(cuò)它的確可以顯示兩面,但通常一個(gè)模型是完全封閉的,你看不到它的內(nèi)部。 如果模型是完全封閉的,每個(gè)三角形只有一面需要繪制。 畢竟,繪制兩面要多花費(fèi)一倍的時(shí)間。 下面你會(huì)看到這個(gè)繪制兩面和一面的區(qū)別。
一個(gè)三角形基元只有當(dāng)其頂點(diǎn)是順時(shí)針順序給出時(shí)才能繪制。 如果您翻轉(zhuǎn)它周?chē)蔀槟鏁r(shí)針,因此不會(huì)顯示。

圖像3.12 - 基元只有順時(shí)針時(shí)可見(jiàn)
有一個(gè)簡(jiǎn)單的方法(雖然當(dāng)你進(jìn)入較大得游戲時(shí)這會(huì)很繁瑣,),那就是兩面都繪制,令人原始順時(shí)針和其他反時(shí)針?lè)较颉?/span>

圖像3.13 - 兩面都繪制時(shí)兩種方式都可見(jiàn)
顏色
色彩是3D編程中一個(gè)相當(dāng)簡(jiǎn)單的部分。 然而,即使你對(duì)彩色光譜和光物理學(xué)非常熟悉,這只是讓你更容易地知道Direct3D不完全遵循這個(gè)宇宙的規(guī)律。 那樣做只能是圖形硬件和CPU的噩夢(mèng)。那太多了,所以我們只給圖形這樣的矩陣,并創(chuàng)建我們自己的規(guī)則以便能夠?qū)λM(jìn)行處理。
光,當(dāng)然是粒子的波,使您可以看到身邊各種對(duì)象之間的區(qū)別。 Direct3D運(yùn)用圖形硬件進(jìn)行各種數(shù)學(xué)算法虛擬出這一點(diǎn)。 然后,圖像就會(huì)顯示在屏幕上。 在這一節(jié)我們將介紹如何用Direct3D 虛擬我們?cè)谧匀?/span>看到的光。
減法色 VS加法色
在您受教育的早些時(shí)期,你可以學(xué)到的原色是紅色,藍(lán)色和黃色。 這不是真正的情況。 顏色實(shí)際上是洋紅,青色和黃色。 以及為什么沒(méi)用的技術(shù)細(xì)節(jié)? 要理解這一點(diǎn),你必須了解減法色和加法色的概念。
這兩種顏色之間的區(qū)別在于是否顏色是指光的顏色或一個(gè)物體的顏色。 減色是一個(gè)對(duì)象的顏色,并有原色洋紅,青色和黃色。 加法色是光的顏色,有紅,綠,藍(lán)三原光。
在光束中,越多顏色添加進(jìn)來(lái)就越接近白色。 所有的顏色加在一起就成了白色,因此它被稱(chēng)為加色。

圖像3.14 - 加法色顏色越多越白
上面你可以看到三原光疊加起來(lái)就成了白色。 不過(guò),如果你仔細(xì)看,你還會(huì)看到當(dāng)你把兩種原光疊加起來(lái)你會(huì)得到一個(gè)減法色的原色(洋紅,青色或者黃色)。 如果我們仔細(xì)看看這些減法色,我們將看到這是為什么。
減法色基本上是和加法色相反的。 它們并不是由一個(gè)表面反射的光疊加構(gòu)成。 例如,一個(gè)紅色物體,被白色的光照亮會(huì)反映紅光是因?yàn)樗?/span>吸收了綠色和藍(lán)色光。 如果你看上面的圖3.14,你會(huì)看到綠色和藍(lán)色的結(jié)合-----青色,所以青色被從白光中減去,結(jié)果就顯示紅色。

圖3.15 - 減法色減到最后就成了黑色
在圖形編程中,您將始終使用(紅,綠,藍(lán))三元光的添加色,因?yàn)轱@示器是自發(fā)光的。 而親手建立一個(gè)3D引擎會(huì)有助于你理解是什么使物體的顏色看起來(lái)這樣或者那樣。
順便說(shuō)一下,這就是為什么你會(huì)發(fā)現(xiàn)在屏幕上紅色,綠色和藍(lán)色而打印出來(lái)就成了洋紅,青色和黃色,
如果你想深入地研究顏色,下面是一個(gè)網(wǎng)站對(duì)色彩和光物理學(xué)有比較徹底的研究。 如果你想到了未來(lái)DirectX 10的次世代游戲,我會(huì)認(rèn)真地建議你學(xué)好顏色。 這里還有更多呢意想不到的東西,這會(huì)使得在一個(gè)大的游戲引擎有很大的改觀。
總之,請(qǐng)猛擊這個(gè)鏈接: http://www.byronc.com/art_color.shtml
Alpha通道
Alpha通道是在紅綠藍(lán)三原光之外一個(gè)額外的通道,透明通道。 當(dāng)你將透明通道引入你的顏色設(shè)置,圖形會(huì)顯示半透明,讓您通過(guò)物體看到其背后的其他物體。 這在游戲中會(huì)是一個(gè)很有用的功能,比如說(shuō)美女的紗衣(我邪惡了),以及其他許多有用的東西。 我敢肯定你一定會(huì)用到它。
設(shè)置32位色彩
Direct3D的色彩由一個(gè)32位變量的組成,它存儲(chǔ)所有的信息。 這包括三原光(簡(jiǎn)稱(chēng)RGB)和Alpha的值。 這些每一個(gè)被稱(chēng)為通道 ,每個(gè)通道占用8位,如下圖:

圖像3.16 - 顏色bit布局
以下是定義上述的顏色的代碼:
DWORD Color_A = 0xff00ff00;
DWORD Color_B = 0x88ff00cc;


還有兩種方法來(lái)創(chuàng)建這些顏色,我們需要插入每個(gè)通道的值。
DWORD Color_A = D3DCOLOR_XRGB(0,255,0);
DWORD Color_B = D3DCOLOR_ARGB(136,255,0,204);

函數(shù)D3DCOLOR_ARGB()返回一個(gè)包含紅綠藍(lán)以及透明通道的信息的DWORD值。 如果你不想使用透明,那么你可以使用D3DCOLOR_XRGB(),它會(huì)用255填充Alpha通道的值。
如果你想看到這樣的一個(gè)例子,請(qǐng)從第1課和第2課中找出清除屏幕后使用D3DCOLOR_XRGB()函數(shù)的例子。
光與色
我不打算把關(guān)于光這的每一點(diǎn)都講到。 我留一些放在以后的課中。 現(xiàn)在,我只是想介紹下基本的光差,因?yàn)樵谔砑庸饩€(xiàn)進(jìn)你的程序之前你必須對(duì)它有部分的了解
自然光,是一個(gè)非常復(fù)雜的數(shù)學(xué)說(shuō)法。 當(dāng)陽(yáng)光普照,幾乎一切都是由它點(diǎn)亮,即使它沒(méi)有照到太多我們能看見(jiàn)的東西。 這是因?yàn)?/span>光會(huì)向周?chē)貐^(qū)進(jìn)行數(shù)千次反射,無(wú)論是陽(yáng)光普照或陰天,這就是漫反射。 為了進(jìn)一步增加色差,由于在陽(yáng)光穿越的空間中,有一部分是反映灰塵粒子,這樣的漫反射是無(wú)法計(jì)算了。 即使電腦可以計(jì)算出這一切,它葉不能實(shí)時(shí)運(yùn)行。
Direct3D使用的系統(tǒng)致力于模擬真實(shí)的環(huán)境光。 要做到這一點(diǎn),它把光分解成三個(gè)類(lèi)型----漫射光 ,環(huán)境光 與鏡面反射,三者結(jié)合在一起使得結(jié)果會(huì)接近于實(shí)際光。
漫射光
漫射光的間接照在物體上的光。 如下圖這個(gè)球就是只用漫射光照明的。

圖3.17 - 漫反射
稍后,您將了解光源。 這個(gè)球是由來(lái)自左邊的一個(gè)點(diǎn)光源照亮。 球離光源越遠(yuǎn),得到的光照就越少。
環(huán)境光
環(huán)境光被認(rèn)為是無(wú)處不在的光。 不同于漫射光的是,它沒(méi)有來(lái)源,如果單獨(dú)使用會(huì)出現(xiàn)一個(gè)圈(因?yàn)樗械牟考?/span>被照亮了)。 這個(gè)球和上一個(gè)完全一樣,但這次添加了環(huán)境光照在黑暗部分。

圖像3.18 - 漫和環(huán)境照明
鏡面光
這有時(shí)也被稱(chēng)為鏡面高亮,因?yàn)樗怀龇从沉艘粋€(gè)反光的顏色對(duì)象。 這個(gè)球極受到漫射光和環(huán)境光照明,又具有高光使它看起來(lái)更加真實(shí)。

圖像3.19 - 漫射,照明光和鏡面光
綜述
現(xiàn)在,你應(yīng)該已經(jīng)了解了三維的基本概念,以及它是如何應(yīng)用到游戲編程。 現(xiàn)在讓我們實(shí)踐這一切的理論。 在下一課中,你將建立一個(gè)基本的三角形。
下一課:畫(huà)一個(gè)三角形
Translate By 王大寶(OneDouble.net)
鑒于中英文混排看著累,從這集開(kāi)始,不再采用中英文對(duì)照排版,想看英文原版的朋友請(qǐng)移步至原帖,謝謝