Unity'de koordinat sistemleri

Windows Mixed Reality, yalnızca yönlendirmeli ve oturak ölçeğindeki uygulamalardan oda ölçeğindeki uygulamalara kadar çok çeşitli deneyim ölçeklerinde uygulamaları destekler. HoloLens'te daha ileri gidebilir ve kullanıcıların 5 metreden fazla yürümesini, bir binanın tüm katını ve ötesini keşfetmesini sağlayan dünya ölçeğinde uygulamalar oluşturabilirsiniz.

Unity'de karma gerçeklik deneyimi oluşturmanın ilk adımı koordinat sistemlerini anlamak ve uygulamanızın hedefleyecek deneyim ölçeğini seçmektir .

Yalnızca yönlendirmeli veya oturarak ölçeklendirilen bir deneyim oluşturma

Ad Alanı:UnityEngine.XR
Tür:XRDevice

Yalnızca yönlendirme veya oturma ölçeğinde bir deneyim oluşturmak için Unity'yi sabit izleme alanı türüne ayarlamanız gerekir. Sabit izleme alanı, Unity'nin dünya koordinat sistemini sabit referans çerçevesini izleyecek şekilde ayarlar. sabit izleme modunda, kameranın varsayılan konumunun hemen önünde düzenleyiciye yerleştirilen içerik (ileri -Z) uygulama başlatıldığında kullanıcının önünde görünür.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Ad Alanı:UnityEngine.XR
Tür:InputTracking

360 derecelik video görüntüleyici (konumsal baş güncelleştirmelerinin yanılsamayı bozacağı) gibi yalnızca yönlendirme deneyimi için XR'yi ayarlayabilirsiniz. InputTracking.disablePositionalTracking to true:

InputTracking.disablePositionalTracking = true;

Oturma ölçeğinde bir deneyim için, kullanıcının daha sonra oturma çıkış noktasını daha yeni açmasına izin vermek için XR'yi çağırabilirsiniz. InputTracking.Recenter yöntemi:

InputTracking.Recenter();

Ayakta ölçek veya oda ölçeği deneyimi oluşturma

Ad Alanı:UnityEngine.XR
Tür:XRDevice

Ayakta ölçek veya oda ölçeği deneyimi için içeriği zemine göre yerleştirmeniz gerekir. İlk çalıştırma sırasında ayarlanan kullanıcının tanımlı kat düzeyi çıkış noktasını ve isteğe bağlı oda sınırını temsil eden uzamsal aşamayı kullanarak kullanıcının zemini hakkında neden olursunuz.

Unity'nin zemin düzeyinde dünya koordinat sistemiyle çalıştığından emin olmak için Unity'nin RoomScale izleme alanı türünü kullandığını ayarlayabilir ve test edebilirsiniz:

if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
    // RoomScale mode was set successfully.  App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
    // RoomScale mode was not set successfully.  App cannot make assumptions about where the floor plane is.
}
  • SetTrackingSpaceType true değerini döndürürse Unity, dünya koordinat sistemini başvurunun aşama çerçevesini izlemek için başarıyla değiştirmiştir.
  • SetTrackingSpaceType false döndürürse, unity büyük olasılıkla kullanıcı kendi ortamında bir zemin ayarlamadığından başvuru aşama çerçevesine geçemedi. Yanlış dönüş değeri yaygın olmasa da, aşama farklı bir odada ayarlanırsa ve kullanıcı yeni bir aşama ayarlamadan cihaz geçerli odaya taşınırsa bu durum oluşabilir.

Uygulamanız RoomScale izleme alanı türünü başarıyla ayarladıktan sonra y=0 düzleminde yer alan içerik yerde görünür. 0, 0, 0'daki çıkış noktası, kullanıcının oda kurulumu sırasında durduğu yerde, -Z ise kurulum sırasında karşılaştığı ileri yönü temsil eder.

Ad Alanı:UnityEngine.Experimental.XR
Tür:Sınır

Betik kodunda daha sonra UnityEngine.Experimental.XR.Boundary türünde TryGetGeometry yöntemini çağırarak bir sınır çokgeni alabilir ve bir sınır türü olarak TrackedArea belirtebilirsiniz. Kullanıcı bir sınır tanımladıysa (köşe listesini geri alırsanız), kullanıcıya oda ölçeğinde bir deneyim sunmak güvenlidir ve burada oluşturduğunuz sahnede gezinebilir.

Not

Kullanıcı yaklaştığında sistem sınırı otomatik olarak işler. Uygulamanızın sınırın kendisini işlemek için bu çokgeni kullanması gerekmez. Ancak, kullanıcının bu nesnelere ışınlanmadan fiziksel olarak ulaşaabilmesini sağlamak için sahne nesnelerinizi bu sınır çokgenini kullanarak yerleştirebilirsiniz:

var vertices = new List<Vector3>();
if (UnityEngine.Experimental.XR.Boundary.TryGetGeometry(vertices, Boundary.Type.TrackedArea))
{
    // Lay out your app's content within the boundary polygon, to ensure that users can reach it without teleporting.
}

Dünya ölçeğinde deneyim oluşturma

Ad Alanı:UnityEngine.XR.WSA
Tür:WorldAnchor

HoloLens'te kullanıcıların 5 metreden fazla gezinmesine olanak sağlayan gerçek dünya ölçeğinde deneyimler için, oda ölçeğinde deneyimler için kullanılanların ötesinde yeni tekniklere ihtiyacınız olacaktır. Kullanacağınız temel tekniklerden biri, kullanıcı ne kadar dolaşımda olursa olsun fiziksel dünyada hologram kümesini tam olarak yerinde kilitlemek için uzamsal bir yer işareti oluşturmak ve daha sonraki oturumlarda bu hologramları yeniden bulmaktır.

Unity'de, WorldAnchor Unity bileşenini bir GameObject'e ekleyerek uzamsal bir yer işareti oluşturursunuz.

Dünya Çapası Ekleme

Dünya bağlantısı eklemek için, gerçek dünyaya tutturmak istediğiniz dönüşümle oyun nesnesinde AddComponent<WorldAnchor>() öğesini çağırın.

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

İşte bu kadar! Bu oyun nesnesi artık fiziksel dünyadaki mevcut konumuna sabitlenecektir - Fiziksel hizalamayı sağlamak için Unity dünya koordinatlarının zaman içinde biraz ayarlandığını görebilirsiniz. Bu bağlantılı konumu gelecekteki bir uygulama oturumunda yeniden bulmak için kalıcılığı kullanın.

Dünya Çapasını Kaldırma

GameObject'in artık fiziksel bir dünya konumuna kilitlenmesini istemiyorsanız ve bu çerçeveyi taşımayı düşünmüyorsanız, World Anchor bileşeninde Destroy'u çağırabilirsiniz.

Destroy(gameObject.GetComponent<WorldAnchor>());

GameObject bu çerçeveyi taşımak istiyorsanız, bunun yerine DestroyImmediate'i çağırmanız gerekir.

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

Dünya Çapalı GameObject'i Taşıma

Bir World Anchor üzerindeyken GameObject'ler taşınamaz. GameObject çerçevesini taşımanız gerekiyorsa şunları yapmanız gerekir:

  1. DestroyImmediate World Anchor bileşeni
  2. GameObject'i taşıma
  3. GameObject'e yeni bir World Anchor bileşeni ekleyin.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Locatability Değişikliklerini İşleme

WorldAnchor fiziksel dünyada belirli bir noktada locatable olmayabilir. Böyle bir durumda Unity, bağlantılı nesnenin dönüşümünü güncelleştirmez. Bu, bir uygulama çalışırken de değişebilir. Locatability değişikliğinin işlenememesi, nesnenin dünyadaki doğru fiziksel konumda görünmemesine neden olur.

Locatability değişiklikleri hakkında bildirim almak için:

  1. OnTrackingChanged olayına abone olma
  2. Olayı işleme

OnTrackingChanged olayı, temel alınan uzamsal yer işareti locatable olma durumu ile locatable olmaması arasında her değiştiğinde çağrılır.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Ardından olayı işleyin:

private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
    // This simply activates/deactivates this object and all children when tracking changes
    self.gameObject.SetActiveRecursively(located);
}

Bazen tutturucular hemen bulunur. Bu durumda, AddComponent<WorldAnchor>() döndürdüğünde tutturucunun bu isLocated özelliği true olarak ayarlanır. Sonuç olarak, OnTrackingChanged olayı tetiklenmez. Temiz bir desen, bir yer işareti ekledikten sonra ilk IsLocated durumuyla OnTrackingChanged işleyicinizi çağırmak olabilir.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Cihazlar arasında yer işaretleri paylaşma

Azure Spatial Anchors'ı kullanarak yerel bir WorldAnchor'dan dayanıklı bir bulut tutturucu oluşturun. Bu bağlantı, uygulamanızın birden çok HoloLens, iOS ve Android cihazında bulabilmesini sağlar. Ortak bir uzamsal tutturucuyu birden çok cihazda paylaşarak, her kullanıcı aynı fiziksel konumda yer işaretine göre işlenen içeriği görebilir. Bu, gerçek zamanlı paylaşılan deneyimler sağlar.

Unity'de paylaşılan deneyimler oluşturmaya başlamak için 5 dakikalık Azure Spatial Anchors Unity hızlı başlangıçlarını deneyin.

Azure Spatial Anchors ile çalışmaya devam ettikten sonra Unity'de yer işaretleri oluşturabilir ve bulabilirsiniz.

Sonraki Geliştirme Denetim Noktası

Ortaya koyduğumuz Unity geliştirme denetim noktası yolculuğunu takip ediyorsanız, Karma Gerçeklik 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'lere atlayabiliriz:

İstediğiniz zaman Unity geliştirme denetim noktalarına geri dönebilirsiniz.

Ayrıca Bkz.