Якоря ARCore находятся не там, где я ожидаю - PullRequest
0 голосов
/ 12 февраля 2020

Я решил погрузиться в ARCore через Unity и Google Pixel 2 и следовал учебному пособию, связанному здесь: https://www.youtube.com/watch?v=GkzMFNmvums

В этом примере можно найти фотографии из газет, а затем наложить видео. о том, о чем рассказывается в новостях поверх фотографий. Он делает это, превращая фотографии в увеличенные изображения, а затем назначая им привязку и размещая видеоплеер поверх точки привязки, масштабируя ее так, чтобы она соответствовала размерам фотографии.

У меня не было Газета удобная, поэтому я импровизировал и делал процессы разными. Вместо того, чтобы показывать видео поверх увеличенного изображения, он воспроизводит музыку c. В этом случае я выбрал несколько картин в нашем доме и использовал их фотографии в качестве дополненных изображений для базы данных изображений. Я установил, что процессы практически идентичны, за исключением того, что вместо видеопроигрывателя он запускает аудиопроигрыватель и воспроизводит выбранную песню.

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

Однако я сталкиваюсь с тем, что там, где я вижу картину, и где точка привязки, по-видимому, находится, очень разные. Там, где я ожидаю, что сфера находится над картиной или, по крайней мере, где-то рядом с ней, мне больше нужно оглянуться назад, чтобы найти сферу, которую я ожидал. То же самое верно для обеих картин, которые я добавил в базу данных. Теперь две сферы, которые в итоге создаются (по одной на картину), по-видимому, находятся в согласованном относительном положении друг с другом. Тем не менее, это далеко не в реальных местах живописи.

Ниже приведены два сценария, которые обрабатывают действие. Они ссылаются на базу данных дополненных изображений, состоящую из двух картин, и массива аудиофайлов, которые по индексу связываются с изображениями в базе данных.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleARCore;
using UnityEngine.Video;
using System;

public class AugmentedImageVisualizer : MonoBehaviour
{
    [SerializeField] private AudioClip[] audioClipLibrary;
    public AugmentedImage Image;
    private AudioSource audioPlayer;

    void Start()
    {
        audioPlayer = GetComponent<AudioSource>();
        audioPlayer.playOnAwake = false;
        //audioPlayer.Stop += OnStop;
    }

    private void OnStop(AudioSource source)
    {
        gameObject.SetActive(false);
    }

    void Update()
    {
        if (Image == null || Image.TrackingState != TrackingState.Tracking)
        {
            Debug.Log("Image is null. Returning...");
            return;
        }

        if (!audioPlayer.isPlaying)
        {
            Debug.Log("Image wasn't null. Playing Audio File.");
            audioPlayer.clip = audioClipLibrary[Image.DatabaseIndex];
            audioPlayer.Play();
            //PositionSphereOverImage();
        }

        //transform.localScale = new Vector3(Image.ExtentX * 2, Image.ExtentZ * 2, 1);

        //Instantiate<PrimitiveType>(PrimitiveType.Sphere, transform.position, Quaternion.identity, transform);


    }

    private void PositionSphereOverImage()
    {
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = Image.CenterPose.position;

    }
}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleARCore;
using System;

public class AugmentedAudioPlayer : MonoBehaviour
{
    [SerializeField] private AugmentedImageVisualizer augmentedImageVisualizer;

    private readonly Dictionary<int, AugmentedImageVisualizer> visualizers = new Dictionary<int, AugmentedImageVisualizer>();

    private readonly List<AugmentedImage> albumCovers = new List<AugmentedImage>();

    private void Update()
    {
        if(Session.Status != SessionStatus.Tracking)
        {
            return;
        }

        Session.GetTrackables(albumCovers, TrackableQueryFilter.Updated);
        VisualizeTrackables();
    }

    private void VisualizeTrackables()
    {
        foreach (var image in albumCovers)
        {
            var visualizer = GetVisualizer(image);

            if(image.TrackingState == TrackingState.Tracking && visualizer == null)
            {
                AddVisualizer(image);
            }
            else if (image.TrackingState == TrackingState.Stopped && visualizer != null)
            {
                RemoveVisualizer(image, visualizer);
            }
        }
    }

    private void RemoveVisualizer(AugmentedImage image, AugmentedImageVisualizer visualizer)
    {
        visualizers.Remove(image.DatabaseIndex);
        Destroy(visualizer.gameObject);
    }

    private void AddVisualizer(AugmentedImage image)
    {
        var anchor = image.CreateAnchor(image.CenterPose);
        var visualizer = Instantiate(augmentedImageVisualizer, anchor.transform);
        visualizer.Image = image;
        visualizers.Add(image.DatabaseIndex, visualizer);
        PositionSphereOverImage(anchor);
    }

    private AugmentedImageVisualizer GetVisualizer(AugmentedImage image)
    {
        AugmentedImageVisualizer visualizer;
        visualizers.TryGetValue(image.DatabaseIndex, out visualizer);
        return visualizer;
    }

    private void PositionSphereOverImage(Anchor imageAnchor)
    {
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = imageAnchor.transform.position;

    }

}

Основным «источником денег» является класс AugmentedAudioPlayer, который находит изображение, назначает привязку к местоположению этого изображения, а затем создает примитив сферы в месте привязки. Это то, что я сейчас использую, чтобы протестировать базовую c функцию создания объектов в местоположении изображения и откуда у меня болит голова о том, как я получаю местоположение.

Надеюсь, некоторые люди больше знаний ARCore может помочь мне понять, что я здесь напортачу. Спасибо за помощь.

...