Unity 座標系轉換

2022-03-11 03:53:00 字數 2916 閱讀 2959

在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軸移動)。乙個簡單的思路如下:

public

float

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獲取到了四個邊界。之後通過限制位置的xy軸向移動就可以控制避免移動過度。

說明一下,這裡假設了雷電型別的遊戲,使用的攝像機為正交型別的投影方式,了解正交投影的朋友就知道,視錐體變成了長方體形,因子這裡的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 ...