Приложение дополненной реальности с использованием unity и vuforia

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

введите описание изображения здесь

это пример приложения работает, когда оно обнаруживает допустимое целевое изображение, отображается трехмерный куб и начинает вращаться. Мой вопрос в том, что пока телефон сканирует цель изображения, должно появиться сообщение «Сканирование цели изображения», а когда оно будет найдено, будет отображаться «Цель изображения найдена» и отобразится всплывающая кнопка «Показать», при нажатии на которую появится куб.

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

public class RotateScript : MonoBehaviour {

public int speed;

//Update is called once per frame
void Update () {
    transform.Rotate (new Vector3 (0, Time.deltaTime * speed, 0));

}

}

Обновления:

Я нашел этот скрипт и немного изменил его, чтобы отобразить текст пользовательского интерфейса над экраном. Я намерен изменить текст на «Image Target Lost», если цель изображения не обнаружена, и «Image Target Found», когда цель изображения присутствует. Я помещаю сценарий в префаб целевого изображения, но он отображает ошибку Ошибка текста пользовательского интерфейса. Любые предложения о том, где я ошибся. Спасибо

Образец кода

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using Vuforia;

public class TextScript : MonoBehaviour, ITrackableEventHandler {

private TrackableBehaviour mTrackableBehaviour;
//Declares a UI text
Text uiText;

void Start () {
    mTrackableBehaviour = GetComponent<TrackableBehaviour>();
    if (mTrackableBehaviour)
    {
        mTrackableBehaviour.RegisterTrackableEventHandler(this);
    }

    //uiText = gameObject.GetComponent<Text> ();
}

public void OnTrackableStateChanged(
    TrackableBehaviour.Status previousStatus,
    TrackableBehaviour.Status newStatus)
{
    if (newStatus == TrackableBehaviour.Status.DETECTED ||
        newStatus == TrackableBehaviour.Status.TRACKED)
    {

        uiText.text = "Image Target Found";
    }
    else
    {

        uiText.text = "Image Target Lost";
    }
}
}

Обновление (30.10.2017)

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

TextScript

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using Vuforia;

public class TextScript : MonoBehaviour, ITrackableEventHandler {

private TrackableBehaviour mTrackableBehaviour;
//Declares a UI text
public Text uiText;

void Start () {
    mTrackableBehaviour = GetComponent<TrackableBehaviour>();
    if (mTrackableBehaviour)
    {
        mTrackableBehaviour.RegisterTrackableEventHandler(this);
    }

    uiText = gameObject.GetComponent<Text> ();
}

public void OnTrackableStateChanged(
    TrackableBehaviour.Status previousStatus,
    TrackableBehaviour.Status newStatus)
{
    if (newStatus == TrackableBehaviour.Status.DETECTED ||
        newStatus == TrackableBehaviour.Status.TRACKED ||
        newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
    {
        OnTrackingFound();

        uiText.text = "Image Target Found";
    }
    else
    {
        OnTrackingLost();

        //uiText.text = "Image Target Lost";
    }
}

private void OnTrackingFound()
{
    Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
    Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

    // Enable rendering:
    foreach (Renderer component in rendererComponents)
    {
        uiText.text = "Image Target Found";
        component.enabled = true;
    }

    // Enable colliders:
    foreach (Collider component in colliderComponents)
    {
        uiText.text = "Image Target Found";
        component.enabled = true;
    }

    Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
}


private void OnTrackingLost()
{
    Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
    Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

    // Disable rendering:
    foreach (Renderer component in rendererComponents)
    {
        uiText.text = "Image Target Lost";
        component.enabled = false;
    }

    // Disable colliders:
    foreach (Collider component in colliderComponents)
    {
        uiText.text = "Image Target Lost";
        component.enabled = false;
    }

    Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
}
}

P.S

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


person AtanHokage04    schedule 11.10.2017    source источник


Ответы (3)


Возможно, вам стоит изучить этот метод OnTrackingFound () в vuforia / scripts / defaulttrackable.cs

       // Enable rendering:
        foreach (Renderer component in rendererComponents)
        {
            component.enabled = true;
        }

        // Enable colliders:
        foreach (Collider component in colliderComponents)
        {
            component.enabled = true;
        }

вы можете использовать логическое значение, чтобы управлять тем, когда визуализировать куб.

person r2cris    schedule 11.10.2017
comment
Должен ли я создать новый сценарий или просто добавить к нему сценарий defaulttrackable.cs? Если просто добавить, можете ли вы показать мне образец? - person AtanHokage04; 12.10.2017

См. Свойства TrackableBehaviour по данной ссылке: https://library.vuforia.com/content/vuforia-library/en/reference/unity/classVuforia_1_1TrackableBehaviour.html

Когда целевое изображение Обнаружено, установите ТЕКСТ на «Сканирование», в методе OnTrackingFound () установите ТЕКСТ на «Найден» и установите объект кнопки как видимый истинным, событие Onbuttonclik Создание экземпляра куба объект

В методе OntrackingLost () Set Button объект visible false

Надеюсь это поможет.

person darsh    schedule 12.10.2017
comment
Я уже пробовал это, но не могу понять. Не могли бы вы подробнее рассказать о своем ответе, и у меня также есть обновленная информация по моему вопросу, вы можете его изучить? Спасибо - person AtanHokage04; 30.10.2017
comment
Просто удалите эту строку uiText = gameObject.GetComponent ‹Text› (); и Create Canvas TEXT Object и назначьте этот объект uitext в Инспекторе TextScript. - person darsh; 02.11.2017

В вашем скрипте вы только что объявили uiText, но не инициализировали его. Должно быть так

public Text uiText;

а затем перетащите соответствующий игровой объект Text из окна проекта в сценарий TextScript в инспекторе или инициализируйте его в onStart (), например

uiText = GameObject.Find("<your_text_object_name>").GetComponent<Text>();

Второй вариант не рекомендуется, поскольку текст инициализируется столько раз, сколько целевых изображений в базе данных.

Надеюсь, это поможет.

person Omar    schedule 19.10.2017
comment
Я пробовал, но все равно не работает, я также публикую обновление, вы можете найти, где я ошибся? - person AtanHokage04; 30.10.2017