ARSessionOrigin преобразует положение и вращение, чтобы сделать созданный ARTrackedImage равным нулю в Unity - PullRequest
2 голосов
/ 25 октября 2019

Я использую ARFoundation для отслеживания изображений (в библиотеке изображений есть только одно изображение для поиска). Когда изображение найдено, я подписываюсь на это событие с

[SerializeField]
ARTrackedImageManager _arTrackedImageManager;

void Awake()
{
    _arTrackedImageManager.trackedImagesChanged += ImageChangedHandle;
}

void ImageChangedHandle(ARTrackedImagesChangedEventArgs imgChangedArgs)
{
    foreach (var item in imgChangedArgs.added)
    {
        var go = item.gameObject;

        _arkitChecker.DisplayFoundTrackedImage(item);
    }
}

_arkitChecker является экземпляром моего класса с методом DisplayFoundTrackedImage:

internal void DisplayFoundTrackedImage(ARTrackedImage targetImageGameObject)
{
    var arOrig = GameObject.FindObjectOfType<ARSessionOrigin>();

    arOrig.transform.Translate(-targetImageGameObject.transform.position, Space.World);

    float babyAngle;
    Vector3 babyAxis;
    targetImageGameObject.transform.rotation.ToAngleAxis(out babyAngle, out babyAxis);

    arOrig.transform.RotateAround(Vector3.zero, babyAxis, -babyAngle);
}

В результате я хочу сделать преобразование, когдасозданный ARTrackedImage становится пространством Unity Vector3.zero с Quaternion.identity, но изображение устройства не меняется*

1 Ответ

0 голосов
/ 15 ноября 2019

Мне просто нужно было решить эту проблему, я смог заставить его работать методом ARSessionOrigin MakeContentAppearAt(), используя положение и поворот отслеживаемого изображения (я использую ARFoundation v3.0.0 preview 4).

Этот метод не очень хорошо документирован, после некоторых проб и ошибок я обнаружил, что вам нужно использовать localRotation отслеживаемого изображения, а не мировое пространство rotation, иначе ориентация будет неправильной.

Всякий раз, когда отслеживаемое изображение найдено или обновлено, я запускаю следующее:

void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
{
    if(eventArgs.updated.Count > 0)
    {
        ARTrackedImage trackedImage = eventArgs.updated[0];
        arSessionOrigin.MakeContentAppearAt(worldOrigin.transform, trackedImage.transform.position, trackedImage.transform.localRotation);
    }
}

worldOrigin.transform - это просто пустой игровой объект в позиции 0,0,0 без вращения.

Итак, этот код говорит: я хочу, чтобы преобразование worldOrigin в выглядело так, как если бы находилось в позиции / повороте отслеживаемого изображения, регулируя преобразование камеры AR для компенсации (worldOrigin.transform немодифицированный).

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