ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - ワールド座標、ローカル座標、スクリーン座標、ビューポート座標

初めに

 Unity でのオブジェクトの位置の表し方には、ワールド座標、ローカル座標、スクリーン座標、ビューポート座標の4つの表し方があります。本記事では、4つの座標とその変換の仕方を説明していきます。



ワールド座標・ローカル座標

ワールド座標とは

 ワールド座標とは、

原点(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);

最後に

  • ワールド座標は原点を基準として3次元空間での座標系
  • ローカル座標は親オブジェクトを基準とし、親オブジェクトの位置を原点とする座標系
  • スクリーン座標は左下を (0, 0)、右上を (pixelWidth, pixelHeight) とする座標系
  • ビューポート座標はスクリーン座標の縦軸と横軸を正規化した座標系
  • スクリプトから変換できる