【问题标题】:Augmented reality application using unity and vuforia使用 Unity 和 vuforia 的增强现实应用程序
【发布时间】:2017-10-11 04:04:10
【问题描述】:

大家好,我目前正在使用 unity 和 vuforia sdk 创建我的第一个 AR 应用程序。我已经了解了一些 AR 基础知识,您需要一个图像目标来显示 3d 对象或与图像目标关联的信息。我有这个 AR 旋转立方体

此示例应用程序在找到有效的图像目标时工作,并且 3d 立方体将显示并开始旋转。我的问题是,当手机扫描图像目标时,应该有一条消息说“正在扫描图像目标”,当找到它时会显示“找到图像目标”,它会显示一个弹出按钮“显示”,当按下立方体时会出现。

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));

}

}

更新:

我找到了这个脚本并对其进行了一些修改以在屏幕上方显示 UI 文本,我打算在未检测到图像目标时将文本更改为“图像目标丢失”,当图像目标存在时将文本更改为“找到图像目标” .我将脚本放在图像目标预制件上,但它显示错误UI Text Error。关于我做错了什么的任何建议。谢谢

示例代码

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";
    }
}
}

更新(2017 年 10 月 30 日)

如果我更新晚了,我很抱歉,我已经尝试了你所有提供的所有解决方案,但它仍然不起作用。代码的名称是 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");
}
}

附言

我已经将文本 UI 命名为 Scanning,因此当我按下播放时,文本已经显示所述单词。但是当它找到图像目标时,文本不会改变。请各位我非常需要你的帮助,如果有不需要的代码,请随时编辑或评论,以便我可以删除它。谢谢

【问题讨论】:

    标签: c# android unity3d vuforia android-augmented-reality


    【解决方案1】:

    也许您应该在 vuforia/scripts/defaulttrackable.cs

    中查看此方法 OnTrackingFound()
           // Enable rendering:
            foreach (Renderer component in rendererComponents)
            {
                component.enabled = true;
            }
    
            // Enable colliders:
            foreach (Collider component in colliderComponents)
            {
                component.enabled = true;
            }
    

    您可以使用布尔值来管理何时渲染立方体。

    【讨论】:

    • 我应该创建一个新脚本还是只添加到那个 defaulttrackable.cs 脚本?如果只是添加,你能给我看一个样本吗?
    【解决方案2】:

    在给定链接中查看 TrackableBehaviour 的属性: https://library.vuforia.com/content/vuforia-library/en/reference/unity/classVuforia_1_1TrackableBehaviour.html

    当图像目标被检测到时,将 TEXT 设置为“正在扫描”, On OnTrackingFound() 方法将 TEXT 设置为“Found”并设置 Button Object visible true, Onbuttonclik event 实例化 Cube 对象

    On OntrackingLost()方法设置Button对象可见false

    希望这会有所帮助。

    【讨论】:

    • 我已经尝试过了,但似乎无法做到。您能否详细说明您的答案,我也对我的问题进行了更新,您可以调查一下吗?谢谢
    • 只要去掉这行 uiText = gameObject.GetComponent ();并在 TextScript 的 Inspector 中创建 Canvas TEXT 对象并将该对象分配给 uitext。
    【解决方案3】:

    在您的脚本中,您只是声明了 uiText,但没有对其进行初始化。应该是这样的

    public Text uiText;
    

    然后将相关的 Text 游戏对象从项目窗口拖到检查器中的 TextScript 脚本或在 onStart() 中初始化它

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

    不推荐使用第二个选项,因为文本初始化次数等于数据库中的图像目标计数。

    希望对你有帮助。

    【讨论】:

    • 我试过了,但还是不行,我也发了一个更新,你能找到我哪里做错了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多