如何在Unity 3D的Vuforia中阻止物体跟随AR相机移动?
解决Vuforia中AR物体不随相机移动的问题
嘿,这个问题我之前帮不少开发者搞定过!在Vuforia的默认逻辑里,我们的AR物体是挂在**Image Target(或其他Trackable对象)**下面的,所以当你移动手机(也就是AR相机)时,物体会跟着Trackable一起“走”。要实现你想要的「识别后物体固定在世界空间,相机移动时物体不动」的效果,这里有两种实用方案:
方案一:识别一次后永久固定物体
适合只需要把物体放在识别到的位置,之后不再跟随目标移动的场景:
- 先把你的AR物体放到Image Target的层级下,确保识别时能正确出现在目标位置。
- 创建一个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; } } }
- 在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
相关产品推荐
相关产品推荐

