Я решил погрузиться в 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 может помочь мне понять, что я здесь напортачу. Спасибо за помощь.