即使目标图像在 Vuforia 中丢失,也要将目标模型附加到屏幕?

Attach the target model to screen even when target image is lost in Vuforia?

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

我正在目标图像上播放绿屏视频。我应该怎么做才能实现我的要求。 到目前为止,我正在将四边形附加到图像目标,然后附加视频播放器。

我试过的:

我去过这个。但是无法达到我的结果。任何帮助将非常感激。谢谢!

我为此使用了 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;

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

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

为此,我使用自定义 DefaultTrackableEventHandler 扩展它 UnityEvents(类似于 UI.ButtononClick

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

现在在 onTargetFound 事件的 ImageTarget 中添加 1 个元素并拖入 Quad 对象。比列表中的 select 方法 PlaceOnImageTarget -> UpdatePosition (确保 select 说 dynamic -> 它应该没有输入字段但会使用我们在调用事件时传入的值)

如果您希望它在跟踪 ImageTarget 时永久更新,也对 whileTargetTracked 事件重复相同的操作。


在智能手机上打字,所以没有保证,但我希望这个想法能清楚。