Как определить направление просмотра телефонов Android при запуске приложения - PullRequest
1 голос
/ 27 марта 2019

Я работаю над приложением дополненной реальности для Android без отслеживания изображений / объектов.Пользователь стоит на заданной позиции, а виртуальные объекты помещаются в реальный мир.когда пользователь поворачивается или перемещает телефон, объекты фиксируются на своих местах.Я делаю это, применяя данные гироскопа к камере.

Моя проблема: я хочу, чтобы позиции объектов всегда были зафиксированы в одном и том же месте независимо от направления просмотра пользователями, когда он запускает приложение.Прямо сейчас, при запуске приложения, объекты располагаются в зависимости от камеры.После этого они фиксируются на своих местах, когда пользователь меняет направление просмотра.

Я нарисовал изображение того, что именно проблема, чтобы лучше проработать: user viewing direction image

Я хочу знать, какие датчики актуальны для решения этой проблемы.Поскольку Карты 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());
    }
}

1 Ответ

0 голосов
/ 27 марта 2019

Насколько я понимаю, Gyroskope возвращает разницу вращения с момента ее запуска.

Вот почему ваши объекты появляются в том направлении, к которому вы обращаетесь во время запуска.


Полагаю, вы скорее всего захотите Compass.magnHeading хотя бы для правильной установки поворота один раз при запуске игры

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

Вы можете сделать это один раз при запуске на родительском объекте всех объектов, которые вы хотите показать, чтобы правильно ориентировать их на севере GPS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...