無論是2d還是3d游戲開發(fā)刽辙,圖形學都是基礎,解析幾何的基本思想是將幾何圖形抽象成點的運動軌跡拨匆,從而點可以作為組成圖形的基本元素讯检,而描述一個點的位置首先需要建立合適的坐標系琐鲁,再從代碼層面來理解,在調用任何需要設置位置的函數(shù)人灼,或從函數(shù)獲取位置信息前围段,必須要明確這個函數(shù)使用哪個坐標系,有了清晰的坐標系認識投放,能幫助你更順暢地理解游戲世界奈泪。
2D世界的坐標系
# 2D世界的坐標系比較好理解,以cocos2d為例灸芳,它支持如下幾種坐標系:
- 屏幕坐標系:又名UI坐標系涝桅,標準屏幕坐標系使用和OpenGL不同的坐標系,原點在左上角烙样,X軸向右冯遂,Y軸向下。
- GL坐標系:原點在左下角误阻,X軸向右债蜜,Y軸向上晴埂。
- 世界坐標系:又名絕對坐標系,世界即指游戲世界寻定,是游戲開發(fā)中建立的概念儒洛,我們只要知道世界坐標系和 OpenGL 坐標系方向一致,原點在屏幕左下角狼速, x 軸向右琅锻, y 軸向上。
- 節(jié)點坐標系:又名相對坐標系向胡,本地坐標恼蓬,和 OpenGL 坐標系方向一致,每個結點都有自己的坐標系僵芹。
對于初學者來說处硬,可能并不能完成理解以上幾種坐標系的應用,我覺得可以這么理解拇派,屏幕坐標系和GL坐標系是一種坐標系理念荷辕,而節(jié)點坐標系和世界坐標系是兩種不同的應用,即兩者都是用的GL坐標系的理念件豌,只是坐標系原點不相同疮方;另外屏幕坐標系主要應用在Touch對象中的坐標(沒去細究為啥不用GL坐標系)
Unity3D的四種坐標系
# U3D使用的是左手坐標系,如下圖:
世界坐標系
世界坐標是按照笛卡爾坐標系定義出來的絕對坐標系茧彤,下面的各種坐標系都建立在世界坐標的基礎上骡显。我們知道二維平面內任意一個點可以用二維坐標(x,y)來表示,如果將這個概念延伸到三維空間內曾掂,那么三維空間內任意一個點都可以用三維坐標(x,y,z)來表示惫谤。Unity3D采用的是左手坐標系。在Unity3D中我們可以使用transform.position來獲取場景中一個物體的世界坐標遭殉,通常情況下編輯器中的Inspector窗口是以世界坐標來描述一個3D物體的位置的石挂,除非當一個3D物體存在父物體的時候,它會以相對坐標來描述其位置险污。
屏幕坐標系
屏幕坐標是以像素來定義的痹愚,它的范圍是以左下角為(0,0),右上角為(Screen.width,Screen.height)定義的這樣一個矩形蛔糯。屏幕坐標是一個3D坐標拯腮,Z軸是以相機的世界單位來衡量的。屏幕坐標和相機之間滿足:Screen.width=Camera.pixelWidth和Screen.height=Camera.pixelHeight這兩個條件蚁飒。例如我們將相機正對著場景中的原點(0,0,0),相機的Z軸分量為-10动壤,按照屏幕坐標的定義,假設屏幕為800X640的大小淮逻,則此時原點轉化為屏幕坐標后應該是(400,320,10)琼懊。在Unity3D中我們可以使用WorldToScreenPoint來將一個世界坐標轉換為屏幕坐標阁簸。
鼠標位置Input.mousePosition獲取的是屏幕坐標。
例如場景分辨率1024x768哼丈,如果屏幕被縮小至100x100启妹,那么點擊右上角是100x100,而不是分辨率的1024x768醉旦。
視口坐標系
視口坐標是標準化后的屏幕坐標饶米。標準化的概念我們可以引申到向量的標準化中,比如一個向量(x,y)將過標準化后可以得到一個單位向量(x’,y’)车胡。類似地檬输,視口坐標是以0到1間的數(shù)字來表示的,它的范圍是以左下角為(0,0),右上角為(1,1)定義的這樣一個矩形匈棘。視口坐標是一個3D坐標丧慈,Z軸是以相機的世界單位來衡量的。通過對比可以發(fā)現(xiàn)視口坐標和屏幕坐標特別的相似羹饰,所以這里大家可以對比著來學習伊滋。同樣以屏幕坐標中的例子來將這里的轉換碳却,例如我們將相機正對著場景中的原點(0,0,0),相機的Z軸分量為-10队秩,按照屏幕坐標的定義,假設屏幕為800X640的大小昼浦,則此時原點轉化為視口坐標后應該是(0.5,0.5,10)馍资。在Unity3D中我們可以使用WorldToViewportPoint來將一個世界坐標轉換為視口坐標。
GUI坐標系
GUI坐標是指通過OnGUI方法繪制UI時使用的坐標关噪。這個坐標系和屏幕坐標類似鸟蟹,它同樣是以像素來定義的,它的范圍是以左上角為(0,0),右下角為(Screen.width,Screen.height)定義的這樣一個矩形使兔,GUI坐標是一個2D坐標(絕對坐標)建钥。我們知道使用絕對坐標來進行布局的話是沒有辦法做自適應的,UI自適應的一個主要觀點就是不要使用絕對坐標虐沥!不要使用絕對坐標熊经!不要使用絕對坐標!
總結
關于GUI坐標系在接下來UGUI的文章中會再詳細分析欲险,暫時抄襲如下:
uGUI的坐標本質上是特殊的屏幕坐標镐依,uGUI的Anchor決定了該坐標系的原點,pivot決定了元素本身坐標系的原點天试,正是這兩個屬性讓uGUI的坐標看起來顯得撲朔迷離