以前都是做2D遊戲,基本不關注數學方面的知識。現在學習unity了,很多概念都不懂。學生時代的東西,早還給老師了。當然我學習不好 = =!所以現在來補補。畢竟現在要做3D了。基礎的東西還是得懂。
下面是我看書的一些重點、我將其記錄下來。以後也方便自己溫習!
笛卡爾座標系 的定義 :
1、每個2D笛卡爾座標系都有一個特殊的點,稱爲原點(0,0)它是座標系的中心。
2、每個2D笛卡爾座標系都有兩條過原點的直線向兩邊無限延伸,稱爲軸,兩個軸互相垂直。
笛卡爾座標系定位
座標系是一個精確定位點的框架。爲了在笛卡爾座標系中定位點,引入了笛卡爾座標的概念。在2D平面中,兩個數(x,y)就可以定義一個點。座標的每個分量都表明了該點與原點之間的距離和方位,每個分量都是到相應軸的有符號距離。如下圖所示,x分量表示該點到y軸的有符號距離,同樣y分量表示該點到x軸的有符號距離。“有符號距離”指在某個方向上距離爲正,而在相反方向爲負。
3D座標系:
3D座標系表示三維空間系,3D座標系存在三個軸,比2D座標系多了一個Z軸,3個軸相互垂直,也就是沒個軸都有垂直於其他兩個軸。在3D座標系中點位需要3個數:x、y、z.
左手座標系、右手座標系:
3d座標系存在兩種完全不同的座標系,左手座標系和右手座標系。如果屬於相同的座標系,可以通過旋轉來重合,否則是不可以重合的。兩個座標系之間沒有好壞,之是應用與不懂的場景。 計算機中使用左手座標系,線性代數中使用右手座標系。
多座標系:
爲什麼使用多座標系?因爲在不同的情況下使用不同的座標系更加的方便。某些信息只有在特定的上下文環境中獲得。
一些有用的座標系:
1、世界座標系:是一個特殊的座標系,它建立了描述其他座標系所需要的參考框架,另一方面說,能用時間座標系描述其他座標系的位置,而不能用更大的座標系來描述世界座標系。
2、物體座標系:特定物體相關聯的座標系。當物體位移或改變方向時,和該物體相關的座標系也隨之移動和改變方向。比如告訴你“向前走一步”,則是向你的物體座標系發指令。“前”、“後”、“左”、“右”這樣的概念只有物體座標系纔有意義。“向左轉”是物體座標系,“向東”則是世界座標系。有時物體座標系也稱作模型座標系,模型頂點的座標都是在模型座標系中描述的。
3、攝像機座標系:觀察者密切相關的座標系。攝像機座標系被看作是一種特殊的物體座標系,該物體座標系定義攝像機的屏幕可視區域。在攝像機座標系中,攝像機在原點,x軸向右,z軸向前,y軸向上。一個攝像機座標系如下圖所示。關於攝像機座標系的軸向約定可能不同。許多圖形學書中習慣用右手座標系,z軸向外,即從屏幕指向讀者。2D屏幕上顯示的內容就是3D攝像機座標系通過投影轉換呈現的。
4、慣性座標系:爲了簡化世界座標系到物體座標系之間的轉換,纔有了慣性座標系。慣性座標系的原點和物體座標系的原點重合,但慣性座標系的軸平行於世界座標系軸。所以從物體座標系轉換爲慣性座標系只需要旋轉,從慣性座標系到世界座標系只需要平移。
5、嵌套座標系:3D虛擬世界中每個物體都有自己的座標系———-自己的原點和座標軸。每個模型都有自己的原點和座標軸,模型的子物體就是在這個嵌套座標系中。
物體座標系到世界座標系的轉換:
1、旋轉物體座標系到慣性座標系。將物體座標軸旋轉到與慣性座標系重合。
2、將慣性座標系原點平移至世界座標系。
關於Unity的一些座標系的知識:
Unity是左手座標系
世界座標系:我們在場景中添加物體(如:Cube),他們都是以世界座標顯示在場景中的。transform.position可以獲得該位置座標。
屏幕座標系:以像素來定義的,以屏幕的左下角爲(0,0)點,右上角爲(Screen.width,Screen.height),Z的位置是以相機的世界單位來衡量的。注:鼠標位置座標屬於屏幕座標,Input.mousePosition可以獲得該位置座標,手指觸摸屏幕也爲屏幕座標,Input.GetTouch(0).position可以獲得單個手指觸摸屏幕座標。
繪製GUI界面的座標系:這個座標系與屏幕座標系相似,不同的是該座標系以屏幕的左上角爲(0,0)點,右下角爲(Screen.width,Screen.height)。
視口座標系:視口座標是標準的 相對於相機的。相機的左下角爲(0,0)點,右上角爲(1,1)點,Z的位置是以相機的世界單位來衡量的。
世界座標→屏幕座標:camera.WorldToScreenPoint(transform.position);這樣可以將世界座標轉換爲屏幕座標。其中camera爲場景中的camera對象。
屏幕座標→視口座標:camera.ScreenToViewportPoint(Input.GetTouch(0).position);這樣可以將屏幕座標轉換爲視口座標。其中camera爲場景中的camera對象。
視口座標→屏幕座標:camera.ViewportToScreenPoint();
視口座標→世界座標:camera.ViewportToWorldPoint();