C# 启动应用程序时如何确定android手机的查看方向

C# 启动应用程序时如何确定android手机的查看方向,c#,android,unity3d,C#,Android,Unity3d,我正在为Android开发一款增强现实应用程序,不需要跟踪图像/对象。用户站在预定义的位置,虚拟对象被放置到现实世界中。当用户转过身或移动手机时,对象固定在各自的位置。我通过将陀螺仪数据应用到相机来实现这一点 我的问题是:我希望在用户启动应用程序时,无论用户的观看方向如何,对象的位置始终固定在相同的位置。现在,启动应用程序时,对象的位置取决于相机。之后,当用户更改其查看方向时,它们将固定到各自的位置 我画了一幅图像,以更好地阐述确切的问题: 我想知道哪些传感器与解决此问题相关。由于谷歌地图准确

我正在为Android开发一款增强现实应用程序,不需要跟踪图像/对象。用户站在预定义的位置,虚拟对象被放置到现实世界中。当用户转过身或移动手机时,对象固定在各自的位置。我通过将陀螺仪数据应用到相机来实现这一点

我的问题是:我希望在用户启动应用程序时,无论用户的观看方向如何,对象的位置始终固定在相同的位置。现在,启动应用程序时,对象的位置取决于相机。之后,当用户更改其查看方向时,它们将固定到各自的位置

我画了一幅图像,以更好地阐述确切的问题:

我想知道哪些传感器与解决此问题相关。由于谷歌地图准确地确定了用户的观看方向,我假设有内置的传感器来确定用户观看的方向,以便在开始时将此信息应用于相机的旋转

这是我用来将手机旋转应用于相机的代码(我使用的是Unity和C#):

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类:单一行为
{
//陈述
私人浮动_initialYAngle=0f;
专用浮点数_appliedGyroYAngle=0f;
专用浮子_校准Yangle=0f;
私有变换;
私人浮动(u);;
//背景
[SerializeField]专用浮点_平滑=0.1f;
私有IEnumerator Start()
{
Input.gyro.enabled=真;
Application.targetFrameRate=60;
_initialYAngle=transform.eulerAngles.y;
_rawGyroRotation=新游戏对象(“GyroRaw”)。变换;
//_rawgyrotation.parent=Core.Instance.transform;
_rawgyrotation.position=transform.position;
_rawgyrotation.rotation=transform.rotation;
//等待陀螺仪激活,然后校准以重置开始旋转。
返回新的WaitForSeconds(1);
开始例行程序(校准角度());
}
私有void更新()
{
applygyrotation();
应用校准();
transform.rotation=Quaternion.Slerp(transform.rotation,\u rawgyrotation.rotation,\u平滑);
}
专用IEnumerator校准角度()
{
_tempSmoothing=_平滑;
_平滑度=1;
_calibrationYAngle=\u appliedGyroYAngle-\u initialYAngle;//如果y角度在编辑时不是0,则偏移y角度。
收益返回空;
_平滑=_tempsoothing;
}
私有void applygyrotation()
{
_Rawgyrotation.rotation=输入陀螺姿态;
_rawgyrotation.Rotate(0f,0f,180f,Space.Self);//从陀螺中交换四元数的“利手”。
_rawgyrotation.Rotate(90f,180f,0f,Space.World);//旋转使其成为指向设备背面的摄像头。
_appliedGyroYAngle=_rawGyroRotation.eulerAngles.y;//保存围绕y轴的角度以用于校准。
}
私有无效应用程序校准()
{
_rawgyrotation.Rotate(0f,-_calibrationYAngle,0f,Space.World);//将y角度向后旋转,无论保存calibrationYAngle时y角度偏离了多少。
}
公共无效设置已启用(布尔值)
{
启用=真;
开始例行程序(校准角度());
}

}
据我所知,
Gyroskope
返回启动后的旋转差

这就是为什么在启动过程中,对象显示在您面对的方向上


我猜你想要的可能是至少在游戏开始时设置一次正确的旋转

 // Orient an object to point to magnetic north.
transform.rotation = Quaternion.Euler(0, -Input.compass.magneticHeading, 0);

您可以在开始时在要显示的所有对象的父对象上执行此操作一次,以便在GPS北面上正确定位它们

据我所知,
Gyroskope
返回启动后的旋转差

这就是为什么在启动过程中,对象显示在您面对的方向上


我猜你想要的可能是至少在游戏开始时设置一次正确的旋转

 // Orient an object to point to magnetic north.
transform.rotation = Quaternion.Euler(0, -Input.compass.magneticHeading, 0);
您可以在开始时在要显示的所有对象的父对象上执行此操作一次,以便在GPS北面上正确定位它们