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