任何坐標(biāo)系,都是用來描述物體的運(yùn)動(dòng)軌跡拂募,在游戲中會(huì)經(jīng)常使用坐標(biāo)系庭猩,它們大部分是為了計(jì)算物體的位置、距離和角度陈症。
二維坐標(biāo)系
坐標(biāo)系的專業(yè)名稱叫做笛卡爾坐標(biāo)系蔼水,它分為二維笛卡爾坐標(biāo)系和三維笛卡爾坐標(biāo)系(以下簡(jiǎn)稱坐標(biāo)系),二維坐標(biāo)系由原點(diǎn)录肯、X軸和Y軸組成趴腋。在游戲領(lǐng)域,二維坐標(biāo)系主要在屏幕空間映射時(shí)會(huì)使用到论咏,它分為兩個(gè)標(biāo)準(zhǔn):OpenGL和DirectX优炬,它們之間最大的區(qū)別在于對(duì)原點(diǎn)和Y軸的位置定義不同。OpenGL標(biāo)準(zhǔn)原點(diǎn)在左下角厅贪,Y軸正軸朝上蠢护;而DirectX標(biāo)準(zhǔn)原點(diǎn)在左上角,Y軸正軸朝下养涮。
三維坐標(biāo)系
三維坐標(biāo)系由原點(diǎn)葵硕、X軸、Y軸和Z軸組成贯吓,坐標(biāo)軸之間兩兩互相垂直相交懈凹。三個(gè)坐標(biāo)軸又叫做坐標(biāo)系的基矢量,如果坐標(biāo)軸長(zhǎng)度都為1宣决,那么這樣的基矢量被稱為標(biāo)準(zhǔn)正交基蘸劈,正交這個(gè)詞我們經(jīng)常聽見,它其實(shí)就是表示互相垂直的意思尊沸。
三維坐標(biāo)系在游戲引擎威沫、建模軟件中經(jīng)常使用,它的情況要比二維坐標(biāo)系更加復(fù)雜洼专。不同的軟件棒掠,采用的三維坐標(biāo)系朝向都可能有所不同,有的是Y軸朝上屁商,有的是Z軸朝上烟很,雖然朝向各有所不同,但總的可分為兩大類:左手坐標(biāo)系和右手坐標(biāo)系蜡镶。任何軟件使用的三位坐標(biāo)系雾袱,總是可以通過旋轉(zhuǎn)來判斷出它是左手坐標(biāo)系還是右手坐標(biāo)系。
游戲中向前官还、向右等方向的描述芹橡,和游戲引擎使用的坐標(biāo)系有很大的關(guān)系。不同的游戲引擎望伦,前后方向都很可能是相反的林说,所以明確坐標(biāo)系的類型非常重要煎殷。
另外一個(gè)就是旋轉(zhuǎn)方向問題。以鐘表為例腿箩,順時(shí)針和逆時(shí)針旋轉(zhuǎn)大家都能分清楚吧豪直。對(duì)于左手坐標(biāo)系而言,它旋轉(zhuǎn)的正方向是順時(shí)針珠移,而右手坐標(biāo)系旋轉(zhuǎn)的正方向是逆時(shí)針弓乙。大家可以通過左右手法則,來確定旋轉(zhuǎn)的正方向钧惧。以左手坐標(biāo)系為例唆貌,伸出左手,拇指豎直垢乙,其他手指微握锨咙,微握的方向就代表左手坐標(biāo)系旋轉(zhuǎn)的正方向。右手坐標(biāo)系同樣如此追逮。
各種空間概念
游戲開發(fā)中經(jīng)常會(huì)聽到各種空間酪刀,什么模型空間、世界空間钮孵、觀察空間和屏幕空間骂倘,它們到底是什么意思呢?
模型空間
模型空間又叫對(duì)象空間或者局部空間巴席,每個(gè)模型自身就是一個(gè)坐標(biāo)系历涝,在編寫shader時(shí)我們說的頂點(diǎn)坐標(biāo),其實(shí)是模型上的點(diǎn)相對(duì)于模型空間的原點(diǎn)而言的漾唉。模型的原點(diǎn)是可以在三維軟件自定義的荧库。
以3dsMAX為例小槐,它可以通過調(diào)整軸來修改原點(diǎn)位置践瓷,原點(diǎn)一旦修改,模型導(dǎo)出后肩民,各頂點(diǎn)的坐標(biāo)也會(huì)發(fā)生改變般此。
模型導(dǎo)出成obj格式后蚪战,用記事本打開,可以看到各個(gè)頂點(diǎn)的坐標(biāo)铐懊。Y軸為0邀桑,表示的是長(zhǎng)方體底面的四個(gè)頂點(diǎn)。因?yàn)?dsMAX創(chuàng)建的長(zhǎng)方體科乎,默認(rèn)以底面中心作為長(zhǎng)方體模型空間的原點(diǎn)壁畸。
另外還需要注意的是:模型空間坐標(biāo)會(huì)受旋轉(zhuǎn)的影響而發(fā)生改變,旋轉(zhuǎn)之后喜喂,它的各坐標(biāo)軸都會(huì)發(fā)生變化瓤摧。在游戲編程中,經(jīng)常會(huì)遇到“角色旋轉(zhuǎn)45度玉吁,然后向前行走100米”類似這樣的邏輯照弥,這其實(shí)是針對(duì)模型空間而言的,通常情況下进副,就要將角色使用的坐標(biāo)系切換到局部坐標(biāo)系这揣,然后調(diào)用旋轉(zhuǎn)、向前之類的API方法影斑,這樣才能得到正確結(jié)果给赞。我們經(jīng)常說的方位術(shù)語,比如forward矫户、back片迅、left、right皆辽、up柑蛇、down之類的,其實(shí)也是針對(duì)模型空間來說的驱闷。
世界空間
世界空間是一個(gè)絕對(duì)位置耻台,它描述的是一個(gè)宏觀的大空間,而且他的坐標(biāo)軸方向使不會(huì)發(fā)生變化的空另。這個(gè)很好理解盆耽,但在一些情況下,模型空間位置會(huì)等于世界空間扼菠,這取決于物體本身的層次結(jié)構(gòu)摄杂。
如果物體本身沒有父節(jié)點(diǎn),那么這個(gè)物體的模型空間位置會(huì)等于世界空間位置循榆;
如果物體本身有父節(jié)點(diǎn)匙姜,那么物體的位置是指相對(duì)于父節(jié)點(diǎn)模型空間而言的;
如果物體從父節(jié)點(diǎn)移出冯痢,此時(shí)物體的位置會(huì)被自動(dòng)轉(zhuǎn)換成世界空間坐標(biāo)氮昧;
觀察空間
再來說說觀察空間,觀察空間又叫相機(jī)空間浦楣,它是以攝像機(jī)為原點(diǎn)的空間袖肥,攝像機(jī)所在的位置就是觀察空間的原點(diǎn)。正因?yàn)槿绱苏窭停^察空間的坐標(biāo)系往往和世界坐標(biāo)椎组、模型坐標(biāo)是相反的。
屏幕空間
其他三個(gè)空間都是三維坐標(biāo)系历恐,而屏幕空間是一個(gè)二維空間寸癌,觀察空間向屏幕空間轉(zhuǎn)換专筷,就叫做投影。但它們之間還有一次轉(zhuǎn)換蒸苇,叫做裁剪空間轉(zhuǎn)換磷蛹。
裁剪空間
模型能否被渲染,取決于相機(jī)的是視野范圍溪烤,這通過相機(jī)的視錐體來定義味咳,視錐體類似于一個(gè)梯形空間,通過設(shè)置最近距離檬嘀、最遠(yuǎn)距離以及視野角度來定義視錐體的范圍槽驶。模型只有在視錐體范圍內(nèi)才能被渲染。
觀察空間經(jīng)過一個(gè)透視投影的操作鸳兽,將所有頂點(diǎn)變換到裁剪空間內(nèi)掂铐,視錐體作為裁剪空間的一部分,決定了相機(jī)可以看到的空間揍异,裁剪空間的存在堡纬,是為了方便對(duì)圖元進(jìn)行裁剪。