ARCore Unity - отслеживаемый объект (видео) неправильно масштабируется до целевого изображения - PullRequest
0 голосов
/ 31 октября 2018

Итак, я ломал голову над тем, как связать контент, будь то 3D, 2D или просто звук, для запуска при обнаружении изображения с помощью ARCore, как хотелось бы добавить некоторые пространственные параметры в линию. При обнаружении разных изображений воспроизводится разное видео, однако они не соответствуют пропорциям обнаруживаемого изображения: оно слишком маленькое или вытянуто за пределы.

Что-то не так с этим кодом ...

Создано два файла C #, один из которых называется: AugmentedImageController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleARCore;
using System;
using UnityEngine.UI;
using System.Runtime.InteropServices;

public class AugmentedImageController : MonoBehaviour {
   [SerializeField] private AugmentedimageVisualizer _augmentedimageVisualizer;

private readonly Dictionary<int, AugmentedimageVisualizer> _visualizers = new Dictionary<int, AugmentedimageVisualizer>();

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

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

    Session.GetTrackables(_images, TrackableQueryFilter.Updated);
    VisualizeTrackables();
}
private void VisualizeTrackables()
{
    foreach (var image in _images)
    {
        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);
}

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

Второе дополненное изображение Визуализатор

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
using GoogleARCore;
using GoogleARCoreInternal;
using System.Runtime.InteropServices;


public class AugmentedimageVisualizer : MonoBehaviour {
[SerializeField] private VideoClip[] _videoClips;
  public AugmentedImage Image;
  private VideoPlayer _videoPlayer;

 void Start()
{
    _videoPlayer = GetComponent<VideoPlayer>();
    _videoPlayer.loopPointReached += OnStop;
}

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

void Update()
{
    if (Image == null || Image.TrackingState != TrackingState.Tracking)
    {
        return;
    }

    if (!_videoPlayer.isPlaying)
    {
        _videoPlayer.clip = _videoClips[Image.DatabaseIndex];
        _videoPlayer.Play();
    }

    transform.localScale = new Vector3(Image.ExtentX, Image.ExtentZ, 1);
}
}

Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 26 апреля 2019

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

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

...