Unity'de hareket denetleyicileri
Unity'de bakışlarınız üzerinde harekete geçmenin iki önemli yolu vardır: HoloLens ve Tam Ekran HMD'de el hareketleri ve hareket denetleyicileri. Unity'de aynı API'ler aracılığıyla her iki uzamsal giriş kaynağının verilerine erişebilirsiniz.
Unity, Windows Karma Gerçeklik için uzamsal giriş verilerine erişmek için iki birincil yol sağlar. Ortak Input.GetButton/Input.GetAxis API'leri birden çok Unity XR SDK'sı üzerinde çalışırken, Windows Karma Gerçeklik'a özgü InteractionManager/GestureRecognizer API'si tüm uzamsal giriş verilerini kullanıma sunar.
Unity XR giriş API'leri
Yeni projeler için yeni XR giriş API'lerini baştan kullanmanızı öneririz.
XR API'leri hakkında daha fazla bilgiyi burada bulabilirsiniz.
Unity düğmesi/eksen eşleme tablosu
Unity'nin Windows Karma Gerçeklik hareket denetleyicileri için Input Manager, Input.GetButton/GetAxis API'leri aracılığıyla aşağıda listelenen düğme ve eksen kimliklerini destekler. "Windows MR'a özgü" sütunu, InteractionSourceState türü dışında kullanılabilen özellikleri ifade eder. Bu API'lerin her biri aşağıdaki bölümlerde ayrıntılı olarak açıklanmıştır.
Windows Karma Gerçeklik için düğme/eksen kimliği eşlemeleri genellikle Oculus düğmesi/eksen kimlikleriyle eşleşmektedir.
Windows Karma Gerçeklik için düğme/eksen kimliği eşlemeleri OpenVR eşlemelerinden iki şekilde farklıdır:
- Eşleme, hem parmak çubukları hem de dokunmatik yüzeyleri olan denetleyicileri desteklemek için parmak çubuğundan farklı dokunmatik yüzey kimliklerini kullanır.
- Eşleme, fiziksel ABXY düğmeleri için kullanılabilir durumda bırakmak üzere Menü düğmeleri için A ve X düğme kimliklerinin aşırı yüklenmesini önler.
Girdi | Ortak Unity API'leri (Input.GetButton/GetAxis) | Windows MR'a özgü Giriş API'si (XR. WSA. Giriş) |
|
---|---|---|---|
Sol el | Sağ el | ||
Basılan tetikleyiciyi seçin | Eksen 9 = 1,0 | Eksen 10 = 1,0 | selectPressed |
Tetikleyici analog değerini seçin | Eksen 9 | Eksen 10 | selectPressedAmount |
Tetikleyiciyi kısmen basılmış olarak seçme | Düğme 14 (oyun yüzeyi uyumluluğu) | Düğme 15 (oyun çubuğu uyumluluğu) | selectPressedAmount > 0.0 |
Menü düğmesine basıldı | Düğme 6* | Düğme 7* | menuPressed |
Kavrama düğmesine basıldı | Eksen 11 = 1,0 (analog değer yok) Düğme 4 (oyun çubuğu uyumluluğu) | Eksen 12 = 1,0 (analog değer yok) Düğme 5 (oyun çubuğu uyumluluğu) | Kavradı |
Parmak çubuğu X (sol: -1.0, sağ: 1.0) | Eksen 1 | Eksen 4 | thumbstickPosition.x |
Parmak çubuğu Y (üst: -1.0, alt: 1.0) | Eksen 2 | Eksen 5 | thumbstickPosition.y |
Parmak çubuğuna basıldı | Düğme 8 | Düğme 9 | thumbstickPressed |
Dokunmatik Yüzey X (sol: -1.0, sağ: 1.0) | Eksen 17* | Eksen 19* | touchpadPosition.x |
Dokunmatik yüzey Y (üst: -1.0, alt: 1.0) | Eksen 18* | Eksen 20* | dokunmatik yüzeyPosition.y |
Dokunulan dokunmatik yüzey | Düğme 18* | Düğme 19* | dokunmatik yüzeyTouched |
Dokunmatik yüzeye basıldı | Düğme 16* | Düğme 17* | dokunmatik yüzeyPressed |
6DoF kavrama pozu veya işaretçi pozu | Sadece kavrama pozu: XR. InputTracking.GetLocalPosition XR. InputTracking.GetLocalRotation | Kavrama veya İşaretçiyi bağımsız değişken olarak geçirme: sourceState.sourcePose.TryGetPosition sourceState.sourcePose.TryGetRotation |
|
İzleme durumu | Konum doğruluğu ve kaynak kaybı riski yalnızca MR'a özgü API aracılığıyla kullanılabilir | sourceState.sourcePose.positionAccuracy sourceState.properties.sourceLossRisk |
Not
Bu düğme/eksen kimlikleri, Unity'nin OpenVR için kullandığı kimliklerden, oyunpad'ler, Oculus Touch ve OpenVR tarafından kullanılan eşlemelerdeki çakışmalardan dolayı farklıdır.
OpenXR
Unity'de karma gerçeklik etkileşimleri hakkında temel bilgileri öğrenmek için Unity XR Girişi için Unity El Kitabı'nı ziyaret edin. Bu Unity belgelerinde denetleyiciye özgü girişlerden daha genelleştirilebilir InputFeatureUsage'larayapılan eşlemeler, kullanılabilir XR girişlerinin nasıl tanımlanıp kategorilere ayrılması, bu girişlerdeki verilerin nasıl okunacağı ve daha fazlası ele alınmaktadır.
Karma Gerçeklik OpenXR Eklentisi, aşağıda açıklandığı gibi standart InputFeatureUsageile eşlenmiş ek giriş etkileşim profilleri sağlar:
InputFeatureUsage | HP Reverb G2 Denetleyicisi (OpenXR) | HoloLens Hand (OpenXR) |
---|---|---|
primary2DAxis | Bilgisayar oyunları | |
primary2DAxisClick | Oyun çubuğu - Tıklayın | |
tetiklemek | Tetikle | |
Kavrama | Kavrama | Hava musluğu veya sıkma |
primaryButton | [X/A] - Basın | Hava musluğu |
secondaryButton | [Y/B] - Basın | |
gripButton | Kavrama - Basma | |
triggerButton | Tetikleyici - Basma | |
menuButton | Menü |
Kavrama pozu ile işaret eden poz karşılaştırması
Windows Karma Gerçeklik çeşitli form faktörlerinde hareket denetleyicilerini destekler. Her denetleyicinin tasarımı, kullanıcının el konumuyla uygulamaların denetleyiciyi görüntülerken işaret etmek için kullanması gereken doğal "ileri" yön arasındaki ilişkide farklılık gösterir.
Bu denetleyicileri daha iyi temsil etmek için, her etkileşim kaynağı için araştırabileceğiniz iki tür poz vardır: kavrama pozu ve işaretçi pozu. Hem kavrama pozu hem de işaretçi poz koordinatları, küresel Unity dünya koordinatlarındaki tüm Unity API'leri tarafından ifade edilir.
Kavrama pozu
Kavrama pozu , HoloLens tarafından algılanan veya hareket denetleyicisi tutan kullanıcıların avucunun konumunu temsil eder.
Çevreleyici kulaklıklarda kavrama pozu, kullanıcının elini veya kullanıcının elinde tutulan bir nesneyi işlemek için en iyi şekilde kullanılır. Kavrama pozu, hareket denetleyicisini görselleştirirken de kullanılır. Bir hareket denetleyicisi için Windows tarafından sağlanan işlenebilir model , dönüş çıkış noktası ve merkezi olarak kavrama pozunu kullanır.
Kavrama pozu özellikle aşağıdaki gibi tanımlanır:
- Kavrama konumu: Kumandayı doğal olarak tutarken palmiye merkezi, kavramanın içindeki konumu ortalamak için sola veya sağa ayarlanmıştır. Windows Karma Gerçeklik hareket denetleyicisinde bu konum genellikle Kavra düğmesiyle hizalanır.
- Kavrama yönünün Sağ ekseni: Düz bir 5 parmaklı poz oluşturmak için elinizi tamamen açtığınızda, avuç içinize normal olan ışın (sol avuçtan ileri, sağ avuçtan geriye doğru)
- Kavrama yönünün İleri ekseni: Elinizi kısmen kapattığınızda (kumandayı tutuyormuş gibi), parmaksız parmaklarınızın oluşturduğu tüpten "ileri" işaret eden ışın.
- Kavrama yönünün Yukarı ekseni: Sağ ve İleri tanımları tarafından ima edilen Yukarı ekseni.
Kavrama pozuna Unity'nin satıcılar arası giriş API'si (XR) aracılığıyla erişebilirsiniz. InputTracking. GetLocalPosition/Rotation) veya Windows MR'a özgü API aracılığıyla (sourceState.sourcePose.TryGetPosition/Rotation, Grip düğümü için poz verileri isteme).
İşaretçi pozu
İşaretçi pozu , denetleyicinin ileriyi gösteren ucunu temsil eder.
Sistem tarafından sağlanan işaretçi pozu, denetleyici modelinin kendisini oluştururken raycast için en iyi şekilde kullanılır. Denetleyicinin yerine sanal silah gibi başka bir sanal nesne işiyorsanız, uygulama tanımlı silah modelinin namlusu boyunca hareket eden bir ışın gibi bu sanal nesne için en doğal olan bir ışınla işaret etmelisiniz. Kullanıcılar fiziksel denetleyiciyi değil sanal nesneyi görebildiğinden, sanal nesneyle işaret etme büyük olasılıkla uygulamanızı kullananlar için daha doğal olacaktır.
Şu anda, işaretçi pozu Unity'de yalnızca Windows MR'a özgü API olan sourceState.sourcePose.TryGetPosition/Rotation aracılığıyla kullanılabilir ve bağımsız değişken olarak InteractionSourceNode.Pointer geçirilir.
OpenXR
OpenXR giriş etkileşimleri aracılığıyla iki poz kümesine erişebilirsiniz:
- Kavrama, eldeki nesneleri işlemek için poz verir
- Amaç, dünyaya işaret etme amaçlıdır.
Bu tasarım ve iki poz arasındaki farklar hakkında daha fazla bilgi OpenXR Belirtimi - Giriş Alt Yolları'nda bulunabilir.
InputFeatureUsages DevicePosition, DeviceRotation, DeviceVelocity ve DeviceAngularVelocity tarafından sağlanan pozların tümü OpenXR kavrama pozunu temsil eder. Kavrama pozlarıyla ilgili InputFeatureUsages, Unity'nin CommonUsage'larında tanımlanır.
InputFeatureUsages PointerPosition, PointerRotation, PointerVelocity ve PointerAngularVelocity tarafından sağlanan pozların tümü OpenXR hedef pozunu temsil eder. Bu InputFeatureUsage'lar dahil edilen C# dosyalarında tanımlanmadığından, kendi InputFeatureUsage'larınızı aşağıdaki gibi tanımlamanız gerekir:
public static readonly InputFeatureUsage<Vector3> PointerPosition = new InputFeatureUsage<Vector3>("PointerPosition");
Haptics
Unity'nin XR Giriş sisteminde haptics kullanma hakkında bilgi için belgeler Unity XR Girişi için Unity El Kitabı - Haptics sayfasında bulunabilir.
Denetleyici izleme durumu
Mikrofonlu kulaklıklar gibi Windows Karma Gerçeklik hareket denetleyicisi de harici izleme algılayıcısı kurulumu gerektirmez. Bunun yerine, kumandalar kulaklıktaki algılayıcılar tarafından izlenir.
Kullanıcı denetleyicileri mikrofonlu kulaklığın görüş alanından çıkarırsa, Windows çoğu durumda denetleyici konumlarını çıkarsamaya devam eder. Denetleyici yeterince uzun süre görsel izlemeyi kaybettiğinde, denetleyicinin konumları yaklaşık doğruluk konumlarına düşer.
Bu noktada sistem, denetleyiciyi kullanıcıya gövdeden kilitler ve hareket ederken kullanıcının konumunu izler ve iç yönlendirme algılayıcılarını kullanarak denetleyicinin gerçek yönlendirmesini ortaya çıkarır. Kullanıcı arabirimi öğelerini işaret etmek ve etkinleştirmek için denetleyiciler kullanan birçok uygulama, kullanıcı fark etmeden yaklaşık doğrulukta normal şekilde çalışabilir.
Durumu açıkça izleme hakkında mantık yürütme
Konumları izleme durumuna göre farklı şekilde işlemek isteyen uygulamalar daha ileri gidebilir ve SourceLossRisk ve PositionAccuracy gibi denetleyicinin durumundaki özellikleri inceler:
İzleme durumu | SourceLossRisk | PositionAccuracy | TryGetPosition |
---|---|---|---|
Yüksek doğruluk | < 1.0 | Yüksek | true |
Yüksek doğruluk (kaybetme riski altında) | == 1,0 | Yüksek | true |
Yaklaşık doğruluk | == 1,0 | Yaklaşmak | true |
Konum yok | == 1,0 | Yaklaşmak | yanlış |
Bu hareket denetleyicisi izleme durumları aşağıdaki gibi tanımlanır:
- Yüksek doğruluk: Hareket denetleyicisi mikrofonlu kulaklığın görüş alanı içinde olsa da genellikle görsel izleme temelinde yüksek doğruluklu konumlar sağlar. Bir an için görüş alanından ayrılan veya mikrofonlu kulaklık algılayıcılarından (örneğin kullanıcının diğer eliyle) gizlenen hareketli bir denetleyici, denetleyicinin kendisinin atayıcı izlemesine bağlı olarak kısa bir süre için yüksek doğruluklu pozlar döndürmeye devam eder.
- Yüksek doğruluk (kaybetme riski altında): Kullanıcı hareket denetleyicisini mikrofonlu kulaklığın görüş alanının kenarından geçtiğinde, mikrofonlu kulaklık kısa süre içinde denetleyicinin konumunu görsel olarak izleyemeyecektir. Uygulama, SourceLossRisk değerinin 1.0'a ulaştığını görerek denetleyicinin bu FOV sınırına ne zaman ulaştığını bilir. Bu noktada uygulama, sabit bir yüksek kaliteli poz akışı gerektiren denetleyici hareketlerini duraklatmayı seçebilir.
- Yaklaşık doğruluk: Denetleyici yeterince uzun süre görsel izlemeyi kaybettiğinde, denetleyicinin konumları yaklaşık doğruluk konumlarına düşer. Bu noktada sistem, denetleyiciyi kullanıcıya gövdeden kilitler ve hareket ederken kullanıcının konumunu izler ve iç yönlendirme algılayıcılarını kullanarak denetleyicinin gerçek yönlendirmesini ortaya çıkarır. Kullanıcı arabirimi öğelerini işaret etmek ve etkinleştirmek için denetleyiciler kullanan birçok uygulama, kullanıcı fark etmeden yaklaşık doğrulukta normal şekilde çalışabilir. Daha ağır giriş gereksinimlerine sahip uygulamalar, Bu süre boyunca kullanıcıya ekran dışı hedeflerde daha cömert bir hitbox vermek gibi PositionAccuracy özelliğini inceleyerek Yüksek doğruluktan Yaklaşık doğruluk'a bu düşüşü algılamayı seçebilir.
- Konum yok: Denetleyici uzun süre yaklaşık doğrulukta çalışabildiğinden, bazen sistem gövde kilitli bir konumun bile şu anda anlamlı olmadığını bilir. Örneğin, açık olan bir denetleyici hiçbir zaman görsel olarak gözlemlenmemiş olabilir veya bir kullanıcı daha sonra başka biri tarafından alınan bir denetleyiciyi devre dışı bırakabilir. Bu zamanlarda sistem uygulamaya herhangi bir konum sağlamaz ve TryGetPosition false değerini döndürür.
Ortak Unity API'leri (Input.GetButton/GetAxis)
Ad Alanı: UnityEngine, UnityEngine.XR
Türler: Giriş, XR. InputTracking
Unity şu anda genel Input.GetButton/Input.GetAxis API'lerini kullanarak eller ve hareket denetleyicileri dahil olmak üzere Oculus SDK, OpenVR SDK ve Windows Karma Gerçeklik girişlerini kullanıma sunar. Uygulamanız giriş için bu API'leri kullanıyorsa, Windows Karma Gerçeklik dahil olmak üzere birden çok XR SDK'da hareket denetleyicilerini kolayca destekleyebilir.
Mantıksal düğmenin basılı durumunu alma
Genel Unity giriş API'lerini kullanmak için, genellikle düğmeleri ve eksenleri Unity Giriş Yöneticisi'ndeki mantıksal adlara bağlayarak başlarsınız ve her ada bir düğme veya eksen kimlikleri bağlarsınız. Daha sonra bu mantıksal düğmeye/eksen adına başvuran kod yazabilirsiniz.
Örneğin, sol hareket denetleyicisinin tetikleyici düğmesini Gönder eylemiyle eşlemek için Unity'de Proje Ayarları > Girişini Düzenle'ye > gidin ve Eksenler altındaki Gönder bölümünün özelliklerini genişletin. 14. oyun çubuğu düğmesini okumak için Pozitif Düğme veya Alternatif Pozitif Düğme özelliğini değiştirin:
Unity InputManager
Betiğiniz daha sonra Input.GetButton kullanarak Gönder eylemini denetleyebiliyor:
if (Input.GetButton("Submit"))
{
// ...
}
Eksenler altındaki Boyut özelliğini değiştirerek daha fazla mantıksal düğme ekleyebilirsiniz.
Fiziksel düğmenin basılı durumunu doğrudan alma
Ayrıca Input.GetKey kullanarak düğmelere tam adlarıyla el ile de erişebilirsiniz:
if (Input.GetKey("joystick button 8"))
{
// ...
}
El veya hareket denetleyicisinin pozunu alma
XR kullanarak denetleyicinin konumuna ve döndürmesine erişebilirsiniz. InputTracking:
Vector3 leftPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
Quaternion leftRotation = InputTracking.GetLocalRotation(XRNode.LeftHand);
Not
Yukarıdaki kod, denetleyicinin kavrama pozunu (kullanıcının denetleyiciyi tuttuğu yer) temsil eder. Bu, kullanıcının elinde bir kılıç veya silah ya da denetleyicinin kendi modelini işlemek için kullanışlıdır.
Bu kavrama pozu ile işaretçi pozu (denetleyicinin ucunun işaret ettiği konum) arasındaki ilişki denetleyiciler arasında farklılık gösterebilir. Şu anda, denetleyicinin işaretçi pozuna erişmek yalnızca aşağıdaki bölümlerde açıklanan MR'a özgü giriş API'si aracılığıyla mümkündür.
Windows'a özgü API'ler (XR. WSA. Giriş)
Dikkat
Projeniz XR'nin herhangi birini kullanıyorsa. WSA API'leri, gelecekteki Unity sürümlerinde XR SDK'sı için aşamalı olarak kullanıma sunulacaktır. Yeni projeler için en baştan XR SDK'sını kullanmanızı öneririz. XR Giriş sistemi ve API'ler hakkında daha fazla bilgiyi burada bulabilirsiniz.
Ad Alanı: UnityEngine.XR.WSA.Input
Türler: InteractionManager, InteractionSourceState, InteractionSource, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation
Windows Karma Gerçeklik el girişi (HoloLens için) ve hareket denetleyicileri hakkında daha ayrıntılı bilgi edinmek için UnityEngine.XR.WSA.Input ad alanı altında Windows'a özgü uzamsal giriş API'lerini kullanmayı seçebilirsiniz. Bu, konum doğruluğu veya kaynak türü gibi ek bilgilere erişmenizi sağlar ve ellere ve denetleyicilere ayrı ayrı bilgi vermenizi sağlar.
Ellerin ve hareket denetleyicilerinin durumunu yoklama
GetCurrentReading yöntemini kullanarak her etkileşim kaynağı (el veya hareket denetleyicisi) için bu çerçevenin durumunu yoklayabilirsiniz.
var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
// ...
}
Geri döndüğünüz her InteractionSourceState , geçerli anda bir etkileşim kaynağını temsil eder. InteractionSourceState aşağıdaki gibi bilgileri kullanıma sunar:
Hangi tür baskılar oluşuyor (Seç/Menü/Kavra/Dokunmatik Yüzey/Parmak Çubuğu)
if (interactionSourceState.selectPressed) { // ... }
Dokunmatik yüzey ve/veya parmak çubuğunun XY koordinatları ve dokunma durumu gibi hareket denetleyicilerine özgü diğer veriler
if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) { // ... }
Kaynağın bir el mi yoksa hareket denetleyicisi mi olduğunu bilmek için InteractionSourceKind
if (interactionSourceState.source.kind == InteractionSourceKind.Hand) { // ... }
İleriye dönük tahmin edilen işleme pozları için yoklama
Ellerden ve denetleyicilerden gelen etkileşim kaynağı verilerini yoklarken, elde ettiğiniz pozlar, bu çerçevenin fotonlarının kullanıcının gözlerine ulaşacağı an için ileriye dönük tahmin edilen pozlardır. İleriye doğru tahmin edilen pozlar en iyi şekilde denetleyiciyi veya her çerçevede tutulan bir nesneyi işlemek için kullanılır. Denetleyiciyle belirli bir basın veya yayını hedeflediyseniz, aşağıda açıklanan geçmiş olay API'lerini kullanırsanız bu en doğru olacaktır.
var sourcePose = interactionSourceState.sourcePose; Vector3 sourceGripPosition; Quaternion sourceGripRotation; if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) && (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) { // ... }
Bu geçerli çerçeve için ileriye dönük tahmin edilen baş pozunu da alabilirsiniz. Kaynak pozda olduğu gibi, bu da bir imleci işlemek için yararlıdır, ancak aşağıda açıklanan geçmiş olay API'lerini kullanırsanız belirli bir basın veya yayını hedeflemek en doğru olacaktır.
var headPose = interactionSourceState.headPose; var headRay = new Ray(headPose.position, headPose.forward); RaycastHit raycastHit; if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) { var cursorPos = raycastHit.point; // ... }
Etkileşim kaynağı olaylarını işleme
Giriş olaylarını doğru geçmiş poz verileriyle gerçekleşirken işlemek için yoklama yerine etkileşim kaynağı olaylarını işleyebilirsiniz.
Etkileşim kaynağı olaylarını işlemek için:
InteractionManager giriş olayına kaydolun. İlgilendiğiniz her etkileşim olayı türü için buna abone olmanız gerekir.
InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
Olayı işleyebilir. Bir etkileşim olayına abone olduktan sonra uygun olduğunda geri arama alırsınız. SourcePressed örneğinde bu, kaynak algılandıktan sonra ve yayımlanmadan veya kaybolmadan önce olacaktır.
void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args) var interactionSourceState = args.state; // args.state has information about: // targeting head ray at the time when the event was triggered // whether the source is pressed or not // properties like position, velocity, source loss risk // source id (which hand id for example) and source kind like hand, voice, controller or other }
Bir olayı işlemeyi durdurma
Artık olayla ilgilenmediğinizde veya olaya abone olan nesneyi yok ederken bir olayı işlemeyi durdurmanız gerekir. Olayı işlemeyi durdurmak için olayın aboneliğini kaldırırsınız.
InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
Etkileşim kaynağı olaylarının listesi
Kullanılabilir etkileşim kaynağı olayları şunlardır:
- InteractionSource Algılandı (kaynak etkin hale gelir)
- InteractionSourceLost (etkin değil olur)
- InteractionSourcePressed (dokun, düğmeye bas veya "Seç" ifade edildi)
- InteractionSourceReleased (dokunmanın sonu, yayımlanan düğme veya "Seç" ifadesinin sonu)
- InteractionSourceUpdated (bir durumu taşır veya başka bir şekilde değiştirir)
Geçmiş hedeflemeye yönelik olaylar, bir basın veya yayınla en doğru şekilde eşleşen pozlar oluşturur
Daha önce açıklanan yoklama API'leri, uygulamanıza ileriye dönük tahmin edilen pozlar verir. Bu tahmin edilen pozlar denetleyiciyi veya sanal bir handheld nesnesini işlemek için en iyi seçenek olsa da, gelecekteki pozlar iki önemli nedenden dolayı hedefleme için uygun değildir:
- Kullanıcı bir denetleyicideki bir düğmeye bastığında, sistem basını almadan önce Bluetooth üzerinden yaklaşık 20 ms kablosuz gecikme süresi olabilir.
- Ardından, ileriye dönük tahmin edilen bir poz kullanıyorsanız, geçerli çerçevenin fotonlarının kullanıcının gözüne ulaşacağı zamanı hedeflemek için 10-20 ms daha ileri tahmin uygulanır.
Bu, yoklamanın, basın veya yayın gerçekleştiğinde kullanıcının kafasının ve ellerinin geri geldiği yerden 30-40 ms ileri doğru bir kaynak poz veya baş pozu verdiği anlamına gelir. HoloLens el girişi için kablosuz iletim gecikmesi olmasa da basını algılamak için benzer bir işlem gecikmesi vardır.
Kullanıcının el veya denetleyici baskısı için özgün amacına göre doğru bir şekilde hedeflemek için, bu InteractionSourcePressed veya InteractionSourceReleased giriş olayından geçmiş kaynak pozunu veya baş pozunu kullanmanız gerekir.
Kullanıcının başından veya denetleyicisinden geçmiş poz verileriyle bir basını veya yayını hedefleyebilirsiniz:
Baş, kullanıcının neye baktığına karar vermek için hedeflemek için kullanılabilecek bir hareket veya denetleyici baskısı oluştuğu anda ortaya çıkan bir poz:
void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) { var interactionSourceState = args.state; var headPose = interactionSourceState.headPose; RaycastHit raycastHit; if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) { var targetObject = raycastHit.collider.gameObject; // ... } }
Kaynak, kullanıcının denetleyiciyi işaret ettiği şeyi belirlemek için hedeflemek için kullanılabilen bir hareket denetleyicisi baskısının oluştuğu anda ortaya çıkan bir poz. Bu, basını deneyimleyen denetleyicinin durumu olacaktır. Denetleyiciyi kendisi oluşturuyorsanız, kullanıcının işlenen denetleyicinin doğal ucunu dikkate alacaklarından hedefleme ışınını çekmek için kavrama pozu yerine işaretçi pozunu isteyebilirsiniz:
void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) { var interactionSourceState = args.state; var sourcePose = interactionSourceState.sourcePose; Vector3 sourceGripPosition; Quaternion sourceGripRotation; if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Pointer)) && (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Pointer))) { RaycastHit raycastHit; if (Physics.Raycast(sourceGripPosition, sourceGripRotation * Vector3.forward, out raycastHit, 10)) { var targetObject = raycastHit.collider.gameObject; // ... } } }
Olay işleyicileri örneği
using UnityEngine.XR.WSA.Input;
void Start()
{
InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
InteractionManager.InteractionSourceReleased += InteractionManager_InteractionSourceReleased;
InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
}
void OnDestroy()
{
InteractionManager.InteractionSourceDetected -= InteractionManager_InteractionSourceDetected;
InteractionManager.InteractionSourceLost -= InteractionManager_InteractionSourceLost;
InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
InteractionManager.InteractionSourceReleased -= InteractionManager_InteractionSourceReleased;
InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
}
void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
{
// Source was detected
// args.state has the current state of the source including id, position, kind, etc.
}
void InteractionManager_InteractionSourceLost(InteractionSourceLostEventArgs state)
{
// Source was lost. This will be after a SourceDetected event and no other events for this
// source id will occur until it is Detected again
// args.state has the current state of the source including id, position, kind, etc.
}
void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
{
// Source was pressed. This will be after the source was detected and before it is
// released or lost
// args.state has the current state of the source including id, position, kind, etc.
}
void InteractionManager_InteractionSourceReleased(InteractionSourceReleasedEventArgs state)
{
// Source was released. The source would have been detected and pressed before this point.
// This event will not fire if the source is lost
// args.state has the current state of the source including id, position, kind, etc.
}
void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs state)
{
// Source was updated. The source would have been detected before this point
// args.state has the current state of the source including id, position, kind, etc.
}
MRTK'da Hareket Denetleyicileri
Giriş Yöneticisi'nden hareket ve hareket denetleyicisine erişebilirsiniz.
Öğreticilerle birlikte izleyin
Daha ayrıntılı özelleştirme örnekleri içeren adım adım öğreticiler Karma Gerçeklik Academy'de mevcuttur:
MR Input 213 - Hareket denetleyicisi
Sonraki Geliştirme Denetim Noktası
Sunduğumuz Unity geliştirme yolculuğunu takip ediyorsanız MRTK temel yapı taşları keşfetmenin tam ortasındasınız demektir. Buradan sonraki yapı taşına devam edebilirsiniz:
İsterseniz Karma Gerçeklik platform özelliklerine ve API'lerine atlayabiliriz:
İstediğiniz zaman Unity geliştirme denetim noktalarına geri dönebilirsiniz.