Unityにおいて距離角度で座標指定する(極座標表示)
目的
Unityでわかりにくいx , yでなくて直感的にわかる距離角度でオブジェクトの場所を指定する.その際,オブジェクトの角度もついでに変換する.今回は,極座標を直交座標に変換する工程と度数法を弧度法に変換する工程を経て距離角度で指定する.
極座標表示
極座標表示とは,座標を距離と角度で表す方法です.Unityはx, y ,zで座標表示する直交座標表示なので物体座標を極座標表示するには距離と角度で指定された座標を直交座標に変換させなければなりません.以下図の角度をθ,距離をr,変換後の座標をx,yとしたとき
x = r*cos(θ)
y = r*sin(θ)
となります.
度数法と弧度法
難しいことを抜きにして話すと度数法は角度を10度など度で表す分度器的な表現法.弧度法は180度を1π(だいたい3.14)とする表現法.結果的に度数法表記値を180/πをすることで弧度法で表記できる.Unityでは弧度法が採用されています.
方法
C#ソースコードで距離と角度を取得したのち,直交座標に変換してアタッチされたオブジェクトの座標情報を変換する.希望する座標情報はpublicの変数で取得しUnityUIのInspectorから取得する.追加で,オブジェクトが原点座標に向くように角度情報も更新してあげる.以下今回作成したソースコードを記述する.
ソースコード
public class Kyokuzahyo : MonoBehaviour
{
public int Dis;//(0,0,0)との距離をinspectorから取得する変数
public float Deg;//(0,0,0)との角度をinspectorから取得する変数
private float X;//浮動小数点表示でX座標を指定する変数
private float Z;//浮動小数点表示でY座標を指定する変数
float rotY;
void Start()
{
//取得した距離と角度を直交座標に変換
X = Dis * Mathf.Sin(Deg * Mathf.PI / 180f);
Debug.Log("X");
Z = Dis * Mathf.Cos(Deg * Mathf.PI / 180f);
Debug.Log("Z");
this.transform.position = new Vector3(-X, 0, Z);
//オブジェクトが原点を常に向くようにrotationを変更
rotY = 180f - Deg;
Debug.Log(rotY);
this.transform.rotation = Quaternion.Euler(0, rotY, 0);
}
}
Degはfloatで取得する
Mathf.PIはπとして計算できる数学関数なのですが,こちらがfloatでないと計算できないためいちいちint変数をfloat変数に変換する手間をかけるぐらいならと最初っからfloatで取得しています.
度数法の変換は専用関数がある
Mathfには,度数法を弧度法に変換するための関数があります.(Mathf.Deg2Rad) ただ,直感的にプログラムを見て何をしているかわかるように数式を直接入力してあります.
原点以外の座標を基準に極座標変換したかったら
僕が最終的に利用しているのは,これを変換して指定オブジェクトから見たときに指定角度に物体を出現させるコードです.具体的には,指定オブジェクトのtransportを取得して計算後のX , Z座標を取得した直交座標を足してあげると原点以外からの極座標指定できます.この方法をupdateで実行すると移動するカメラ座標から指定極座標で物体出現させたりできます.