Unity引擎時非常成熟的,引擎內部運用了很多的數學知識,他對開發者來說是不可見的,而且他已經封裝好的算法也不是很全面。此外,要是使用引擎封裝好的算法也要明白其實現的原理。
寫過一些代碼,也參考了一些博客,書籍,想就此記錄總結一下的自己所學到的東西,也給大家分享一下。
而我主要想從這五個方面來簡要說說,分別是Unity坐標系,向量,矩陣,四元數,歐拉角。這篇先來介紹第一個。
在介紹Unity的坐標系錢,我想先談談3D坐標系,表示的是三維空間,它存在着三個坐標軸,分別是X軸,Y軸,Z軸。3D坐標系分為左手坐標系和右手坐標系。左手坐標系就是Y軸指上方,X軸指向右方,而Z軸指向前方;而右手坐標系和左手坐標系的X軸和Y軸志向相同,Z軸的方向正好相反。便於理解:大拇指指向的方向就是Z軸的方向,四指彎曲的方向就是從X軸到Y軸的方向,左右手都可以這樣判斷。
(1)世界坐標(World Space)
Unity引擎的左手坐標系也被稱為世界坐標系,在默認情況下,局部坐標和世界坐標系的原點是重合的,不能把所有的模型都疊加在世界坐標系的原點上,因此需要移動模型。模型移動式就會發生模型的局部坐標到世界坐標的轉換,這個移動的過程就是把模型的局部坐標轉化成世界坐標。知識這個轉化的過程是在引擎編輯器內部實現的,實際上就是將模型的各個點與世界矩陣相乘得到。
X軸:左負右正;Y軸:上正下負;Z軸:里正外負。
transform.position就是獲取到當前物體的世界坐標的位置。
transform.localPosition獲取的是當前模型的局部坐標。
(2)屏幕坐標(Screen Space)
Unity開發的移動端手游經常會用到屏幕坐標系,屏幕坐標是就是通常使用的電腦屏幕,它是以像素為單位的,屏幕左下角(0,0)點,右上角為(Screen.Width,Screen.Height)點,Z的位置是根據相機的Z緩存值確定的。通常使用鼠標在屏幕上單機物體,它就是屏幕坐標。通過Input.mousePosition可以獲得鼠標位置的坐標。對虛擬搖桿的滑動可以通過Input.GetTouch(0),position獲取到手指觸碰屏幕的坐標。對UI的操作以及單機3D物體發射射線判斷是否選中物體也是基於屏幕坐標系的。
(3)相機坐標(ViewPort Space)
通過相機才能看到虛擬世界的物體。相機有自己的適口坐標,物體要轉換到視口坐標才能被看到。相機的視口左下角為(0,0)點,右上角為(1,1)點,Z的位置是以相機的世界單位來衡量的。(0,0)點和(1,1)點是通過公式進行縮放計算的。
(4)坐標轉換
獲取物體位置的通常寫法是transform.position,它表示的時立方體在3D世界中的世界坐標的位置。如果使用的是觸摸屏幕,那么可以通過函數Input.GetTouch(0).position獲取到屏幕坐標系。
世界坐標和本地坐標可以直接從position和localPosition中獲取;
世界坐標到屏幕坐標的轉化:camera.WorldToScreenPoint(transform.position);
世界坐標到視口坐標的轉化:camera.WorldToViewportPoint(obj.transform.position);
屏幕坐標到視口坐標的轉化:camera.ScreenToViewportPoint(Input.GetTouch(0).position);
視口坐標到世界坐標的轉化:camera.ViewportToWorldPoint(0.2f,0.3f,0);
視口坐標到屏幕坐標的轉化:camera.ViewportToScreenPoint(0.2f,0.3f,0);