Unity VR移动InteractionRig后EyeInteractor仍在原点生成的问题求助
问题原因及解决方案
核心原因
你的EyeInteractors、CameraRig未继承InteractionRig的位置偏移,本质是这些组件的追踪参考帧未与移动后的Rig绑定,或是OVR追踪空间配置未正确关联Rig层级。
具体修复步骤
1. 调整EyeInteractors的父级层级
- 确保左右EyeInteractors是InteractionRig内部CameraRig的直接子对象(比如挂载在OVRCameraRig的TrackingSpace节点下),而非场景根节点的独立对象。
- 若EyeInteractors是脚本动态生成的,修改生成逻辑,将父对象设为InteractionRig内的TrackingSpace或Camera节点,而非默认的场景根。
2. 修正OVR追踪空间绑定
- 选中InteractionRig内的
OVRCameraRig组件,将Tracking Space设置为Local而非World。 - 把
OVRCameraRig的Reference Frame属性手动指定为InteractionRig的根GameObject,确保追踪数据基于Rig位置计算。
3. 修复EyeTrackingRay脚本的空间依赖
- 打开
EyeTrackingRay脚本,替换原LineRenderer起点设置逻辑:不要用独立的locationGameObject,直接从当前EyeInteractor的Transform或OVRCameraRig的眼锚点获取起点位置。示例代码:
// 方案1:从当前EyeInteractor的Transform取起点 lineRenderer.SetPosition(0, transform.position); // 方案2:绑定到OVR官方眼锚点(更稳定) var ovrCameraRig = FindObjectOfType<OVRCameraRig>(); if(ovrCameraRig != null) { Transform eyeAnchor = isLeftEye ? ovrCameraRig.leftEyeAnchor : ovrCameraRig.rightEyeAnchor; lineRenderer.SetPosition(0, eyeAnchor.position); }
4. 强制同步追踪数据
在InteractionRig移动完成后,调用以下代码刷新追踪状态,确保眼动数据同步到新位置:
OVRManager.display.RecenterPose(); OVREyeTracker.Instance.UpdateEyeTracking();
5. 排查动态生成逻辑
若EyeInteractors是教程脚本动态创建的,检查代码中是否硬编码生成位置为Vector3.zero,将生成位置改为基于InteractionRig的本地坐标,比如:
// 假设interactionRigTransform是你的InteractionRig根节点Transform Vector3 spawnPos = interactionRigTransform.TransformPoint(Vector3.zero); Instantiate(eyeInteractorPrefab, spawnPos, Quaternion.identity, interactionRigTransform);
内容的提问来源于stack exchange,提问作者MFrikken
相关产品推荐
相关产品推荐

