2

我目前正在尝试使用 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);,但这给出了与第一个相同的始终变化的结果。任何帮助,将不胜感激。
4

1 回答 1

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;
    }

}

于 2020-12-31T22:20:44.717 回答