【初心者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型の戻り値を返します。