Denetleyiciler, işaretçiler ve odak — MRTK2
Denetleyiciler, işaretçiler ve odak, çekirdek giriş sistemi tarafından oluşturulan temeli temel alan üst düzey kavramlardır. Birlikte, sahnedeki nesnelerle etkileşim kurma mekanizmasının büyük bir bölümünü sağlarlar.
Denetleyiciler
Denetleyiciler, fiziksel denetleyicinin (6 serbestlik derecesi, eklemli el vb.) temsilleridir. Cihaz yöneticileri tarafından oluşturulur ve ilgili temel sistemle iletişim kurmak ve bu verileri MRTK şeklindeki veriler ve olaylara çevirmekle sorumludur.a
Örneğin, Windows Mixed Reality platformunda, elin eklemleri, WindowsMixedRealityArticulatedHand
pozu ve diğer özellikleri hakkında bilgi almak için temel alınan Windows el izleme API'leriyle birlikte çalışmaktan sorumlu bir denetleyicidir. Bu verileri ilgili MRTK olaylarına dönüştürmek (örneğin, RaisePoseInputChanged veya RaiseHandJointsUpdated çağrısı yaparak) ve sorgularının doğru verileri döndürmesi için TryGetJointPose
kendi iç durumunu güncelleştirerek sorumludur.
Genellikle bir denetleyicinin yaşam döngüsü şunları içerir:
Yeni bir kaynak algılanması üzerine bir cihaz yöneticisi tarafından bir denetleyici oluşturulur (örneğin, cihaz yöneticisi bir eli algılar ve izlemeye başlar).
Denetleyicinin Update() döngüsünde, temel alınan API sistemine çağrır.
Aynı güncelleştirme döngüsünde, giriş olayı değişikliklerini doğrudan çekirdek giriş sisteminin kendisine (örneğin HandMeshUpdated veya HandJointsUpdated) çağırarak tetikler.
İşaretçiler ve odak
İşaretçiler, oyun nesneleriyle etkileşime geçmek için kullanılır. Bu bölümde işaretçilerin nasıl oluşturulduğu, nasıl güncelleştirildikleri ve odaktaki nesneleri nasıl belirledikleri açıklanmaktadır. Ayrıca, var olan farklı işaretçi türlerini ve bunların etkin olduğu senaryoları da kapsar.
İşaretçi kategorileri
İşaretçiler genellikle aşağıdaki kategorilerden birine girer:
Uzak işaretçiler
Bu tür işaretçiler, kullanıcıdan uzak olan nesnelerle etkileşime geçmek için kullanılır ("yakın değil" olarak tanımlanır). Bu tür işaretçiler genellikle dünyaya çok uzaklara gidebilen ve kullanıcının hemen yanında olmayan nesnelerle etkileşim kurmasına ve bunları işlemesine olanak sağlayan çizgiler oluşturur.
İşaretçilerin yakınında
Bu tür işaretçiler, kullanıcıya yeterince yakın olan nesnelerle etkileşim kurmak, dokunmak ve işlemek için kullanılır. Genellikle, bu tür işaretçiler yakındaki nesneleri arayarak nesnelerle etkileşim kurar (küçük mesafelerde raycasting yaparak, yakınlardaki nesneleri aramak için küresel atama yaparak veya yakalanabilir/dokunılabilir olarak kabul edilen nesne listelerini listeleyerek).
ışınlayıcı işaretçileri
Bu tür işaretçiler, kullanıcıyı işaretçi tarafından hedeflenen konuma taşımayı işlemek için ışınlanma sistemine takılır.
İşaretçi aracılığı
Tek bir denetleyici birden çok işaretçiye sahip olabileceğinden (örneğin, eklemli elin hem yakın hem de uzak etkileşim işaretçileri olabilir), hangi işaretçinin etkin olması gerektiğinin aracılık edilmesinden sorumlu bir bileşen vardır.
Örneğin, kullanıcının eli basılabilir bir düğmeye yaklaştığında ShellHandRayPointer
, gösterilmeyi durdurmalı ve PokePointer
bu düğmenin devreye alınması gerekir.
Bu, tüm işaretçilerin durumuna bağlı olarak hangi işaretçilerin etkin olduğunu belirlemekle sorumlu olan tarafından işlenir DefaultPointerMediator
. Bunun yaptığı önemli şeylerden biri, yakın bir işaretçi bir nesneye yakın olduğunda uzak işaretçileri devre dışı bırakmaktır (lütfen bkz DefaultPointerMediator
. ).
İşaretçi profilindeki özelliğini değiştirerek işaretçi aracısının PointerMediator
alternatif bir uygulamasını sağlamak mümkündür.
İşaretçileri devre dışı bırakma
İşaretçi aracı her kareyi çalıştırdığından, tüm işaretçilerin etkin/etkin olmayan durumunu denetler. Bu nedenle, kodda bir işaretçinin IsInteractionEnabled özelliğini ayarlarsanız, işaretçi aracı tarafından her karenin üzerine yazılır. Bunun yerine işaretçilerin kendi kendinize açık mı yoksa kapalı mı olacağını denetlemek için öğesini belirtebilirsiniz PointerBehavior
. Bunun yalnızca varsayılan FocusProvider
ve DefaultPointerMediator
MRTK'de kullanıyorsanız işe yarayacağını unutmayın.
Örnek: MRTK'da el ışınlarını devre dışı bırakma
Aşağıdaki kod MRTK'daki el ışınlarını kapatır:
// Turn off all hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);
// Turn off hand rays for the right hand only
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);
Aşağıdaki kod el ışınlarını MRTK'daki varsayılan davranışlarına döndürür:
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);
Aşağıdaki kod, yakalanabilir bir ışına yakın olup olmadığına bakılmaksızın el ışınlarını açık olmaya zorlar:
// Turn off all hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOn);
Daha fazla örnek için bkz PointerUtils
. ve TurnPointersOnOff
.
FocusProvider
FocusProvider
, tüm işaretçiler listesi üzerinde yinelemeden ve her işaretçi için odaklanmış nesnenin ne olduğunu bulmaktan sorumlu olan çalışma atıdır.
Her Update()
çağrıda şunları yapacaktır:
İşaretçinin kendisi tarafından yapılandırılan şekilde ışın yayınlayarak ve isabet algılama yaparak tüm işaretçileri güncelleştirin (örneğin, küre işaretçisi SphereOverlap raycastMode'yi belirtebilir, bu nedenle FocusProvider küre tabanlı bir çakışma yapar)
Odaklanmış nesneyi işaretçi başına temelinde güncelleştirin (örneğin, bir nesne odak kazandıysa, bu nesneye yönelik olayları da tetikler, bir nesne odağı kaybederse, odağın kaybolmasını vb. tetikler).
İşaretçi yapılandırması ve yaşam döngüsü
İşaretçiler, giriş sistemi profilinin İşaretçiler bölümünde yapılandırılabilir.
bir işaretçinin ömrü genellikle aşağıdaki gibidir:
Cihaz yöneticisi bir denetleyicinin varlığını algılar. Bu cihaz yöneticisi daha sonra bir çağrısı
RequestPointers
aracılığıyla denetleyiciyle ilişkili işaretçi kümesini oluşturur.FocusProvider, Update() döngüsünde tüm geçerli işaretçileri yineler ve ilişkili raycast veya isabet algılama mantığını yapar. Bu, belirli işaretçiler tarafından odaklanan nesneyi belirlemek için kullanılır.
- Aynı anda birden çok giriş kaynağının (örneğin, iki el etkin) etkin olması mümkün olduğundan, aynı anda odaklanmış birden çok nesneye sahip olmak da mümkündür.
Cihaz yöneticisi, bir denetleyici kaynağının kaybolduğunu keşfettikten sonra kayıp denetleyiciyle ilişkili işaretçileri yerle bir eder.