获取Unity指南针真正的北方向

时间:2018-06-21 08:29:50

标签: unity3d augmented-reality compass arcore android-augmented-reality

我目前正在尝试使用Unity C#和ARCore为Android实现基于位置的AR应用。我设法实现了一种算法,该算法可以获取经度/纬度并将其转换为单位米。但是,这还不足以将对象放置在GPS位置,因为如果不将统一场景与现实世界的方向对齐,则世界的方向将关闭。

无论如何,指南针的问题在于我无法找到一种方法来将对象与真正的北方对齐。 我试图通过使用对齐对象与真正的北方 transform.rotation = Quaternion.Euler(0, -Input.compass.trueHeading, 0);

但是,这会导致对象根据我手机的前进方向不断改变旋转角度,因此始终会改变真正的北方方向。 我目前正在尝试的是:

var xrot = Mathf.Atan2(Input.acceleration.z, Input.acceleration.y);
var yzmag = Mathf.Sqrt(Mathf.Pow(Input.acceleration.y, 2) + Mathf.Pow(Input.acceleration.z, 2));
var zrot = Mathf.Atan2(Input.acceleration.x, yzmag);

xangle = xrot * (180 / Mathf.PI) + 90;
zangle = -zrot * (180 / Mathf.PI);
TheAllParent.transform.eulerAngles = new Vector3(xangle, 0, zangle - Input.compass.trueHeading);

这似乎效果更好,因为由于指南针读数不稳定,物体将指向单个方向,并且物体的晃动/抖动最小,但是仍然指向一个方向。但是,这样做的问题是,每次应用启动时,它指向一个不同的方向,因此根据代码,真正的北方永远不会在一个地方。但是,指南针读数很好,因为我已经与其他实施指南针的GPS应用程序对照了读数。

  • 我也尝试过transform.rotation = Quaternion.Euler(0, -Input.compass.magneticHeading, 0);,但这会带来与第一个相同的总是变化的结果。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

它是如何在我的项目中解决这个问题的 希望对你有帮助。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class newway : MonoBehaviour
{
  
    GameObject cam;
    void Start()
    {
        
        cam = Camera.main.gameObject;
        Input.location.Start();
        Input.compass.enabled = true;
    }

    void Update()
    {
        
        Quaternion cameraRotation = Quaternion.Euler(0, cam.transform.rotation.eulerAngles.y, 0);
        Quaternion compass = Quaternion.Euler(0, -Input.compass.magneticHeading, 0);

        Quaternion north = Quaternion.Euler(0, cameraRotation.eulerAngles.y + compass.eulerAngles.y, 0);
        transform.rotation = north;
    }

}