Unity - ワールド座標、ローカル座標、スクリーン座標、ビューポート座標
初めに
Unity でのオブジェクトの位置の表し方には、ワールド座標、ローカル座標、スクリーン座標、ビューポート座標の4つの表し方があります。本記事では、4つの座標とその変換の仕方を説明していきます。
Index
ワールド座標・ローカル座標
ワールド座標とは
ワールド座標とは、
原点(0, 0, 0) を基準とした3次元空間での座標系
です。親オブジェクトのないオブジェクトの Transform.position(位置)はワールド座標で表されています。
軸の向きは Scene ビューで確認することができます。
スクリプトからワールド座標を操作する
ワールド座標をスクリプトから操作する場合は transform.position を使います。
(例)
//ワールド座標の取得 Vector3 vec = this.transform.position; //ワールド座標の変更 this.transform.position = new Vector3(1, 2, 3);
ローカル座標とは
ローカル座標とは、
親オブジェクトを基準とする座標系
です。
原点は親オブジェクトの位置になります。そのため、子オブジェクトの Transform.position は親オブジェクトの位置を (0, 0, 0) としています。また、親オブジェクトが回転していたら、子オブジェクトの Transform.Rotate が (0, 0, 0) の場合でもワールド座標で見ると親オブジェクトと同じだけ回転しています。
スクリプトからローカル座標を操作する
スクリプトからローカル座標を操作するには、transform.localPosition を使います。
(例)
//ローカル座標の取得 Vector3 vec = this.transform.localPosition; //ローカル座標の変更 this.transform.localPosition = new Vector3(1, 2, 3);
ワールド座標とローカル座標を変換する
ローカル座標からワールド座標へ、ワールド座標からローカル座標への変換はそれぞれ Transform.TransformPoint、Transform.InverseTransformPoint を用います。
//ローカル座標からワールド座標への変換 public Vector3 TransformPoint (Vector3 position); //ワールド座標からローカル座標への変換 public Vector3 InverseTransformPoint (Vector3 position);
スクリーン座標・ビューポート座標
スクリーン座標とは
スクリーン座標とは、
カメラが表示している範囲を表す座標
です。画面は平面なので、2次元になります。
左下を (0, 0) とし、右上を (pixelWidth, pixelHeight) としています。解像度が (640, 480) の場合、pixelWidth = 640、pixelHeight = 480 となります。
ビューポート座標とは
ビューポート座標とは、
スクリーン座標の値を 0 ~ 1 に正規化したもの
です。左下を原点とし、横幅、縦幅をそれぞれ 1 として考えた場合の座標となります。
スクリーン座標とビューポート座標を変換する
スクリーン座標とビューポート座標を変換するには、Camera.ScreenToViewportPoint、Camera.ViewportToScreenPoint を使います。
//スクリーン座標からビューポート座標への変換 public Vector3 ScreenToViewportPoint (Vector3 position); //ビューポート座標からスクリーン座標への変換 public Vector3 ViewportToScreenPoint (Vector3 position);
(例)
//現在のマウスの位置をスクリーン座標で取得し、ビューポート座標に変換 transform.position = Camera.main.ScreenToViewportPoint(Input.mousePosition); //ビューポート座標をスクリーン座標に変換 var origin = Camera.main.ViewportToScreenPoint(new Vector3(0.25f, 0.1f, 0));
ワールド座標とスクリーン座標・ビューポート座標を変換する
ワールド座標とスクリーン座標・ビューポート座標の変換には Camera.WorldToScreenPoint、Camera.WorldToViewportPoint、Camera.ScreenToWorldPoint、Camera.ViewportToWorldPoint を使います。
//ワールド座標からスクリーン座標への変換 public Vector3 WorldToScreenPoint (Vector3 position); //ワールド座標からビューポート座標への変換 public Vector3 WorldToViewportPoint (Vector3 position); //スクリーン座標からワールド座標への変換 public Vector3 ScreenToWorldPoint (Vector3 position); //ビューポート座標からワールド座標への変換 public Vector3 ViewportToWorldPoint (Vector3 position);
参考
docs.unity3d.com
docs.unity3d.com
docs.unity3d.com
docs.unity3d.com
docs.unity3d.com
docs.unity3d.com
docs.unity3d.com
最後に
- ワールド座標は原点を基準として3次元空間での座標系
- ローカル座標は親オブジェクトを基準とし、親オブジェクトの位置を原点とする座標系
- スクリーン座標は左下を (0, 0)、右上を (pixelWidth, pixelHeight) とする座標系
- ビューポート座標はスクリーン座標の縦軸と横軸を正規化した座標系
- スクリプトから変換できる