Android, iOS 端末では、端末についているコンパスを使うことができます。
ただ、マニュアルを見てると値がいろいろあって、ナンノコッチャ結局どれ使えばいいの、って状態になったので、少し調べてみました。
http://docs.unity3d.com/ja/current/ScriptReference/Compass.html
magneticHeadingとtrueHeading
マニュアルでは
- magneticHeading
- 磁北極に基づく度単位の進行方向
- trueHeading
- 地理的北極に基づく度単位の進行方向
と説明されています。
これはそれぞれ
magneticHeadingが地球の磁場が指している北、 trueHeadingが実際に北極のほうを指している真北
を指しているようです。
なぜ値が二つあるのか
国土地理院のサイトによると、
方位磁針のN極は概ね北を指しますが,厳密には北を指していません. つまり,地図上の北(真北)と方位磁針の北(磁北)は微妙にずれています. この真北と磁北のなす角度を偏角といいます.偏角は時間と場所によって異なります.
と、あります。
私が真北だと信じていた方位磁石は、実はちょっとずれていたのです。トホホ
trueHeading は偏角を補正した値だと思われます。
trueHeading の値を取得するには、Input.location.Start() を呼び出さなければなりません。
ロケーション情報を有効にすることで、偏角を補正していると推測できます。
ということで、Unityで方位磁石を作りたい時は、 trueHeadingの値を使用すれば真北を指せます。
実際の方位磁石をエミュレートしたい場合は magneticHeading を使うのもいいでしょう。
public class CompassSensor : MonoBehaviour { [SerializeField] Transform device; void Start () { Input.compass.enabled = true; Input.location.Start (); Debug.Log (string.Format("<b>精度</b>:{0}", Input.compass.headingAccuracy)); Debug.Log (string.Format("<b>タイムスタンプ</b>:{0}", Input.compass.timestamp)); } void Update () { Debug.Log ( string.Format ("magneticHeading : {0}, rawVector : {1}, trueHeading : {2}", Input.compass.magneticHeading, Input.compass.rawVector, Input.compass.trueHeading ) ); // Transformの向きを真北にする device.rotation = Quaternion.Euler(new Vector3 (0, Input.compass.magneticHeading, 0)); } }
rawVector
この値は地球の地磁気のベクトルの生データです。
ぶっちゃけ、この値単体で使うことはないので、無視してもいいでしょう。
ただし、姿勢制御などで使ったりするようです。
ちなみにUnity Remoteではコンパスの値を取得できないみたいです。アプリを書き込めばできました。
端末によってはできるかも。
・参考
http://docs.unity3d.com/ja/current/ScriptReference/Input-compass.html
http://docs.unity3d.com/ja/current/ScriptReference/Compass.html
http://vldb.gsi.go.jp/sokuchi/geomag/menu_01/