Fej-tekintet és tekintet bemenete a DirectX-hez

Szolgáltatás HoloLens (1. generációs) HoloLens 2. Modern headsetek
Fej-tekintet ✔️ ✔️ ✔️
Tekintet ✔️

A fej-tekintet használata

A head-tekintet eléréséhez először hívja meg a SpatialPointerPose::TryGetAtTimestamp adatokat egy új SpatialPointerPose objektum fogadásához. Adja át a következő paramétereket.

Ha már rendelkezik érvényes SpatialPointerPose-rel, a fej pozíciója és a továbbítási irány tulajdonságokként érhető el. Az alábbi kód bemutatja, hogyan férhet hozzájuk.

using namespace winrt::Windows::UI::Input::Spatial;
using namespace winrt::Windows::Foundation::Numerics;

SpatialPointerPose pointerPose = SpatialPointerPose::TryGetAtTimestamp(coordinateSystem, prediction.Timestamp());
if (pointerPose)
{
	float3 headPosition = pointerPose.Head().Position();
	float3 headForwardDirection = pointerPose.Head().ForwardDirection();

	// Do something with the head-gaze
}

A tekintet használata

Ahhoz, hogy a felhasználók szemre tekintő bemenetet használjanak, minden felhasználónak végig kell mennie egy szemkövetési felhasználón, aki az eszköz első használatakor megszibrál. A szem-tekintet API hasonló a fej-tekintethez. Ugyanazt a SpatialPointerPose API-t használja, amely egy sugár forrását és irányát biztosítja, amelyet a jeleneten keresztül lehet sugárontetni. Az egyetlen különbség az, hogy használat előtt explicit módon engedélyeznie kell a szemkövetést:

  1. Kérjen felhasználói engedélyt a szemkövetés használatára az alkalmazásban.
  2. Engedélyezze a "Gaze Input" képességet a csomagjegyzékben.

Hozzáférés kérése a tekintet bemenetéhez

Amikor az alkalmazás elindul, hívja meg az EyesPose::RequestAccessAsync metódust, hogy hozzáférést kérjen a szemkövetéshez. A rendszer szükség esetén rákérdez a felhasználóra, és a következőt adja vissza: GazeInputAccessStatus::Engedélyezve a hozzáférés után. Ez egy aszinkron hívás, ezért további kezelést igényel. Az alábbi példa egy leválasztott std::thread függvényt hoz létre az eredményre való várakozáshoz, amelyet egy nevű tagváltozóban tárol, m_isEyeTrackingEnabled.

using namespace winrt::Windows::Perception::People;
using namespace winrt::Windows::UI::Input;

std::thread requestAccessThread([this]()
{
	auto status = EyesPose::RequestAccessAsync().get();

	if (status == GazeInputAccessStatus::Allowed)
		m_isEyeTrackingEnabled = true;
	else
		m_isEyeTrackingEnabled = false;
});

requestAccessThread.detach();

Leválasztott szál indítása csak egy lehetőség az aszinkron hívások kezelésére. Használhatja a C++/WinRT által támogatott co_await funkciót is. Példa a felhasználói engedély kérésére:

  • A EyesPose::IsSupported() lehetővé teszi, hogy az alkalmazás csak akkor aktiválja az engedély párbeszédpanelt, ha van szemkövető.
  • GazeInputAccessStatus m_gazeInputAccessStatus; Ezzel megakadályozhatja, hogy újra és újra kiugróan kiugró engedélyeket kap a rendszer.
GazeInputAccessStatus m_gazeInputAccessStatus; // This is to prevent popping up the permission prompt over and over again.

// This will trigger to show the permission prompt to the user.
// Ask for access if there is a corresponding device and registry flag did not disable it.
if (Windows::Perception::People::EyesPose::IsSupported() &&
   (m_gazeInputAccessStatus == GazeInputAccessStatus::Unspecified))
{ 
	Concurrency::create_task(Windows::Perception::People::EyesPose::RequestAccessAsync()).then(
	[this](GazeInputAccessStatus status)
	{
  		// GazeInputAccessStatus::{Allowed, DeniedBySystem, DeniedByUser, Unspecified}
    		m_gazeInputAccessStatus = status;
		
		// Let's be sure to not ask again.
		if(status == GazeInputAccessStatus::Unspecified)
		{
      			m_gazeInputAccessStatus = GazeInputAccessStatus::DeniedBySystem;	
		}
	});
}

A tekintetbeviteli képesség deklarálása

Kattintson duplán az appxmanifest fájlra a Megoldáskezelő. Ezután lépjen a Képességek szakaszra, és ellenőrizze a Tekintetbevitel képességet.

Betekintési képesség

Ez hozzáadja a következő sorokat az appxmanifest fájl Csomag szakaszhoz:

  <Capabilities>
    <DeviceCapability Name="gazeInput" />
  </Capabilities>

A szemköri sugár leképezete

Miután megkapta a hozzáférést az ET-hez, minden képkockához megragadhat egy szemretekintő sugarat. Akár csak a head-betekintés esetén, a SpatialPointerPose lekért értékéhez hívja meg a SpatialPointerPose::TryGetAtTimestamp adatokat a kívánt időbélyegzővel és koordinátarendszerrel. A SpatialPointerPose egy EyesPose objektumot tartalmaz a Eyes tulajdonságon keresztül. Ez csak akkor nem null értékű, ha a szemkövetés engedélyezve van. Innen a EyesPose::IsCalibrationValidhívásával ellenőrizheti, hogy az eszköz felhasználója rendelkezik-e szemkövetési funkcióval. Ezután a Tekintet tulajdonság használatával le kell kapnia a szem-tekintet pozícióját és irányát tartalmazó SpatialRay-t. A Gaze tulajdonság néha null is lehet, ezért ezt ellenőrizze. Ez akkor fordulhat elő, ha egy hitelesített felhasználó átmenetileg bezárja a tekintetét.

Az alábbi kód bemutatja, hogyan férhet hozzá a szem-tekinteti sugárhoz.

using namespace winrt::Windows::UI::Input::Spatial;
using namespace winrt::Windows::Foundation::Numerics;

SpatialPointerPose pointerPose = SpatialPointerPose::TryGetAtTimestamp(coordinateSystem, prediction.Timestamp());
if (pointerPose)
{
	if (pointerPose.Eyes() && pointerPose.Eyes().IsCalibrationValid())
	{
		if (pointerPose.Eyes().Gaze())
		{
			auto spatialRay = pointerPose.Eyes().Gaze().Value();
			float3 eyeGazeOrigin = spatialRay.Origin;
			float3 eyeGazeDirection = spatialRay.Direction;
			
			// Do something with the eye-gaze
		}
	}
}

Tartalék, ha a szemkövetés nem érhető el

Ahogy a szemkövetési tervezési dokumentumokbanemlítettük, a tervezőknek és a fejlesztőknek is tisztában kell lenniük az olyan példányokkal, amelyekben nem érhetők el szemkövetési adatok.

Számos oka lehet annak, ha az adatok nem érhetők el:

  • A felhasználó nincs beállítva
  • Egy felhasználó megtagadta az alkalmazás hozzáférését a saját szemkövetési adataihoz
  • Átmeneti interferencia, például a vizor HoloLens vagy a haj eltolása a felhasználó szemével.

Bár ebben a dokumentumban már említettünk néhány API-t, a következőben röviden összefoglaljuk, hogyan észlelhető a szemkövetés:

Azt is ellenőrizheti, hogy a szemkövetési adatok nem elavultak-e, ha időtúllépést ad a fogadott szemkövetési adatok frissítései között, és más módon visszaveszi a tekintetét az alábbiakban tárgyaltak szerint. További információért látogasson el a tartalék kialakítási szempontokra.


Tekintet és más bemenetek korrelálva

Előfordulhat, hogy olyan SpatialPointerPose-adattárra van szüksége, amely egy múltbeli eseménynek felel meg. Ha például a felhasználó légi koppintással dolgozik, előfordulhat, hogy az alkalmazás tudni szeretné, hogy mit figyelt. Erre a célra a SpatialPointerPose::TryGetAtTimestamp előrejelezett időkerettel való használata pontatlan lenne a rendszer bemeneti feldolgozása és a megjelenítési idő közötti késés miatt. Emellett ha szemre tekintünk a célcsoportkezeléshez, a szemünk általában még a véglegesítési művelet befejezése előtt is továbblép. Ez kevésbé jelent problémát egy egyszerű légi koppintásnál, de a hosszú hangparancsok gyors szemmozgással való kombinálása kritikusabbá válik. Ennek a forgatókönyvnek az egyik módja a SpatialPointerPose::TryGetAtTimestamphívása, amely a bemeneti eseménynek megfelelő előzmény-időbélyegzőt használ.

A SpatialInteractionManageren áthaladó bemenetek esetében azonban van egy egyszerűbb metódus. A SpatialInteractionSourceState sajátTryGetAtTimestamp függvénysel rendelkezik. A hívása tökéletes korrelációt biztosít a SpatialPointerPose-hez, a találgatás nélkül. A SpatialInteractionSourceStates használatával kapcsolatos további információkért nézze meg a DirectX dokumentációjának Hands and Motion Controllers (Kéz- és mozgásvezérlők) dokumentációját.


Kalibrációs

Ahhoz, hogy a szemkövetés pontosan működjön, minden felhasználónak át kell mennie egy szemkövetési felhasználón. Ez lehetővé teszi, hogy az eszköz a felhasználó számára kényelmesebb és jobb minőségű megtekintési élmény érdekében módosítsa a rendszert, és ezzel egyidejűleg biztosítsa a pontos szemkövetést. A fejlesztőknek semmit sem kell tenniük a felhasználói élmény kezeléséhez. A rendszer gondoskodik arról, hogy a rendszer a következő esetekben kérni fogja a felhasználót az eszköz bekalküldésére:

  • A felhasználó először használja az eszközt
  • A felhasználó korábban nem döntött a lemondási folyamatról
  • A hitelesítési folyamat nem sikerült, amikor a felhasználó utoljára használta az eszközt

A fejlesztőknek megfelelő támogatást kell nyújtaniuk az olyan felhasználóknak, akik esetleg nem érhetők el szemkövetési adatok. A tartalék megoldásokkal kapcsolatos szempontokról további információt a 2.HoloLens talál.


Lásd még

Megjegyzés

Ez a cikk az örökölt WinRT natív API-kra vonatkozik. Az új natív alkalmazásprojektek esetében az OpenXR API használatát javasoljuk.

A Windows Mixed Reality szem- és fejbetekintő bemenettel határozzák meg, hogy a felhasználó mit néz. Az adatok használatával elsődleges bemeneti modelleket, például fej-tekintetet és véglegesítést használhat,és kontextust nyújthat a különböző interakciótípusokhoz. Az API-n keresztül kétféle tekintetvektor érhető el: fej- és szem-tekintet. Mindkettő egy háromdimenziós sugár, amely eredete és iránya is van. Az alkalmazások ezután a saját jelenetükbe vagy a való világba is beszivárnak, és eldöntik, hogy mit céloz meg a felhasználó.

A fej-tekintet azt az irányt jelöli, amelybe a felhasználó feje mutat. Gondoljon úgy a fejre, mint magának az eszköznek a pozíciójára és előre irányának, a kettő közötti középponti pozícióval. A fej-tekintet minden eszközön Mixed Reality elérhető.

A tekintet azt az irányt jelöli, amely felé a felhasználó figyel. Az eredet a felhasználó szeme között található. A szemkövetési rendszert Mixed Reality eszközökön érhető el.

A fej- és a szemszem is elérhető a SpatialPointerPose API-n keresztül. Hívja meg a SpatialPointerPose::TryGetAtTimestamp adatokat egy új SpatialPointerPose objektum fogadásához a megadott időbélyegző és koordinátarendszer szerint. Ez a SpatialPointerPose fejre ható tekintetet tartalmaz az eredete és iránya alapján. Ha van elérhető szemkövetés, akkor a szem szemének eredetét és irányát is tartalmazza.

Eszköztámogatás