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

如何在Unity 3D的Vuforia中阻止物体跟随AR相机移动?

解决Vuforia中AR物体不随相机移动的问题

嘿,这个问题我之前帮不少开发者搞定过!在Vuforia的默认逻辑里,我们的AR物体是挂在**Image Target(或其他Trackable对象)**下面的,所以当你移动手机(也就是AR相机)时,物体会跟着Trackable一起“走”。要实现你想要的「识别后物体固定在世界空间,相机移动时物体不动」的效果,这里有两种实用方案:

方案一:识别一次后永久固定物体

适合只需要把物体放在识别到的位置,之后不再跟随目标移动的场景:

  1. 先把你的AR物体放到Image Target的层级下,确保识别时能正确出现在目标位置。
  2. 创建一个C#脚本,挂载到Image Target上,代码如下:
using UnityEngine;
using Vuforia;

public class FixObjectOnFirstTrack : MonoBehaviour
{
    public GameObject arTargetObject;
    private TrackableBehaviour _trackable;
    private bool _isObjectFixed = false;

    void Start()
    {
        _trackable = GetComponent<TrackableBehaviour>();
        if (_trackable != null)
        {
            _trackable.RegisterOnTrackableStatusChanged(OnTrackableStatusUpdate);
        }
    }

    private void OnTrackableStatusUpdate(TrackableBehaviour.Status oldStatus, TrackableBehaviour.Status newStatus)
    {
        // 当第一次识别到目标时,固定物体
        if (newStatus == TrackableBehaviour.Status.TRACKED && !_isObjectFixed)
        {
            // 先记录物体当前的世界坐标和旋转
            Vector3 fixedWorldPos = arTargetObject.transform.position;
            Quaternion fixedWorldRot = arTargetObject.transform.rotation;
            
            // 让物体脱离Trackable的父子关系
            arTargetObject.transform.SetParent(null);
            
            // 重新赋值位置和旋转,防止脱离父物体后坐标偏移
            arTargetObject.transform.position = fixedWorldPos;
            arTargetObject.transform.rotation = fixedWorldRot;
            
            _isObjectFixed = true;
            
            // 可选:如果不需要再识别这个目标,可以禁用Trackable节省性能
            // _trackable.enabled = false;
        }
    }
}
  1. 在Inspector面板里,把你的AR物体拖到脚本的arTargetObject字段上就可以了。

方案二:跟踪时同步,失去跟踪后固定

适合需要多次识别目标更新物体位置,失去跟踪后保持当前位置的场景:

代码示例如下,同样挂载到Image Target上:

using UnityEngine;
using Vuforia;

public class SyncAndFixObject : MonoBehaviour
{
    public GameObject arTargetObject;
    private TrackableBehaviour _trackable;
    private bool _isTracking = false;

    void Start()
    {
        _trackable = GetComponent<TrackableBehaviour>();
        if (_trackable != null)
        {
            _trackable.RegisterOnTrackableStatusChanged(OnTrackableStatusUpdate);
        }
        // 初始隐藏物体,避免场景加载时显示异常
        arTargetObject.SetActive(false);
    }

    private void OnTrackableStatusUpdate(TrackableBehaviour.Status oldStatus, TrackableBehaviour.Status newStatus)
    {
        if (newStatus == TrackableBehaviour.Status.TRACKED)
        {
            _isTracking = true;
            arTargetObject.SetActive(true);
            // 跟踪时同步物体与Trackable的位置和旋转
            arTargetObject.transform.position = transform.position;
            arTargetObject.transform.rotation = transform.rotation;
        }
        else if (oldStatus == TrackableBehaviour.Status.TRACKED && !_isTracking)
        {
            // 失去跟踪后,让物体脱离父物体,固定在当前世界位置
            arTargetObject.transform.SetParent(null);
        }
    }
}

注意事项

  • 确保AR物体初始状态是禁用的,或者放在Trackable层级下,避免场景加载时出现在奇怪的位置。
  • 测试前检查Vuforia Configuration里的相机权限是否开启,保证AR相机正常工作。
  • 如果用方案一,物体固定后除非重新设置父子关系,否则不会再跟随Trackable移动,按需选择即可。

内容的提问来源于stack exchange,提问作者Harshil Savaliya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:13:21