Unity_屏幕/Viewport/世界座標的轉換

Unity_屏幕/Viewport/世界/UI座標的轉換

參考:

  https://www.jianshu.com/p/b5b6ac9ab145 -- 世界、視口、屏幕座標轉換
  https://docs.unity3d.com/ScriptReference/RectTransformUtility.ScreenPointToLocalPointInRectangle.html -- APIhtml

不一樣座標系:

世界座標系: World Space
  transform.position/ transform.rotation都是基於世界座標系的
  遊戲場景的原點世界座標爲(0,0,0)less

觀察座標: Eye Space
  在Game視圖中的畫面是由攝像機提供的,而基於某一個攝像機的座標系即爲觀察座標系
  即把攝像機的位置做爲原點位置ide

視口座標: View Port
  針對整個遊戲畫面,左下角爲(0,0),右上角爲(1,1)
  設計分屏功能時能夠經過設置攝像機所佔的視口空間來控制spa

屏幕座標: Screen Space
  與遊戲畫面的分辨率有關,注意是遊戲屏幕畫面的分辨率
  屏幕的左下角爲(0,0), 右上角爲(Screen.width, Screen.height)
  獲取鼠標位置(Input.mousePosition)時的座標即爲屏幕座標,返回的爲Vector3(x,y,0)設計

常見方法:

// 1.屏幕轉世界座標
Vector3 Camera.main.ScreenToWorldPoint(new Vector3(screenPos.x , screenPos.y , zInfo));
// 世界轉屏幕座標
Vector3 Camera.main.WorldToScreenPoint(new Vector3(worldPos.x , worldPos.y , worldPos.z));
// 2.世界轉視口座標
Vector3 Camera.main.WorldToViewportPoint();
// 視口轉世界座標
Vector3 Camera.main.ViewportToWorldPoint(new Vector3(viewPortPos.x , viewPortPos.y , zInfo));
// 3.視口轉屏幕座標
Vector3 Camera.main.ViewportToScreenPoint();
// 屏幕轉視口座標
Vector3 Camera.main.ScreenToViewportPoint();

屏幕座標與世界座標的轉換: 
  注意: z表示的是世界座標相對於攝像機的深度信息
    例: 世界座標(0, 0, 1),攝像機位置(0, 0, -10)  --  WorldToScreenPoint()返回結果爲(Screen.width/2, Screen.height/2, 1-(-10))3d

視口座標和世界座標的轉換也相似:
  z也表示的爲深度信息(距離)code

應用:

1. 有些遊戲會對物體的運動範圍進行限制,防止跑出邊界,好比雷電orm

思路:
  用世界座標和視口座標的轉化
  將物體的視口座標限制在(0,0,x)~(1,1,x)內/ 或用(0,0,x)(1,1,x)的視口座標算出物體的世界座標的x和y的限制(四條邊界)htm

注意:
  上述雷電遊戲因爲攝像機使用了正交投影,因此z軸數據沒有關係
  可是若是使用的是透視投影,則在不一樣深度下的邊界範圍會發生變化,所以須要輸入正確的z軸數據blog

屏幕座標轉UI座標:

 

方法: 將屏幕上的一點screenPoint,轉換爲UI RectTransform的局部空間中的座標

public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint);

參數詳解:
  RectTransform rect: The RectTransform to find a point inside
  Camera cam: The camera associated with the screen space position
    1. For a RectTransform in a Canvas set to Screen Space-Overlay mode, cam parameter should be null.
    2. When ScreenPointToLocalPointInRectangle is used from within an event handler that provides a PointerEventData,
      the correct camera can be obtained by using PointerEventData.enterEventData (for hover)
      or  PointerEventData.pressedEventCamera (for click)      it will auto use the correct camera( or null) for the given event  out Vector2 localPoint: Point in local space of the rect  return: returns true if the plane of the RectTransform in hit, regardless of whether the point is inside the rect    整個平面,而不是矩形內部

相關文章
相關標籤/搜索