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

建筑可视化AR应用Vuforia跟踪问题及ITrackableEventHandler报错求助

问题描述

我正在开发一款用于建筑可视化的AR应用,需要在正确位置按真实比例展示房屋3D模型。目前遇到的问题是:仅当相机跟踪图像目标时才会渲染3D模型,我已尝试使用Extended Tracking功能,但失去图像目标跟踪后3D模型仍会消失。请问是否有方法在跟踪到图像目标后将3D模型固定在指定位置?

遇到的错误

我尝试了以下脚本,却出现错误提示:

The type or namespace name 'ITrackableEventHandler' could not be found(are you missing a using directive or an assembly reference?

尝试的脚本

using UnityEngine;
using Vuforia;

public class KeepObjectVisible : MonoBehaviour, ITrackableEventHandler
{
    private TrackableBehaviour mTrackableBehaviour;
    private bool isTracking = false;

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

    public void OnTrackableStateChanged(
        TrackableBehaviour.Status previousStatus,
        TrackableBehaviour.Status newStatus)
    {
        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            OnTrackingFound();
        }
        else if (previousStatus == TrackableBehaviour.Status.TRACKED &&
                 newStatus == TrackableBehaviour.Status.NO_POSE)
        {
            OnTrackingLost();
        }
        else
        {
            OnTrackingLost();
        }
    }

    private void OnTrackingFound()
    {
        isTracking = true;
        SetChildrenActive(true);
    }

    private void OnTrackingLost()
    {
        isTracking = false;
        // Here, we do not deactivate the children to keep the object visible.
    }

    void Update()
    {
        if (!isTracking)
        {
            // Logic to keep the object visible and possibly maintain its last known position.
        }
    }

    private void SetChildrenActive(bool active)
    {
        foreach (Transform child in transform)
        {
            child.gameObject.SetActive(active);
        }
    }
}

解决方案

1. 修复脚本API兼容问题

报错是因为新版Vuforia中ITrackableEventHandler接口已被替换为ITrackableObserverEventHandler,同时相关API命名也有调整。修改后的脚本如下:

using UnityEngine;
using Vuforia;

public class KeepObjectVisible : MonoBehaviour, ITrackableObserverEventHandler
{
    private TrackableObserver mTrackableObserver;
    private bool isTracking = false;
    private Vector3 lastPosition;
    private Quaternion lastRotation;

    void Start()
    {
        mTrackableObserver = GetComponent<TrackableObserver>();
        if (mTrackableObserver != null)
        {
            mTrackableObserver.RegisterObserverEventHandler(this);
        }
    }

    public void OnObserverStateChanged(ObserverBehaviour behaviour, ObserverStateChange stateChange)
    {
        if (stateChange == ObserverStateChange.Tracked || stateChange == ObserverStateChange.ExtendedTracked)
        {
            OnTrackingFound();
        }
        else if (stateChange == ObserverStateChange.Lost)
        {
            OnTrackingLost();
        }
    }

    private void OnTrackingFound()
    {
        isTracking = true;
        // 记录模型当前的位置与旋转信息
        lastPosition = transform.position;
        lastRotation = transform.rotation;
        SetChildrenActive(true);
    }

    private void OnTrackingLost()
    {
        isTracking = false;
        // 不关闭子物体,保持模型可见
    }

    void Update()
    {
        if (!isTracking)
        {
            // 强制将模型固定在最后记录的位置
            transform.SetPositionAndRotation(lastPosition, lastRotation);
        }
    }

    private void SetChildrenActive(bool active)
    {
        foreach (Transform child in transform)
        {
            child.gameObject.SetActive(active);
        }
    }
}

2. 配置Vuforia确保功能生效

  • 确认使用最新稳定版Vuforia,避免API兼容问题
  • 在Vuforia配置面板中开启Extended Tracking功能
  • 对应图像目标的属性面板中,勾选Extended Tracking选项

3. 核心逻辑说明

当相机跟踪到图像目标时,记录模型当前的位置和旋转参数;失去跟踪后,在Update方法中强制将模型固定在最后记录的位置,实现目标丢失后模型仍保持在原地显示的效果。

内容的提问来源于stack exchange,提问作者Takidzwa Brian Denhere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:30:07