如何使用 MRTK3 为 Hololens2 启用眼动追踪

问题描述 投票:0回答:1

我是初学者,刚刚开始使用 Unity 2022、Hololens2 和 MRTK3。对于我的项目,我试图启用凝视交互,这样当一个人凝视一个物体(例如球体全息图)超过阈值时间(例如3秒)时,之前的文本(textMeshPro)不可见因凝视而变得可见。如果有人能够指导我完成所有必要的步骤,我将非常感激。我知道我应该使用 Gaze Controller 但我不知道如何使用。

我一直在网上寻找教程/分步示例,但没有运气。到目前为止我发现的大部分内容都与 MRTK2 有关,考虑到这些变化,这没有多大帮助。

提前致谢!

unity-game-engine hololens mrtk eye-tracking
1个回答
0
投票

MRTK3上的资源确实有些匮乏。 MRTK3 开发模板是一个很好的起点。下面让我们尝试重新创建您的示例用例。我假设您使用运行 MRTK3 的 MRTK XR Rig 获得了一个基本场景。

首先,您需要对

FuzzyGazeInteractor
的引用,例如如
gazeInteractor
。您可能会在 MRTK XR Rig -> MRTK Gaze Controller -> GazeInteractor 下找到它。然后,以下脚本将光线投射到场景中并检查是否与例如物体发生碰撞。球体,我们称之为
targetObj
。凝视交互器为我们提供了一些方便的信息,例如
rayOriginTransform
,我们可以使用它来确定凝视方向并执行光线投射。在您的用例中,您希望在用户凝视某物
gazeTriggerDuration
秒后触发某事。如果检测到与
targetObject
的碰撞,我们将对帧之间经过的时间求和,否则我们重置。

// References on script to gaze interactor and target object
public FuzzyGazeInteractor gazeInteractor;
public GameObject targetObj;

// Max. distance used for raycasting
public float rayMaxDistance = 5f;

// Timer for gaze duration
public float gazeTriggerDuration = 3f;
// Elapsed time between collision
private float elapsedTime = 0f;

// Check for gaze collision continuously
void Update()
{
    // Create ray along gaze direction
    var gazeRay = new Ray(gazeInteractor.rayOriginTransform.position, gazeInteractor.rayOriginTransform.forward * rayMaxDistance);
    if (Physics.Raycast(gazeRay, out var hit))
    {
        // Check if we hit target object or sth else (could also use tags)
        if (hit.collider.gameObject == targetObj)
        {
            // Increase elapsed time
            elapsedTime += Time.deltaTime;

            // Check if gaze trigger duration surpassed
            if (elapsedTime >= gazeTriggerDuration)
            {
                // Do sth e.g. enable text obj
                ...
            }
        }
        else
        {
            // No collision with target object
            elapsedTime = 0f;
        }
    }
    else
    {
        // No collision at all
        elapsedTime = 0f;
    }
}

附带说明:如果您对与按钮等 UI 元素进行注视交互感兴趣,某些组件带有内置的 MRTK 事件,包括诸如 Is Gaze Hovered 之类的事件,您可以使用它来触发回调等。请参阅下图以供参考:

此外,此代码未经测试,但核心思想应该可行。

© www.soinside.com 2019 - 2024. All rights reserved.