我目前正在尝试使用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);
,但这会带来与第一个相同的总是变化的结果。任何帮助将不胜感激。答案 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;
}
}