如何在HoloLens 2的2D UWP应用中使用C#获取眼动注视点的2D坐标
HoloLens 2 2D UWP应用眼动注视交互实现问题
官方文档指出,在2D UWP应用中:
当用户注视某物体或用动作控制器指向时,会触发触摸悬停事件。该事件包含的PointerPoint的PointerType为Touch,且IsInContact为false。
按照文档描述,HoloLens 2的眼动注视数据会自动映射到2D应用窗口,可通过PointerMovedEvent等事件获取。但实测发现,作为触摸悬停事件传入应用的既不是眼动注视也不是头部注视,而是HoloLens 2通过手部识别生成的指尖指向射线,仅当用户指向3D空间中的2D应用窗口框架时才会触发。如果有开发者确认眼动注视确实可映射到2D UWP应用窗口内并获取,欢迎告知。
第二种实现方案是调用SpatialPointPose API完成需求,目前已实现两个核心步骤:
- 应用启动时获取HoloLens初始位置,保留该位置的静态参考帧,代码如下:
private async void Page_Loaded(object sender, RoutedEventArgs e) { if (EyesPose.IsSupported() == true) { var ret = await EyesPose.RequestAccessAsync(); originLocator = SpatialLocator.GetDefault(); originRefFrame = originLocator.CreateStationaryFrameOfReferenceAtCurrentLocation(); coordinateSystem = originRefFrame.CoordinateSystem; } gazeTimer.Start(); }
- 通过该参考帧获取坐标系统,再通过调度定时器传入感知时间戳获取SpatialPointPose对象,进而提取眼动注视的起点和方向数据,在XAML的TextBlock中实时更新显示,代码如下:
private void GazeTimer_Tick(object sender, object e) { timestamp = PerceptionTimestampHelper.FromHistoricalTargetTime(DateTime.Now); spPose = SpatialPointerPose.TryGetAtTimestamp(coordinateSystem, timestamp); if (spPose.Eyes != null && spPose.Eyes.IsCalibrationValid) { if (spPose.Eyes.Gaze != null) { OriginXtextBlock.Text = spPose.Eyes.Gaze.Value.Origin.X.ToString(); OriginYtextBlock.Text = spPose.Eyes.Gaze.Value.Origin.Y.ToString(); OriginZtextBlock.Text = spPose.Eyes.Gaze.Value.Origin.Z.ToString(); DirectionXtextBlock.Text = spPose.Eyes.Gaze.Value.Direction.X.ToString(); DirectionYtextBlock.Text = spPose.Eyes.Gaze.Value.Direction.Y.ToString(); DirectionZtextBlock.Text = spPose.Eyes.Gaze.Value.Direction.Z.ToString(); } } }
目前遇到的核心卡点:无法获取2D UWP应用窗口框架在3D空间中的包围盒位置,也没有找到应用窗口像素分辨率与该框架的映射规则,因此无法计算眼动注视射线与2D应用窗口相交点对应的屏幕x、y坐标。
最终需求:实现和官方文档描述一致的眼动注视交互效果(目前该效果仅对手部识别的指尖指向生效)。如果眼动数据无法通过指针事件暴露,也可使用SpatialPointPose API,只要能解决获取2D应用窗口位置、计算注视射线相交的屏幕坐标的问题即可。
内容的提问来源于stack exchange,提问作者HoloSheep
相关产品推荐
相关产品推荐

