Прикрепить целевую модель к экрану, даже если целевое изображение потеряно в Vuforia? - PullRequest
0 голосов
/ 25 апреля 2019

Я использую Unity 5 и vuforia 8.1. У меня есть какое-то странное требование, что, когда целевое изображение найдено, модальное должно отображаться на экране, но когда камера находится вне цели, оно все равно должно быть там.

Я играю зеленое видео на целевом изображении Что я должен сделать, чтобы выполнить мое требование. К настоящему времени я присоединяю Quad к Image Target, а затем подключаю видеоплеер. enter image description here

Что я пробовал:

Я посетил эту ссылку . Но не смог добиться своего результата. Любая помощь приветствуется. Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Мне лично не нравится, как Vuforia настраивает объекты.Это имеет смысл, только если цель изображения постоянно отслеживается.

Обычно я полностью отделяю отслеживание от объектов, которые я хочу позиционировать.

Для этого я использую настроенный DefaultTrackableEventHandler, расширяющий его с помощьюUnityEvent s (аналогично onClick из UI.Button)

// We need a custom UnityEvent for passing on the 
// ImageTargets transform reference
[Serializable]
public class TransformEvent : UnityEvent<Transform> { }

public class VuforiaTargetEvents : DefaultTrackableEventHandler
{
    public TransformEvent onTargetFound;
    public TransformEvent whileTargetTracked;
    public TransformEvent onTargetLost;

    protected override void OnTrackingFound()
    {
        base.OnTrackingFound();

        onTargetFound.Invoke(transform);

        StopAllCoroutines();
        StartCoroutine(WhileTracked());
    }

    protected override void OnTrackingLost()
    {
        base.OnTrackingLost();

        onTargetLost.Invoke(transform);

        StopAllCoroutines();
    } 

    // For more information about Coroutines see
    // https://docs.unity3d.com/Manual/Coroutines.html
    private IEnumerator WhileTracked()
    {
        // looks dangerous but is ok inside a Coroutine 
        // as long as you yield somewhere
        while(true)
        {
            whileTargetTracked.Invoke(transform);
            yield return null;
        }
    }
}

Поместите этот компонент в ImageTarget.

Поместите Quad отдельногде-нибудь в сцене и присоедините к нему следующий компонент

public class PlaceOnImageTarget : MonoBehaviour
{
    // In the Inspector configure
    // if this object should be enabled or disabled at start
    public bool startEnabled;

    private void Awake()
    {
        gameObject.SetActive(startEnabled);
    }

    public void UpdatePosition(Transform imageTarget)
    {
        transform.position = imageTarget.position;
        transform.rotation = imageTarget.rotation;

        gameObject.SetActive(true);
    }
}

, теперь в ImageTarget в событии onTargetFound добавьте 1 элемент и перетащите в объект Quad.Чем выбрать из списка метод PlaceOnImageTarget -> UpdatePosition (обязательно выберите тот, который говорит dynamic ->, он не должен давать поля для ввода, но вместо этого будет использовать значение, которое мы передаем при вызове события)

Если вы хотите, чтобы оно постоянно обновлялось во время отслеживания ImageTarget, повторите то же самое и для события whileTargetTracked.


Печатается на смартфоне, поэтому никаких гарантий, но янадеюсь, идея прояснится.

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

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

Вы можете установить bool, чтобы отмечать, отслеживали ли вы маркер или нет.если он не отслеживал маркер, он отключит 3d модель (Quad), в противном случае он будет работать как обычно.Вы можете добавить другое условие, чтобы проверить, отличается ли вновь отслеживаемый маркер от другого.

Код:

    if (_isTracked)
    return;

    var rendererComponents = GetComponentsInChildren<Renderer>(true);
    var colliderComponents = GetComponentsInChildren<Collider>(true);
    var canvasComponents = GetComponentsInChildren<Canvas>(true);

    // Disable rendering:
    foreach (var component in rendererComponents)
        component.enabled = false;

    // Disable colliders:
    foreach (var component in colliderComponents)
        component.enabled = false;

    // Disable canvas':
    foreach (var component in canvasComponents)
        component.enabled = false;
...