即使在Vuforia中丢失了目标图像时,也可以将目标模型附加到屏幕上?

时间:2019-04-25 08:36:11

标签: unity3d augmented-reality vuforia

我正在使用Unity 5和vuforia 8.1。我有些奇怪的要求,当找到目标图像时,应该在屏幕上显示模态,但是当摄像机不在目标范围内时,它仍然应该存在。

我在目标图像上播放绿屏视频。我应该怎么做才能实现我的要求。 现在,我将Quad附加到Image Target,然后附加视频播放器。 enter image description here

我尝试过的事情:

我访问了link。但是没有达到我的结果。任何帮助将非常感激。谢谢!

2 个答案:

答案 0 :(得分:2)

我个人不喜欢Vuforia如何设置对象。只有永久跟踪图像目标才有意义。

我通常将跟踪与我要定位的对象完全分开。

为此,我使用自定义的DefaultTrackableEventHandler,将其扩展为UnityEvents(类似于onClick的{​​{1}})

UI.Button

将此组件放在ImageTarget上。

// 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; } } } 单独放置在场景中的某个位置,并将以下组件附加到它上

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中添加1个元素并拖动到onTargetFound对象中。比从列表中选择方法Quad-> PlaceOnImageTarget(请确保选择一个表示UpdatePosition->的方法,它不应输入任何字段,而是使用我们传递的值调用事件时输入的内容)

如果您希望在跟踪ImageTarget的同时对其进行永久更新,则对dynamic事件也要重复此操作。


在智能手机上输入,因此没有保修,但我希望这个想法能弄清楚。

答案 1 :(得分:0)

为此,我正在使用DefaultTrackableEventHandler.cs的修改版本。因为我不想更改vuforia自己的代码,所以我复制了所有内容并创建了一个新脚本。这是可以解决您问题的代码。

您可以设置布尔值来标记是否已跟踪标记。如果尚未跟踪标记,则将禁用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;