Vstup z pohledu hlavy a pohledu v Rozhraní DirectX

Funkce HoloLens (1. generace) HoloLens 2 Imerzivní náhlavní soupravy
Pohled na hlavy ✔️ ✔️ ✔️
Pohled ✔️

Použití pohledu na hlavy

Pokud chcete získat přístup k pohledu na hlavy, začněte voláním spatialPointerPose::TryGetAtTimestamp pro příjem nového objektu SpatialPointerPose. Předejte následující parametry.

  • SpatialCoordinateSystem, který představuje souřadnicový systém, který chcete použít pro pohled na hlavy. V následujícím kódu je tato proměnná reprezentována proměnnou coordinateSystem. Další informace najdete v naší příručce pro vývojáře souřadnicových systémů.
  • Časové razítko, které představuje přesný čas požadované pozice hlavy. Obvykle použijete časové razítko, které odpovídá času, kdy se zobrazí aktuální snímek. Toto předpovězené časové razítko zobrazení můžete získat z objektu HolographicFramePrediction, který je přístupný prostřednictvím aktuálního holografického rámce. Tento objekt HolographicFramePrediction je reprezentován proměnnou predikce v následujícím kódu.

Jakmile máte platnou aplikaci SpatialPointerPose, jsou pozice hlavy a směr vpřed přístupné jako vlastnosti. Následující kód ukazuje, jak k nim získat přístup.

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
}

Použití pohledu

Aby uživatelé mohli použít pohled na vstup, musí každý uživatel při prvním použití zařízení sledovat uživatele. Rozhraní API pro pohled se podobá pohledu na hlavy. Používá stejné rozhraní API SpatialPointerPose, které poskytuje původ a směr paprsku, který můžete vysát na scénu. Jediným rozdílem je, že před jeho použitím musíte explicitně povolit sledování očí:

  1. Požádejte uživatele o oprávnění k používání sledování očí ve vaší aplikaci.
  2. V manifestu balíčku povolte funkci Vstup pohledu.

Vyžádání přístupu ke vstupu pohledu

Po spuštění aplikace požádejte o přístup ke sledování očí voláním metody EyesPose::RequestAccessAsync. Systém v případě potřeby vyzve uživatele a po povolení přístupu vrátí hodnotu GazeInputAccessStatus::Allowed. Jedná se o asynchronní volání, takže vyžaduje trochu dodatečné správy. Následující příklad roztáčí odpojené std::thread, aby čekalo na výsledek, který uloží do členské proměnné s názvem 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();

Spuštění odpojené vlákna je jen jedna možnost pro zpracování asynchronních volání. Můžete také použít novou funkci co_await, kterou podporuje C++/WinRT. Tady je další příklad, jak požádat o oprávnění uživatele:

  • EyePose::IsSupported() umožňuje aplikaci aktivovat dialogové okno oprávnění pouze v případě, že existuje sledování oka.
  • Ovládací prvek M_gazeInputAccessStatus; Tím zabráníte tomu, aby se výzva k oprávnění vyskakuje znovu a znovu.
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;	
		}
	});
}

Deklarování schopnosti vstupu pohledu

Poklikejte na soubor appxmanifest v Průzkumník řešení. Pak přejděte do části Capabilities (Schopnosti) a zkontrolujte funkci Vstupu pohledu.

Funkce vstupu pohledu

Tím se do části Balíček v souboru appxmanifest přidávají následující řádky:

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

Získání paprsku s pohledem

Jakmile obdržíte přístup k ET, můžete každý snímek zachytávat pohledem. Stejně jako u pohledu hlavy získejte SpatialPointerPose zavoláním spatialPointerPose::TryGetAtTimestamp s požadovaným časovém razítkem a souřadnicovým systémem. SpatialPointerPose obsahuje objekt EyesPose prostřednictvím vlastnosti Eyes. Tato hodnota není null, pouze pokud je povolené sledování oka. Tady můžete zkontrolovat, jestli má uživatel v zařízení možnost sledování očí, a to zavolání metody EyesPose::IsCalibrationValid. Dále pomocí vlastnosti Pohled získejte SpatialRay obsahující polohu a směr pohledu. Vlastnost Pohled může mít někdy hodnotu null, proto to nezapomeňte zkontrolovat. K tomu může dojít v případě, žebrovaný uživatel dočasně zavře oči.

Následující kód ukazuje, jak získat přístup ke paprsku s pohledem.

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
		}
	}
}

Záložní, když sledování oka není k dispozici

Jak je uvedeno vnaší dokumentu k návrhu sledování očí, návrháři i vývojáři by měli vědět o případech, kdy data sledování očí nemusí být k dispozici.

Nedostupnost dat má různé důvody:

  • Uživatel se nekalibruje
  • Uživatel odepře aplikaci přístup k datům sledování očí.
  • Dočasné interference, jako jsou šmouhy na HoloLens nebo vousy, které uživatele omkly.

Některá rozhraní API už jsme v tomto dokumentu zmínili, ale v následujícím příkladu poskytujeme souhrn toho, jak zjistit, že sledování očí je k dispozici jako stručná referenční příručka:

Můžete také chtít zkontrolovat, že vaše data sledování očí nejsou zastaralá, a to přidáním časového limitu mezi přijatou aktualizací dat sledování očí a jiným záložním pohledem na hlavy, jak je popsáno níže. Další informace najdete v našich záložních aspektech návrhu.


Korelace pohledu s jinými vstupy

Někdy můžete zjistit, že potřebujete SpatialPointerPose, které odpovídá události v minulosti. Pokud například uživatel používá Air Tap, může vaše aplikace chtít vědět, na co se dívá. Pro tento účel by jednoduše použití SpatialPointerPose::TryGetAtTimestamp s předpovězenou dobou rámce bylo nepřesné kvůli latenci mezi systémovým zpracováním vstupu a dobou zobrazení. Pokud k cílení používáte pohled do očí, naše oči se před dokončením akce potvrzení posunou dál. U jednoduchého klepnutí ve Vzduchu to není problém, ale při kombinování dlouhých hlasových příkazů s rychlými pohyby očí se stává důležitějším. Jedním ze způsobem, jak tento scénář zvládnout, je provést další volání SpatialPointerPose::TryGetAtTimestamps využitím historického časového razítka, které odpovídá vstupní události.

Pro vstup, který směruje přes SpatialInteractionManager, je však k dispozici jednodušší metoda. SpatialInteractionSourceState má svou vlastní funkci TryGetAtTimestamp. Voláním této metody zajistíte dokonale korelovanou aplikaci SpatialPointerPose bez odhadu. Další informace o práci s spatialInteractionSourceStates najdete v dokumentaci k rozhraní DirectX pro ruce a ovladače pohybu.


Kalibrace

Aby sledování očí fungovalo přesně, musí každý uživatel projít návodem uživatele,který sleduje zrak. Díky tomu může zařízení přizpůsobit systém pro pohodlnější a kvalitnější zobrazení pro uživatele a současně zajistit přesné sledování očí. Vývojáři nemusí ke správě uživatelského doplňku nic dělat. Systém zajistí, že se uživateli zobrazí výzva ke zkalibrování zařízení za následujících okolností:

  • Uživatel používá zařízení poprvé.
  • Uživatel se dříve odhlásit z procesu zpracování
  • Proces zpracování nebyl úspěšný při posledním použití zařízení uživatelem.

Vývojáři by měli zajistit odpovídající podporu pro uživatele, kteří nemusí mít k dispozici data sledování očí. Další informace o tom, co je třeba vzít v úvahu při použití záložních řešení, najdete v HoloLens 2.


Viz také

Poznámka

Tento článek se týká starších nativních rozhraní API WinRT. Pro nové projekty nativních aplikací doporučujeme použít rozhraní OPENXR API.

V Windows Mixed Reality se k určení, na co se uživatel dívá, používá vstup pohledu do očí a hlavy. Data můžete použít k řízení primárních vstupních modelů, jako je pohled na hlavy a potvrzení,a poskytnout kontext pro různé typy interakcí. Prostřednictvím rozhraní API jsou k dispozici dva typy vektorů pohledu: pohled do hlavy a pohled do očí. Obě jsou k dispozici jako trojrozměrný paprsk s původem a směrem. Aplikace se pak mohou prosměrovat do jejich scény nebo do reálného světa a určit, na co uživatel cílí.

Pohled na hlavy představuje směr, na který je nasměrováná hlavička uživatele. Pohled na hlavy si můžete pomyslet jako na pozici a směr dopředu samotného zařízení s pozicí jako středový bod mezi oběma zobrazeními. Pohled je k dispozici na všech Mixed Reality zařízeních.

Pohled představuje směr, kterým se dívá pohled uživatele. Počátek se nachází mezi pohledy uživatele. Je k dispozici na Mixed Reality zařízeních, která obsahují systém sledování očí.

Paprsky hlavy i pohledu jsou přístupné prostřednictvím rozhraní SPATIALPointerPose API. Zavoláním spatialPointerPose::TryGetAtTimestamp získáte nový objekt SpatialPointerPose v zadaném časovém razítku a souřadnicovém systému. Tato aplikace SpatialPointerPose obsahuje počátek a směr pohledu hlavy. Pokud je sledování oka k dispozici, obsahuje také původ a směr pohledu.

Podpora zařízení