在unity中我們通常會用到以下幾個座標系下的點:
這裡需要說明的是,我們在獲取滑鼠位置的時候,input.mouseposition
來獲取滑鼠的位置,這裡獲取到的滑鼠位置是基於螢幕座標的。通過該函式返回的是vector3
型別的變數,但z
分量始終為0。
//1.螢幕轉世界座標
vector3 camera.main.screentoworldpoint(new
vector3(screenpos.x , screenpos.y , zinfo));
//2.世界轉螢幕座標
vector3 camera.main.worldtoscreenpoint(new
vector3(worldpos.x , worldpos.y , worldpos.z));
//3.世界轉視口座標
vector3 camera.main.worldtoviewportpoint();
//4.視口轉世界座標
vector3 camera.main.viewporttoworldpoint(new
vector3(viewportpos.x , viewportpos.y , zinfo));
//5.視口轉螢幕座標
vector3 camera.main.viewporttoscreenpoint();
//6.螢幕轉視口座標
vector3 camera.main.screentoviewportpoint();
當然,我們在使用這些api的時候,只需要清楚我們的輸入和輸出的內容及其關係就好了。
接下來,我們來聊一聊這些函式:
首先是螢幕座標和世界座標的相互轉換:
worldtoscreenpoint函式接收乙個世界空間下的位置資訊,然後返回其所在的螢幕空間位置,以及其相對於攝像機的深度資訊,該深度資訊由世界空間下攝像機和輸入位置的z值來決定。乙個例子是:攝像機的位置為(
0.0, 0.0 , -10.0),輸入的位置為(0.0,0.0,1.0)。則返回的結果為(screen.width/2 , screen.height/2 , 1-(-10
)); 注意攝像機指向-z方向!
screentoworldpoint則是與之相反,輸入螢幕空間位置以及相應的深度資訊(注意深度資訊應該為目標z值金和相機z值的差值),可以返回其所在的世界座標位置。
視口座標和世界座標與之相似:
worldtoviewportpoint:輸入世界座標,返回的是對應的點所在的視口位置,當然以及其相對於攝像機的深度資訊(距離)viewporttoworldpoint:輸入視口座標(記得對應的深度資訊),返回點所在的世界座標
視口座標和螢幕座標非常簡單,正如上面的說明,只要知道解析度就可以輕鬆轉換,這裡不再贅述。
乙個簡單的應用
我們在設計某些遊戲的時候(比如攝像機固定不動的型別),會對物體的運動範圍進行限制,以防止其跑出邊界。比如一盒橫屏的飛行射擊遊戲(雷電),我們可以獲得物體的位置資訊:transform.position
,我們希望對物體的x
,y
兩個軸向的移動進行限制(同時凍結物體的z軸移動)。乙個簡單的思路如下:
publicfloat
leftborder;
public
float
rightborder;
public
float
topborder;
public
float
bottomborder;
....
vector3 leftbtm_cornerpos = camera.main.viewporttoworldpoint(new
vector3(0f, 0f,
mathf.abs(-camera.main.transform.position.z))); //
這裡的z軸在正交檢視下意義不大
vector3 righttop_cornerpos = camera.main.viewporttoworldpoint(new
vector3(1f, 1f,
mathf.abs(-camera.main.transform.position.z)));
....
leftborder =leftbtm_cornerpos.x;
rightborder =righttop_cornerpos.x;
topborder =righttop_cornerpos.y;
bottomborder =leftbtm_cornerpos.y;
....
if (pos.x <=leftborder)
else
if (pos.x >=rightborde
if (pos.y <=bottomborder)
else
if (pos.y >=topborder)
上面的**通過viewporttoworldpoint
獲取到了四個邊界。之後通過限制位置的x
、y
軸向移動就可以控制避免移動過度。
說明一下,這裡假設了雷電型別的遊戲,使用的攝像機為正交型別的投影方式,了解正交投影的朋友就知道,視錐體變成了長方體形,因子這裡的z
軸並無太大的作用。即使我使用viewporttoworldpoint
的時候使用0
作為z
軸資料,也一樣沒關係。但是對於透視投影就不太一樣了。若這裡使用的透視投影,在不同的深度下,其的邊界範圍肯定也會變化,這個時候就必須輸入正確的z
軸資料了。
unity 座標系轉換 unity座標系間的轉換
1.世界座標系 遊戲內物件都在乙個世界座標系內,可以放心的使用世界座標進行transform的運算。2.區域性座標系 基於父物體的座標系,適合基於父物體做的transform運算,運算時要確保兩個物件在乙個本地座標系內。recttransform的width和height是本地座標系,需要求寬高的世...
unity常用的座標系轉換
當呼叫別人的介面時,經常會有獲取位置或向量的介面。遇到這些資料時,先要弄清楚現在獲取的資料在哪個座標系下的。是否需要進行座標系變換,一般提供的位置和向量都是在世界座標系的,此時需要注意 對方的座標系是左手座標系還是右手座標系 因為unity是左手座標系,如果介面提供的資料是基於右手座標系的話,我們需...
Unity 座標系轉換的方法
世界座標 螢幕座標 camera.worldtoscreenpoint transform.position 這樣可以將世界座標轉換為螢幕座標。其中camera為場景中的camera物件。螢幕座標 視口座標 camera.screentoviewportpoint input.gettouch 0 ...