Baş-Gaze ve göz uyumlu girişi DirectX 'te

Özellik HoloLens (1. genel) HoloLens 2 Modern kulaklıklar
Baş-Gaze ✔️ ✔️ ✔️
Göz-Gaze ✔️

Baş-Gaze kullanma

Baş-Gaze 'a erişmek için, yeni bir Spatialpointerpoz nesnesi almak üzere spatialpointerpoz:: TryGetAtTimestamp çağırarak başlayın. Aşağıdaki parametreleri geçirin.

  • Baş-Gaze için istediğiniz koordinat sistemini temsil eden bir Spatialkoordinatkoordinatör Tesystem . Bu, aşağıdaki kodda Koordinatör Tesystem değişkeniyle temsil edilir. Daha fazla bilgi için koordinat sistemleri geliştirici kılavuzumuzu ziyaret edin.
  • İstenen baş pozın tam süresini temsil eden zaman damgası . Genellikle, geçerli karenin görüntüleneceği zamana karşılık gelen bir zaman damgası kullanacaksınız. Bu tahmini ekran zaman damgasını, geçerli Holographicframearacılığıyla erişilebilen bir Holographicframetahmin nesnesinden alabilirsiniz. Bu Holographicframetahmine nesnesi aşağıdaki koddaki tahmin değişkeni tarafından temsil edilir.

Geçerli bir Spatialpointertisten sonra, baş konuma ve ileri yönüne özellikler olarak erişilebilir. Aşağıdaki kod, bunlara nasıl erişdeğiştirileceğini gösterir.

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
}

Göz-Gaze kullanma

Kullanıcılarınızın göz önünde bulunan girişi kullanabilmesi için, her kullanıcının cihazı ilk kez kullandıklarında bir gözle izleme Kullanıcı ayarlaması olması gerekir. Göz sızması API 'SI baş-Gaze ile benzerdir. Bu, sahneye göre raya dönüştürmek için bir Ray Origin ve Direction sağlayan aynı Spatialpointerpoz API 'sini kullanır. Tek fark, kullanmadan önce gözle değişiklik izlemeyi açıkça etkinleştirmeniz gerekir:

  1. Uygulamanızda göz izlemeyi kullanmak için Kullanıcı izni isteyin.
  2. Paket bildiriminizde "girişi Gaze" özelliğini etkinleştirin.

Göz-Gaze girişi erişimi isteniyor

Uygulamanız başlatıldığında, göz izlemeye erişim istemek için Eyespoz:: RequestAccessAsync ' i çağırın. Sistem gerekirse kullanıcıdan istemde bulunur ve erişim verildiğinde GazeInputAccessStatus:: Allowed döndürür. Bu zaman uyumsuz bir çağrıdır, bu nedenle çok fazla yönetim gerektirir. Aşağıdaki örnek, m_isEyeTrackingEnabledadlı bir üye değişkenine depolayan, sonucu beklemek için ayrılmış bir std:: Thread öğesi döner.

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();

Ayrılmış bir iş parçacığının başlatılması, zaman uyumsuz çağrıları işlemek için yalnızca bir seçenektir. C++/Winrtrtx tarafından desteklenen yeni co_await işlevselliğini de kullanabilirsiniz. Kullanıcı izni isteyen başka bir örnek aşağıda verilmiştir:

  • Eyespoz:: IsSupported (), uygulamanın yalnızca bir gözle izleyici olduğunda izin iletişim kutusunu tetiklemesine izin verir.
  • GazeInputAccessStatus m_gazeInputAccessStatus; Bu, izin isteminin yeniden başlatılmasını ve tekrar çalıştırılmasını önlemektir.
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;	
		}
	});
}

Gaze giriş özelliğini bildirme

Çözüm Gezgini' de appxmanifest dosyasına çift tıklayın. Ardından yetenekler bölümüne gidin ve daha sonra giriş özelliğini denetleyin.

Giriş özelliğini Gaze etme

Bu, appxmanifest dosyasındaki Package bölümüne aşağıdaki satırları ekler:

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

Göz-Gaze Ray 'i alma

ET 'e erişim aldıktan sonra, her karede göz kataze ışını elde edebilirsiniz. Baş Gaze sayesinde, istenen zaman damgası ve koordinat sistemi ile spatialpointerpoz:: TryGetAtTimestamp çağırarak spatialpointerpozu alın. Spatialpointerpoz, gözler özelliği aracılığıyla bir eyespoz nesnesi içeriyor. Bu, yalnızca göz izleme etkinse null olmayan bir değer değildir. Buradan, bu cihazdaki kullanıcının Eyespoz:: ısayarlaması Rationvalid' i çağırarak bir göz izleme ayarı olup olmadığını kontrol edebilirsiniz. Ardından, gözlük konumunu ve yönünü içeren Spatialray 'ı almak Için Gaze özelliğini kullanın. Gaze özelliği bazen null olabilir, bu nedenle bunu kontrol ettiğinizden emin olun. Bu durum, kalibre edilmiş bir Kullanıcı gözlerinizin geçici olarak kapanmasından kaynaklanabilir.

Aşağıdaki kod, göz-Gaze ışın nasıl erişebileceğini gösterir.

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

Göz izleme kullanılamadığında geri dönüş

Göz izleme tasarımbelgelerimizde bahsedildiği gibi, her iki tasarımcı ve geliştirici, göz izleme verilerinin kullanılamadığı örneklerden haberdar olmalıdır.

Verilerin kullanılamaz olmasının çeşitli nedenleri vardır:

  • Bir Kullanıcı kalibre edilmez
  • Kullanıcı uygulamanın göz izleme verilerine yönelik erişimi reddetti
  • HoloLens vizörü veya ince kullanıcı gözetleri gibi geçici çağrıdaki.

Bu belgede bazı API 'lerden bazıları zaten bahsedilirken, aşağıda yer alan göz izlemenin hızlı bir başvuru olarak kullanılabilir olduğunu algılamamız için bir Özet sağlıyoruz:

Ayrıca, alınan göz izleme veri güncelleştirmeleri arasında bir zaman aşımı ekleyerek göz izleme verilerinizin eski olup olmadığını denetlemek ve aksi takdirde aşağıda anlatıldığı gibi baş-Gaze 'a geri dönüş yapmak isteyebilirsiniz. Daha fazla bilgi için geri dönüş tasarımına göz önüne gidin.


Diğer girişlerle Gaze ile ilişkilendirme

Bazen, geçmişte bir olaya karşılık gelen bir Spatialpointerpoz gerektiğini fark edebilirsiniz. Örneğin, Kullanıcı bir AIR 'e dokunduğunda, uygulamanız ne olduğunu bilir. Bu amaçla, sistem girdisi işleme ve görüntüleme süresi arasındaki gecikme nedeniyle, tahmin edilen çerçeve süresi ile Spatialpointerpoz:: TryGetAtTimestamp kullanılması yeterli olacaktır. Ayrıca, hedefleme için göz-Gaze kullanılıyorsa, gözler bir işleme eylemi bitmeden önce bile hareket etmektedir. Bu, basit bir uçak dokunda daha küçüktür, ancak uzun sesli komutları hızlı göz taşımaları ile birleştirirken daha kritik hale gelir. Bu senaryoyu işlemenin bir yolu,, giriş olayına karşılık gelen bir geçmiş zaman damgası kullanarak Spatialpointerpoz:: TryGetAtTimestampöğesine ek bir çağrı yapmak kullanmaktır.

Ancak, Spatialınteractionmanager aracılığıyla yönlendiren giriş için daha kolay bir yöntem vardır. Spatialınteractionsourcestate kendi Trygetattimestamp işlevine sahiptir. Bunu çağırmak, guesswork olmadan kusursuz bir şekilde bağıntılı bir Spatialpointerpoz sağlar. Spatialınteractionsourcestates ile çalışma hakkında daha fazla bilgi için DirectX belgelerindeki uygulamalı ve hareket denetleyicilerine göz atın.


Ayarları

Göz izlemenin doğru çalışması için, her kullanıcının bir göz izleme Kullanıcı ayarıyapması gerekir. Bu, cihazın kullanıcıya daha rahat ve daha yüksek kaliteli bir görüntüleme deneyimi sunmak ve aynı anda doğru gözle izlenmesini sağlamak için sistemi ayarlamasına olanak tanır. Geliştiricilerin Kullanıcı ayarlamasını yönetmek için sonunda herhangi bir şey yapması gerekmez. Sistem, kullanıcıdan cihazı aşağıdaki koşullarda ayarlama isteminde bulunmasını sağlar:

  • Kullanıcı cihazı ilk kez kullanıyor
  • Kullanıcı daha önce ayarlama sürecini kabul etmedi
  • Ayarlama işlemi, kullanıcının cihazı son kullandığı anda başarılı olmadı

Geliştiriciler, göz izleme verilerinin kullanılamadığı kullanıcılar için yeterli destek sağlamamasını sağlamalıdır. HoloLens 2 ' de göz izlemedekigeri dönüş çözümleri hakkında konular hakkında daha fazla bilgi edinin.


Ayrıca bkz.

Not

Bu makale, eski WinRT Native API 'Lerle ilgilidir. Yeni yerel uygulama projeleri için Openxr API'sini kullanmanızı öneririz.

Windows Mixed Reality, göz at ve kafa gaze girişi, kullanıcının ne olduğunu belirlemek için kullanılır. Verileri, Head-Gaze ve COMMITgibi birincil giriş modellerini ve farklı etkileşim türleri için bağlam sağlamak üzere kullanabilirsiniz. API aracılığıyla kullanılabilen iki tür Gaze vektörü vardır: baş Gaze ve göz-Gaze. Her ikisi de bir Origin ve Direction ile üç boyutlu bir ışın olarak sağlanır. Uygulamalar daha sonra sahneleri veya gerçek dünyaya dönüştürmek ve kullanıcının neleri hedefleyeceğini tespit edebilir.

Baş-Gaze , Kullanıcı kafasının işaret ettiği yönü temsil eder. İki ekran arasında orta nokta olarak konum ile cihazın kendisinin konumu ve iletme yönü olarak kafa önünde bulundurun. Baş-Gaze tüm karma gerçeklik cihazlarında kullanılabilir.

Göz-Gaze , Kullanıcı gözlerinizin doğru olduğu yönü temsil eder. Kaynak, kullanıcının gözleri arasında bulunur. Göz izleme sistemi içeren karma gerçeklik cihazlarında kullanılabilir.

Hem baş hem de gözlük ışınlar, Spatialpointerpoz API 'si aracılığıyla erişilebilir. Belirtilen zaman damgasında ve koordinat sistemindeyeni bir spatialpointerpoz nesnesi almak Için Spatialpointerpoz:: TryGetAtTimestamp öğesini çağırın. Bu Spatialpointerpozu bir baş-Gaze kaynağı ve yönü içeriyor. Ayrıca, göz izleme kullanılabiliyorsa göz önünde bir başlangıç kaynağı ve yönü de içerir.

Cihaz desteği