Как получить фактическое направление, как восток - запад в единстве? - PullRequest
0 голосов
/ 06 января 2020

Я использую API Google, чтобы показать карту в единстве, а также генерировать объект на карте на месте игрока. Теперь я хочу знать актуальное направление. Это означает определение направления (восток-запад) по картам Google или API Google.

Я создал код, но он не указывает фактическое направление.

 var v = transform.forward;
 v.y = 0;
 v.Normalize();

 if (Vector3.Angle(v, Vector3.forward) <= 45.0) {
     Debug.Log("North");
 }
 else if (Vector3.Angle(v, Vector3.right) <= 45.0) {
     Debug.Log("East");
 }
 else if (Vector3.Angle(v, Vector3.back) <= 45.0) {
     Debug.Log("South");
 }
 else {
     Debug.Log("West");
 }

1 Ответ

0 голосов
/ 07 января 2020

с использованием Vector3.forward

Сокращение для записи new Vector3(0, 0, 1).

возвращает вам прямое направление оси Z самого Unity. Это полностью зависит от ориентации вашего устройства, когда вы запустили Unity / ваше приложение, и не имеет никакого отношения к координатам реального мира.


Скорее всего, вы ищете Compass, который возвращает фактическую ориентацию вашего телефона, например, используя magneticHeading

Курс в градусах относительно magneti c Северный полюс.

Значение в этом свойстве всегда измеряется относительно верхней части экрана в его текущей ориентации. Курс намагнитного c севера не совсем совпадает с истинным географическим севером - для получения точного курса используйте свойство trueHeading.

public class Example : MonoBehaviour
{
    void Update()
    {
        // Orient an object to point to magnetic north.
        transform.rotation = Quaternion.Euler(0, -Input.compass.magneticHeading, 0);
    }
}

или используя trueHeading

Курс в градусах относительно geographi c Северный полюс.

Значение в этом свойство всегда измеряется относительно верхней части экрана в его текущей ориентации. Обратите внимание, что если вы хотите, чтобы это свойство содержало допустимое значение, вы также должны включить обновление местоположения, позвонив по номеру Input.location.Start().

using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        Input.location.Start();
    }

    void Update()
    {
        // Orient an object to point northward.
        transform.rotation = Quaternion.Euler(0, -Input.compass.trueHeading, 0);
    }
}

Так что для вашего варианта использования вы просто используете Например,

using UnityEngine;

public enum Heading
{
    North,
    East,
    South,
    West
}

public class Example : MonoBehaviour
{
    [Header("Debug")]
    [SerializeField] [Range(0f, 360f)] private float northHeading;

    [Header("OutputValues")]
    [SerializeField] private float myHeading;
    [SerializeField] private float dif;
    [SerializeField] private Heading heading;

    // Update is called once per frame
    private void Update()
    {
        // only use the Y component of the objects orientation
        // always returns a value between 0 and 360
        myHeading = transform.eulerAngles.y;
        // also this is always a value between 0 and 360
        northHeading = Input.compass.magneticHeading;

        dif = myHeading - northHeading;
        // wrap the value so it is always between 0 and 360
        if (dif < 0) dif += 360f;

        if (dif > 45 && dif <= 135)
        {
            heading = Heading.East;
        }
        else if (dif > 135 && dif <= 225)
        {
            heading = Heading.South;
        }
        else if (dif > 225 && dif <= 315)
        {
            heading = Heading.West;
        }
        else
        {
            heading = Heading.North;
        }
    }

    // Only for debug and demo
    // draw a pointer towards north
    private void OnDrawGizmos()
    {
        var northDirection = (Quaternion.Euler(0, northHeading, 0) * Vector3.forward).normalized;

        Gizmos.color = Color.red;
        Gizmos.DrawLine(transform.position, transform.position + northDirection);

        var objectDirection = (Quaternion.Euler(0, transform.eulerAngles.y, 0) * Vector3.forward).normalized;
        Gizmos.color = Color.blue;
        Gizmos.DrawLine(transform.position, transform.position + objectDirection);
    }
}

В небольшом демонстрационном примере вы видите синий указатель для направления объекта вперед и красный вектор для направления на север. Вы можете видеть, как значение перечисления Heading изменяется в зависимости от ориентации объектов.

Поскольку я сделал это на P C, мне пришлось вручную «настраивать» направление на север, позже вы будете получите это с вашего телефона.

enter image description here

...