建筑可视化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
相关产品推荐
相关产品推荐

