MRTK 2.1 VR应用开发:如何实现坐站模式下头部高度统一?
解决MRTK 2.1中坐姿/站姿头部高度一致的问题
我之前开发VR应用时也碰到过完全一样的困扰——调完Playspace高度一传送就重置,而且Camera和Playspace之间的隐藏Offset确实让人摸不着头脑。下面是几个经过验证的实用方案,你可以根据需求选:
方法1:监听传送事件,自动重置Playspace高度
传送功能会把MixedRealityPlayspace的位置重置到目标点,所以我们要在每次传送完成后重新补上高度偏移。步骤很简单:
- 新建一个C#脚本(比如
PlayspaceHeightStabilizer.cs),挂载到场景里任意GameObject上(比如MixedRealityPlayspace本身) - 脚本里监听传送完成事件,回调中重新计算并设置Playspace的Y轴高度:
using UnityEngine; using Microsoft.MixedReality.Toolkit.Teleport; using Microsoft.MixedReality.Toolkit; public class PlayspaceHeightStabilizer : MonoBehaviour { // 你期望的固定头部高度(比如站姿眼高,单位米) public float targetEyeHeight = 1.6f; private float _heightOffset; void Start() { // 计算初始偏移:目标高度减去当前相机的实际Y位置 _heightOffset = targetEyeHeight - CameraCache.Main.transform.position.y; // 注册传送完成事件监听 CoreServices.TeleportationService.TeleportCompleted += OnTeleportDone; } private void OnTeleportDone(TeleportationEventData eventData) { // 传送后重新调整Playspace的Y值,保证相机高度不变 Vector3 newPos = MixedRealityPlayspace.Instance.transform.position; newPos.y = targetEyeHeight - CameraCache.Main.transform.position.y; MixedRealityPlayspace.Instance.transform.position = newPos; } void OnDestroy() { // 记得移除监听,避免内存泄漏 if (CoreServices.TeleportationService != null) { CoreServices.TeleportationService.TeleportCompleted -= OnTeleportDone; } } }
- 在Inspector里把
targetEyeHeight设为你想要的头部高度就行。
这个方法的核心是用CameraCache.Main获取带内部Offset的相机实际位置,再反向计算Playspace需要的偏移量,不管怎么传送都能把头部高度拉回目标值。
方法2:用MRTK内置的眼高校准功能
MRTK 2.1本身就有处理眼高的机制,不用自己写太多代码:
- 打开MRTK配置文件(
MixedRealityToolkitConfigurationProfile) - 找到
Camera Settings板块,勾选Use Eye Level - 进入对应的相机设置配置(比如
DefaultMixedRealityCameraSettingsProfile),可以直接设置Eye Level Offset,或者开启Floor Finding让系统自动检测地面,根据地面高度自动调整Playspace,保持眼高一致。
如果需要支持用户手动切换坐姿/站姿,还可以在代码里调用CoreServices.CameraSystem.SetEyeLevel(float eyeLevel)动态设置眼高——这个设置会被MRTK记住,传送后也不会重置。
关键注意事项
- 绝对不要直接修改MainCamera的位置!MRTK内部会维护Camera和Playspace之间的跟踪Offset,手动改相机位置会导致跟踪异常。
- 如果用Floor Finding功能,一定要确保场景里的地面有碰撞体,不然系统没法准确检测地面高度。
内容的提问来源于stack exchange,提问作者J. Selchow
相关产品推荐
相关产品推荐

