【问题标题】:Unity and Vuforia: Target Image ID and GUI WindowsUnity 和 Vuforia:目标图像 ID 和 GUI 窗口
【发布时间】:2017-02-16 10:10:53
【问题描述】:

我正在使用 Unity 和 Vuforia 为我的桌面 RPG 小组制作一个秘密项目。现在,我遇到了 Vuforia 网站上缺少参考和删除网页的问题。

目前,我的问题是:我想跟踪多达 5 个目标图像,并在扫描时让它们中的每一个创建自己的单独 GUI 窗口,以跟踪 UI 中的图像。我有一部分工作,我可以跟踪所有图像,但一次只出现 1 个窗口。我知道实际图像有效,因为我包含用于调试的占位符 3d 对象。

我用于 GUI Windows 基础的脚本:https://developer.vuforia.com/forum/faq/unity-how-can-i-popup-gui-button-when-target-detected

我认为我的问题在于 OnTrackableStateChanged()(第 19-32 行链接;28-43 我的代码如下)。我需要对其进行更改,以便它可以考虑多个目标图像。再说一次,我可能是超级错误的,因为 Vuforia 的 API 站点或论坛上的任何引用都已被删除。有没有人知道我可以做些什么来实现我的目标?我目前正在考虑使用 getID() 函数,然后以某种方式让 OnTrackableStateChange() 检查更改后的 ID 是否与原始想法不同。但同样,我可能会忽略一个更简单的解决方案。

如果不清楚,我可以尝试详细说明。下面是我使用的代码,它使用了上面链接中的组件。感谢您的帮助。 :

using UnityEngine;
using System.Collections;

public class ButtonPopup : MonoBehaviour, Vuforia.ITrackableEventHandler
{

    private Vuforia.TrackableBehaviour mTrackableBehaviour;

    private bool mShowGUIWindow = false;
    private TargetScreenCoords coordinateScript;
    public int ID;
    private Rect mWindowRect;
    public string Name;
    public int Health;
    public string Status;
    public bool Villain;


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

    public void OnTrackableStateChanged(
                                    Vuforia.TrackableBehaviour.Status previousStatus,
                                    Vuforia.TrackableBehaviour.Status newStatus)
    {

        if (newStatus == Vuforia.TrackableBehaviour.Status.DETECTED ||
            newStatus == Vuforia.TrackableBehaviour.Status.TRACKED)
        {
            mShowGUIWindow = true;
        }
        else
        {
            mShowGUIWindow = false;

        }
    }

    void OnGUI()
    {
        coordinateScript = GetComponent<TargetScreenCoords>();
        mWindowRect = new Rect(coordinateScript.screenPoint.x, Mathf.Abs(coordinateScript.screenPoint.y), 120, 100);

        if (Villain == true)
        {
            GUI.backgroundColor = Color.red;
        }
        if (Villain == false)
        {
            GUI.backgroundColor = Color.green;
        }
        if (mShowGUIWindow)
        {
            mWindowRect = GUI.Window(ID, mWindowRect, DoMyWindow, "ID:" + ID);
        }
    }

    void DoMyWindow(int windowID)
    {
        GUI.Label(new Rect(10, 20, 100, 60), new GUIContent("Name: " + Name + "\nHealth: " + Health + "\nStatus: " + Status));
        if (GUI.Button(new Rect(10, 70, 100, 20), "Edit Button"))
        {
            print("Got a click");
            Villain = !Villain;
        }

    }
}

再次感谢您的帮助/想法。

【问题讨论】:

  • 您是否尝试过使用 MultiTarget 预制件而不是 ImageTargets?
  • MultiTarget 专门寻找方向。因此,如果 2 个图像在一起,它会做一件事,或者如果它们相距很远,则做另一件事。我不希望在我的项目中(还)。

标签: c# unity3d augmented-reality vuforia


【解决方案1】:

第一个问题是,是否要同时跟踪这 5 个目标?如果是,请记住您需要在ARCamera 配置中指定它。在场景中的ARCamer对象下设置Max Simultaneous Tracked Images为5。

在每个 ImageTarget 下,您还应该有一个 Trackable Event Handler 脚本。默认为DefaultTrackableEventHandler。在此脚本中,您有 2 个私有方法 OnTrackingFound()OnTrackingLost()。尝试在那里添加第三个 foreach 循环,您将在其中启用/禁用您的 GUI 对象类型(Canvas 或类似的东西)。

【讨论】:

  • 我已经实施了您建议的第一部分。我很快就会在此处添加已编辑的 DefaultTrackableEventHandler。感谢您的帮助。
  • 所以我找到了解决方案。我需要将 GUI.Window 更改为 GUI.Box。它现在可以毫无问题地跟踪我需要的所有内容。
  • 很高兴听到这个消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
相关资源
最近更新 更多