【Unity連載】ワールド空間とローカル空間


1.ワールド空間とは


原点(0,0,0)を基準とした座標系のことです。
ワールド座標と呼ぶこともあります。

2.ローカル空間とは


親オブジェクトを基準とした座標系のことです。
ローカル座標と呼ぶこともあります。

(関連記事)
【Unity連載】オブジェクトの親子関係

親オブジェクトを持たないオブジェクトの場合、ローカル空間=ワールド空間となります。
原点に目に見えないオブジェクトがあり、それが親子関係のルートオブジェクトになっていると考えれば、すっきりするでしょうか。

実は、インスペクタービューに表示されている座標はこちらのローカル空間になります。
ワールド空間が表示されていると勘違いされることが多いので、気をつけて下さい。


ただし、親オブジェクトを持たないオブジェクトの場合、上述の通りローカル空間=ワールド空間となるため、インスペクタービューに表示される座標はワールド空間となります。
ややこしいですね。これが勘違いの元かも知れません。

3.スクリプトでの取得方法


ワールド空間とローカル空間、それぞれのプロパティが用意されています。

// ワールド空間での位置
transform.position
// ワールド空間での回転角(向き)
transform.eulerAngles
// ワールド空間での大きさ
transform.lossyScale
// ローカル空間での位置
transform.localPosition
// ローカル空間での回転角(向き)
transform.localEulerAngles
// ローカル空間での大きさ
transform.localScale

単にtransform.positionと書いた場合、ワールド空間の値が取得されてしまうことに注意してください。
また、回転角についてはeulerAngles(オイラー角)を取得しておりますが、これとは別にrotation(localRotation)というプロパティもあります。
インスペクタービューに表示されている値と同じVector3型で角度を扱いたい場合はeulerAnglesが適していますが、Unity内部の処理ではrotationが使用されています。
この2つは相互に変換が可能となっています。

4.空間の変換


ローカル空間をワールド空間に変換するときは、Transform.TransformPoint()を使用します。

Vector3 worldCoordinate = transform.TransformPoint(localCoordinate);

ワールド空間をローカル空間に変換するときは、Transform.InverseTransformPoint()を使用します。

Vector3 localCoordinate = transform.InverseTransformPoint(worldCoordinate);

どちらのメソッドも引数にVector3型の値を取り、Vector3型の戻り値を返します。

  • このエントリーをはてなブックマークに追加

PAGE TOP