
本文轉自我的公眾號——游戲開發那些事
在談到游戲世界中的坐標軸時,我們經常會看到這樣的爭論。
“游戲中Y軸是向上的好么?這你都不知道?”
“不對,空間直角坐標系不就是Z軸向上的么?”
“拜托,請搞清楚坐標系再來討論好么?”.....
對于長期接觸Z軸向上的空間直角坐標系的我也存在著同樣的困惑,左右手坐標系已經夠讓人頭大了,為什么連哪個軸向上都不能統一一下?而后當我試圖通過搜索引擎尋找答案時,發現這個問題確實有不少人在討論,也終于搞清楚了其中的緣由。


故事可能要從著名的三維建模軟件3DS Max說起。3DS Max是公司AutoDesk第一款建模軟件,它于1990年發布,主要用于設計和建筑領域。

在建筑學中,通常要先從平面圖開始設計,所以先在2D網格上繪制X軸和Y軸,隨后在將其拉伸成3D模型。很自然的,他們將下一個軸設置向上,即在3DMAX里面向上的便是Z軸(Z-Up)。這種思路與我們在學校時第一次從平面幾何踏入空間幾何的想法完全契合。

而在1998年,另一款著名的建模軟件——Maya誕生了。Maya一開始主要作為動畫軟件系統發行,廣泛用于動畫電影當中。

與建筑領域相似,當時的動畫通常也是2D的,即正面看Y軸向上,X軸向右。不過早期的迪士尼和其他動畫作品為了能在不改變2D畫面效果的條件下增加維度(例如2D平臺游戲),保留了X軸和Y軸的朝向,新增的Z軸便成為了深度。當然,這里也有一定程度的歷史原因——由于Maya一開始為SGI的(硅谷圖形公司Silicon Graphics, Inc.)硬件開發,SGI早期提供的渲染引擎就是Y軸向上的,所以Maya就跟隨SGI的標準制定坐標系(Y-Up)。

其實,造成這種差異的根本原因在于你是在屏幕空間中思考還是在世界空間中進行思考。
在屏幕空間中,給定X和Y的屏幕坐標,將Z作為深度可以方便的處理遮擋問題(即Y-Up)。許多渲染技術(DX、OpenGL)都使用“ Z緩沖區”之類的名稱的來處理屏幕空間渲染(三維空間的渲染最后還是會輸出到屏幕空間)。很明顯,在二維環境中,Y軸向上的坐標系更有意義一些。

然而在世界空間中,我們通常希望像現實一樣構建三維的世界。正常的三維空間示意圖都將第三個坐標視為垂直方向的(即Z-Up)。要在世界空間中定義一個矩形,則要給出其長、寬、高。如果將Y視為垂直方向,那么就會陷入了一種不符合常識的情況,與我們多年來接觸的笛卡爾坐標系相悖。

當你仔細調查一下目前流行的軟件時,你會發現不同的軟件其坐標系默認都是不一樣的。除了前面提到的兩款三維建模軟件,另外兩款著名的游戲引擎Unity與Unreal也有著不同的坐標系。受到歷史因素的影響,Unreal誕生時3DS Max是當時大多數開發人員選擇的建模工具包(Maya還沒有誕生),所以采用了Z軸向上的左手系坐標。而Unity3D在2000以后才正式發布,采用的則是Y軸朝上左手坐標系。

由于標準的不同,導致我們在使用不同游戲引擎以及不同建模軟件交互時需要手動處理坐標系的轉換。而對于那些只接觸過部分軟件的人往往會保留“Z軸向上”或者“Y軸的向上”的固有印象,從而造成了前面提到的爭論現象。無論哪種坐標系,都有其一定的道理,我們理解其中的緣由并能靈活的運用即可。
最后,再幫大家復習一下左手坐標系和右手坐標系(揮動雙手的同時不妨點個贊支持一下)。
