【问题标题】:Attach the target model to screen even when target image is lost in Vuforia?即使目标图像在 Vuforia 中丢失,也将目标模型附加到屏幕?
【发布时间】:2019-04-25 08:36:10
【问题描述】:

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

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

我尝试了什么:

我访问了这个link。但是达不到我的效果。任何帮助将非常感激。谢谢!

【问题讨论】:

    标签: unity3d augmented-reality vuforia


    【解决方案1】:

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

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

    为此,我使用自定义的DefaultTrackableEventHandler 扩展它与UnityEvents(类似于onClickUI.Button

    // 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 对象。比从列表中选择方法PlaceOnImageTarget -> UpdatePosition (确保选择显示dynamic 的方法 -> 它不应该提供输入字段,而是使用我们在调用事件时传入的值)

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


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

    【讨论】:

      【解决方案2】:

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

      您可以设置一个布尔值来标记您是否跟踪了标记。如果它没有跟踪标记,它将禁用 3d 模型(四边形),否则,它将正常工作。您可以添加另一个条件来检查新跟踪的标记是否与另一个不同。

      代码:

          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;
      

      【讨论】:

      • 那么我们必须将 Quad 附加到 ARCamera 而不是 Image Target?
      • 不,如果您尝试播放绿屏视频,则不需要四边形。如果您真的在寻找这样的东西(VideoPlayer),请告诉我youtube.com/watch?v=VZGlh_b1j0s
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多