視線入力
Mixed Reality アプリでの視線入力とは、ユーザーが何を見ているかを判別することを指します。 デバイス上の視線追跡カメラを Unreal のワールド空間におけるレイと一致させると、ユーザーの視線データを使用できるようになります。 視線入力は、ブループリントと C++ の両方で使用できます。これは、オブジェクトの対話式操作、経路探索、カメラ コントロールのようなメカニズムのためのコア機能です。
視線追跡の有効化
- [プロジェクト設定] > [HoloLens] で、[視線入力] 機能を有効にします。
- 新しいアクターを作成してシーンに追加する
Note
Unreal で HoloLens の視線追跡では、両目の視線を 1 つの視線入力レイのみで表します。 2 つのレイを必要とするステレオピック追跡はサポートされていません。
視線追跡の使用
まず、デバイスで IsEyeTrackerConnected 関数を使用した視線追跡がサポートされていることを確認します。 関数が true を返す場合は、GetGazeData を呼び出して、ユーザーの目が現在のフレーム内で見ている場所を見つける必要があります。
Note
固視点と信頼度の値は、HoloLens では使用できません。
視線入力の原点と方向をライン トレースで使用して、ユーザーが見ている場所を正確に判別します。 視線入力値はベクトルであり、視線入力の原点から始まって、視線の方向にライン トレースの距離で乗算した位置を原点に加算した位置で終わる値です。
頭の向きを取得する
また、ヘッド マウントディスプレイ (HMD) の回転を使用して、ユーザーの頭の方向を表すこともできます。 視線入力機能を有効にせずにユーザーの頭の方向を取得できますが、視線追跡情報は一切取得されません。 ブループリントへの参照をワールド コンテキストとして追加して、正しい出力データを取得します。
Note
HMD データの取得は、Unreal 4.26 以降でのみ使用できます。
C++ の使用
- ゲームの build.cs ファイルで、EyeTracker を PublicDependencyModuleNames リストに追加します。
PublicDependencyModuleNames.AddRange(
new string[] {
"Core",
"CoreUObject",
"Engine",
"InputCore",
"EyeTracker"
});
-
File/ New C++ Class で、EyeTracker という名前の新しい C++ アクターを作成します
- Visual Studio ソリューションで、新しい EyeTracker クラスが開かれます。 ビルドして実行し、新しい EyeTracker アクターで Unreal ゲームを開きます。 [アクターの配置] ウィンドウで "EyeTracker" を検索し、そのクラスをゲーム ウィンドウにドラッグ アンド ドロップしてプロジェクトに追加します。
- EyeTracker.cpp で、EyeTrackerFunctionLibrary と DrawDebugHelpers のインクルードを追加します。
#include "EyeTrackerFunctionLibrary.h"
#include "DrawDebugHelpers.h"
視線入力データを取得する前に、UEyeTrackerFunctionLibrary::IsEyeTrackerConnected を使用した視線追跡がデバイスでサポートされていることを確認します。 視線追跡がサポートされている場合は、UEyeTrackerFunctionLibrary::GetGazeData からライン トレースのレイの開始位置と終了位置を見つけます。 そこから、視線ベクトルを構築し、その内容を LineTraceSingleByChannel に渡して、レイ ヒットの結果をデバッグできます。
void AEyeTracker::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if(UEyeTrackerFunctionLibrary::IsEyeTrackerConnected())
{
FEyeTrackerGazeData GazeData;
if(UEyeTrackerFunctionLibrary::GetGazeData(GazeData))
{
FVector Start = GazeData.GazeOrigin;
FVector End = GazeData.GazeOrigin + GazeData.GazeDirection * 100;
FHitResult Hit Result;
if (GWorld->LineTraceSingleByChannel(HitResult, Start, End, ECollisionChannel::ECC_Visiblity))
{
DrawDebugCoordinateSystem(GWorld, HitResult.Location, FQuat::Identity.Rotator(), 10);
}
}
}
}
次の開発チェックポイント
用意されている Unreal 開発体験に従っている場合、MRTK コア構成要素を探索している段階にいます。 ここから、次の構成要素を続けることができます。
または、Mixed Reality プラットフォームの機能と API に移動します。
いつでも Unreal 開発チェックポイントに戻ることができます。