You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity室内导航应用:Vuforia图像目标丢失时如何保留显示模型?

解决Vuforia目标丢失后导航线保持显示的问题

核心问题是Vuforia默认会在图像目标丢失时禁用TrackableBehaviour所属的GameObject,导致其所有子对象(包括导航线)被隐藏。要解决这个问题,你需要把导航线从目标对象的层级中剥离,并通过OnTrackableStateChanged回调控制导航线的显示状态。

实现步骤:

  1. 调整对象层级

    • 将你的导航线对象从Image Target的子节点拖到场景根节点(或独立的父节点下),确保它不依赖Image Target的激活状态。
  2. 编写Trackable状态回调脚本
    创建一个脚本挂在Image Target对象上,实现ITrackableEventHandler接口,在目标识别/丢失时控制导航线:

using UnityEngine;
using Vuforia;

public class NavigationLinePersist : MonoBehaviour, ITrackableEventHandler
{
    private TrackableBehaviour _trackableBehaviour;
    public GameObject navigationLine; // 在Inspector中拖拽你的导航线对象
    private Vector3 _targetLastPosition;
    private Quaternion _targetLastRotation;

    void Start()
    {
        _trackableBehaviour = GetComponent<TrackableBehaviour>();
        if (_trackableBehaviour != null)
        {
            _trackableBehaviour.RegisterTrackableEventHandler(this);
        }
        navigationLine.SetActive(false);
    }

    public void OnTrackableStateChanged(
        TrackableBehaviour.Status previousStatus,
        TrackableBehaviour.Status newStatus)
    {
        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            // 识别到目标时,更新导航线位置并显示
            _targetLastPosition = _trackableBehaviour.transform.position;
            _targetLastRotation = _trackableBehaviour.transform.rotation;
            
            navigationLine.SetActive(true);
            navigationLine.transform.position = _targetLastPosition;
            navigationLine.transform.rotation = _targetLastRotation;
            
            // 如果你的导航线是LineRenderer,这里可以设置起点为目标位置
            // var lineRenderer = navigationLine.GetComponent<LineRenderer>();
            // lineRenderer.SetPosition(0, _targetLastPosition);
        }
        else
        {
            // 目标丢失时,保持导航线显示,不做隐藏操作
            // 若需要维持导航线的位置,直接保留当前状态即可
        }
    }
}

关键注意点:

  • 不要让导航线成为Image Target的子对象,否则目标丢失时整个Image Target被禁用,导航线会被强制隐藏。
  • 如果导航线的路径依赖目标的位置,在目标识别时记录目标的世界坐标,后续即使目标丢失,也用这个记录的坐标作为导航起点,不需要再依赖Trackable的transform。
  • 测试时留意Vuforia的状态切换:当目标完全移出屏幕,状态会变为LOST,此时脚本不会执行隐藏逻辑,导航线会保持显示。

内容的提问来源于stack exchange,提问作者Sir Antelope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:22:14