Я работаю над приложением дополненной реальности для Android без отслеживания изображений / объектов.Пользователь стоит на заданной позиции, а виртуальные объекты помещаются в реальный мир.когда пользователь поворачивается или перемещает телефон, объекты фиксируются на своих местах.Я делаю это, применяя данные гироскопа к камере.
Моя проблема: я хочу, чтобы позиции объектов всегда были зафиксированы в одном и том же месте независимо от направления просмотра пользователями, когда он запускает приложение.Прямо сейчас, при запуске приложения, объекты располагаются в зависимости от камеры.После этого они фиксируются на своих местах, когда пользователь меняет направление просмотра.
Я нарисовал изображение того, что именно проблема, чтобы лучше проработать: 
Я хочу знать, какие датчики актуальны для решения этой проблемы.Поскольку Карты Google точно определяют направление просмотра пользователя, я предполагаю, что имеются встроенные датчики, позволяющие определить, в каком направлении смотрит пользователь, чтобы применить эту информацию к повороту камеры в начале.
Этот код я использую для поворота телефонов на камеру (я использую Unity и C #):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Gyrotransform : MonoBehaviour
{
// STATE
private float _initialYAngle = 0f;
private float _appliedGyroYAngle = 0f;
private float _calibrationYAngle = 0f;
private Transform _rawGyroRotation;
private float _tempSmoothing;
// SETTINGS
[SerializeField] private float _smoothing = 0.1f;
private IEnumerator Start()
{
Input.gyro.enabled = true;
Application.targetFrameRate = 60;
_initialYAngle = transform.eulerAngles.y;
_rawGyroRotation = new GameObject("GyroRaw").transform;
// _rawGyroRotation.parent = Core.Instance.transform;
_rawGyroRotation.position = transform.position;
_rawGyroRotation.rotation = transform.rotation;
// Wait until gyro is active, then calibrate to reset starting rotation.
yield return new WaitForSeconds(1);
StartCoroutine(CalibrateYAngle());
}
private void Update()
{
ApplyGyroRotation();
ApplyCalibration();
transform.rotation = Quaternion.Slerp(transform.rotation, _rawGyroRotation.rotation, _smoothing);
}
private IEnumerator CalibrateYAngle()
{
_tempSmoothing = _smoothing;
_smoothing = 1;
_calibrationYAngle = _appliedGyroYAngle - _initialYAngle; // Offsets the y angle in case it wasn't 0 at edit time.
yield return null;
_smoothing = _tempSmoothing;
}
private void ApplyGyroRotation()
{
_rawGyroRotation.rotation = Input.gyro.attitude;
_rawGyroRotation.Rotate(0f, 0f, 180f, Space.Self); // Swap "handedness" of quaternion from gyro.
_rawGyroRotation.Rotate(90f, 180f, 0f, Space.World); // Rotate to make sense as a camera pointing out the back of your device.
_appliedGyroYAngle = _rawGyroRotation.eulerAngles.y; // Save the angle around y axis for use in calibration.
}
private void ApplyCalibration()
{
_rawGyroRotation.Rotate(0f, -_calibrationYAngle, 0f, Space.World); // Rotates y angle back however much it deviated when calibrationYAngle was saved.
}
public void SetEnabled(bool value)
{
enabled = true;
StartCoroutine(CalibrateYAngle());
}
}