Hologramlarınızın yerinde kalmasını sağlamak, sizinle birlikte hareket etmek veya bazı durumlarda kendilerini diğer hologramlara göre konumlandırmak, Karma Gerçeklik uygulamaları oluşturmanın büyük bir parçasıdır. Bu makale, World Locking Tools kullanarak önerilen çözümümüze göz atacak, ancak Unity projelerinizde uzamsal tutturucuları el ile ayarlamayı da ele alacağız. Herhangi bir koda atlamadan önce Unity'nin koordinat alanını ve kendi altyapısındaki tutturucuları nasıl işlediğini anlamak önemlidir.
Dünya ölçeğinde koordinat sistemleri
Günümüzde oyunlar, veri görselleştirme uygulamaları veya sanal gerçeklik uygulamaları yazarken tipik yaklaşım, diğer tüm koordinatların güvenilir bir şekilde eşleyebilecekleri tek bir mutlak dünya koordinat sistemi oluşturmaktır. Bu ortamda, her zaman o dünyadaki iki nesne arasındaki ilişkiyi tanımlayan kararlı bir dönüşüm bulabilirsiniz. Bu nesneleri taşımadıysanız, göreli dönüşümleri her zaman aynı kalır. Bu tür bir küresel koordinat sistemi, geometrinin tamamını önceden bildiğiniz tamamen sanal bir dünyayı oluştururken kolayca düzeltilir. Günümüzde oda ölçeğinde VR uygulamaları genellikle zemindeki kaynağıyla bu tür mutlak oda ölçeğinde koordinat sistemi kurar.
Buna karşılık, HoloLens gibi sabit olmayan bir karma gerçeklik cihazı, dünyayı dinamik algılayıcı odaklı bir anlayışa sahiptir ve bir binanın tüm katında metrelerce yürürken kullanıcının çevresinin zaman içindeki bilgilerini sürekli olarak ayarlar. Dünya ölçeğinde bir deneyimde, tüm hologramlarınızı saf ve katı bir koordinat sistemine yerleştirdiyseniz, bu hologramlar zaman içinde dünyaya göre veya birbirlerine göre sürüklenebilir.
Örneğin mikrofonlu kulaklık şu anda dünyanın iki konumunun birbirinden 4 metre ayrı olduğuna inanabilir ve daha sonra konumların aslında 3,9 metre ayrı olduğunu öğrenerek bu anlayışı geliştirebilir. Bu hologramlar başlangıçta tek bir katı koordinat sistemine 4 metre uzaklıkta yerleştirildiyse, bunlardan biri her zaman gerçek dünyadan 0,1 metre uzakta görünür.
Kullanıcı mobil olduğunda hologramın fiziksel dünyadaki konumunu korumak için Unity'ye uzamsal tutturucuları el ile yerleştirebilirsiniz. Ancak bu, sanal dünya içindeki kendi tutarlılığını feda eder. Farklı tutturucular sürekli olarak birbirine göre hareket eder ve aynı zamanda genel koordinat alanında hareket eder. Bu senaryoda düzen gibi basit görevler zorlaşır. Fizik simülasyonu da sorunlu olabilir.
Dünya Kilitleme Araçları (WLT) her iki dünyanın da en iyilerini elde eder ve kullanıcı hareket ettikçe sanal sahne boyunca yayılan dahili uzamsal çapalar kullanarak tek bir katı koordinat sistemini dengeler. WLT, kameranın koordinatlarını ve bu uzamsal bağlantıları her kareyi analiz eder. WLT, kullanıcının kafasının koordinatlarındaki düzeltmeleri telafi etmek için dünyadaki her şeyin koordinatlarını değiştirmek yerine yalnızca başın koordinatlarını düzeltir.
Dünya kilitleme yaklaşımınızı seçin
Mümkünse hologram konumlandırma için World Locking Tools'ı kullanın.
World Locking Tools , sanal ve gerçek dünya işaretleyicileri arasındaki görünür tutarsızlıkları en aza indiren kararlı bir koordinat sistemi sağlar. World Locking Tools, her bir nesne grubunu grubun kendi yer işaretiyle kilitlemek yerine, sahnenin tamamını ortak bir yer işareti havuzuyla kilitler.
World Locking Tools, uzamsal tutturucuların iç oluşturulmasını ve yönetilmesini otomatik olarak işler. Hologramlarınızı dünya kilitli tutmak için ARAnchorManager veya WorldAnchor ile etkileşim kurmanız gerekmez.
OpenXR veya Windows XR Eklentisi kullanan Unity 2019/2020 için ARAnchorManager kullanın.
Eski Unity sürümleri veya WSA projeleri için WorldAnchor kullanın.
Dünya Kilitleme Araçları'nı kullanmaya başlamak için Karma Gerçeklik Özellik Aracı'nı indirin. Temel bilgiler hakkında daha fazla bilgi edinmek için Genel Bakış, Hızlı Başlangıç ve diğer yararlı konuların bağlantıları için ana Dünya Kilitleme Araçları belgeleri sayfasına bakın.
Projeniz kullanıma hazır olduğunda, Karma Gerçeklik > World Locking Tools'tan sahne yapılandırma yardımcı programını çalıştırın:
Önemli
Sahneyi yapılandır yardımcı programı istediğiniz zaman yeniden çalıştırılabilir. Örneğin, AR hedefi Eski'den XR SDK'sına değiştirildiyse yeniden çalıştırılmalıdır. Sahne zaten düzgün yapılandırılmışsa yardımcı programı çalıştırmanın hiçbir etkisi yoktur.
Görselleştiriciler
Erken geliştirme sırasında, WLT'nin düzgün ayarlandığından ve çalıştığından emin olmak için görselleştiriciler eklemek yararlı olabilir. Bunlar üretim performansı için veya herhangi bir nedenle artık gerekli değilse Görselleştiricileri kaldır yardımcı programı kullanılarak kaldırılabilir. Görselleştiricilerle ilgili diğer ayrıntılar Araçlar belgelerinde bulunabilir.
Karma Gerçeklik OpenXR Eklentisi, Unity'nin ARFoundation ARAnchorManager uygulaması aracılığıyla temel bağlantı işlevselliği sağlar. ARFoundation'daki ARAnchors ile ilgili temel bilgileri öğrenmek için AR Anchor Manager için ARFoundation Manual'ı ziyaret edin.
Bu oyun nesnesi artık fiziksel dünyadaki geçerli konumuna sabitlenmiştir. Fiziksel hizalamayı sağlamak için Unity dünya koordinatlarının zaman içinde biraz ayarlı olduğunu görebilirsiniz. Gelecekteki bir uygulama oturumunda bu bağlantılı konumu yeniden bulmak için bkz . dünya bağlantısı yükleme.
Dünya Çapasını Kaldırma
Artık fiziksel bir dünya konumuna kilitlenmesini GameObject istemiyorsanız ve bu çerçeveyi taşımayı düşünmüyorsanız, World Anchor bileşenini arayın Destroy .
Destroy(gameObject.GetComponent<WorldAnchor>());
Bu çerçeveyi GameObject taşımak istiyorsanız, bunun yerine çağırın DestroyImmediate .
Dünya Çapası, fiziksel dünyada belirli bir noktada locatable olmayabilir. Unity daha sonra bağlantılı nesnenin dönüşümünü güncelleştirmez. Bu durum, bir uygulama çalışırken de oluşabilir. 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:
OnTrackingChanged Olaya abone olun. Temel OnTrackingChanged alınan uzamsal yer işareti, lokabl olma veya locatable olma durumu arasında her değiştiğinde olay çağrılır.
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
Tutturucular hemen bulunursa, bağlayıcının isLocated özelliği döndürdüğünde AddComponent<WorldAnchor>() olarak true ayarlanır. Bu nedenle, OnTrackingChanged olay tetiklenmemiş. Daha temiz bir desen, bir tutturucu ekledikten sonra işleyiciyi ilk IsLocated durumuyla çağırmaktırOnTrackingChanged.
Uzamsal tutturucular, hologramları uygulama oturumları arasında gerçek dünyada yer kaplar. HoloLens yer işareti deposuna kaydedildikten sonra uzamsal tutturucular farklı oturumlarda bulunabilir ve yüklenebilir ve İnternet bağlantısı olmadığında ideal bir geri dönüş olur.
Önemli
Yerel tutturucular cihazda depolanırken Azure Spatial Anchors bulutta depolanır. Çakışma olmadan aynı projede yerel ve Azure bağlantı noktalarınız olabilir. Yer işaretlerinizi depolamak için Azure bulut hizmetlerini tümleştirme hakkında daha fazla bilgi için bkz . Azure Spatial Anchors.
Varsayılan olarak, World Locking Tools unity'nin koordinat sistemini yerel uzamsal tutturucuların kalıcılığını destekleyen cihazlardaki oturumlarda fiziksel dünyaya göre geri yükler. Uygulamadan çıkıp yeniden çalıştırdıktan sonra bir hologramın fiziksel dünyada aynı yerde görünmesini sağlamak için uygulamanın yalnızca holograma aynı pozu geri yüklemesi gerekir.
Uygulamanın daha ayrıntılı bir denetime ihtiyacı varsa, denetçide Otomatik Kaydetme ve Otomatik Yükleme'yi devre dışı bırakabilir ve bir betikten kalıcılığı yönetebilirsiniz. Daha fazla bilgi için bkz . Uzamsal koordinat sistemlerini kalıcı hale alma.
World Locking Tools yalnızca HoloLens cihazlarında yerel yer işareti kalıcılığını destekler. Android, iOS ve HoloLens cihazları için, oturumlar ve cihazlar arasında koordinat alanlarının kalıcılığını ve paylaşımını desteklemek için Azure Spatial Anchors ile tümleştirin. Azure Spatial Anchors ile Dünya Kilitleme Araçları'nı kullanma hakkında daha fazla bilgi ve örnek için bkz. Azure Spatial Anchors (ASA) ile birlikte World Locking Tools (WLT).
adlı XRAnchorStore bir API, tutturucuların oturumlar arasında kalıcı olmasını sağlar. XRAnchorStore, bir cihazdaki kaydedilmiş tutturucuların bir gösterimidir. Bağlantı noktalarını ARAnchors Unity sahnesinde kalıcı hale getirebilirsiniz, yer işaretleri depolamadan yeni ARAnchorsöğesine yükleyebilir veya yer işaretleri depolama alanından silebilirsiniz.
Not
Bu tutturucuları aynı cihaza kaydedip yüklersiniz. Cihazlar arası tutturucular Azure Spatial Anchors aracılığıyla desteklenir.
Ad alanları
Unity 2020 ve OpenXR için:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
veya Unity 2019/2020 + Windows XR Eklentisi:
using UnityEngine.XR.WindowsMR.XRAnchorStore
Genel yöntemler
{
// A list of all persisted anchors, which can be loaded.
public IReadOnlyList<string> PersistedAnchorNames { get; }
// Clear all persisted anchors
public void Clear();
// Load a single persisted anchor by name. The ARAnchorManager will create this new anchor and report it in
// the ARAnchorManager.anchorsChanged event. The TrackableId returned here is the same TrackableId the
// ARAnchor will have when it is instantiated.
public TrackableId LoadAnchor(string name);
// Attempts to persist an existing ARAnchor with the given TrackableId to the local store. Returns true if
// the storage is successful, false otherwise.
public bool TryPersistAnchor(TrackableId id, string name);
// Removes a single persisted anchor from the anchor store. This will not affect any ARAnchors in the Unity
// scene, only the anchors in storage.
public void UnpersistAnchor(string name);
}
Yer işareti deposu başvurusu alma
Unity 2020 ve OpenXR ile XRAnchorStore yüklemek için, ARAnchorManager'ın alt sistemi olan XRAnchorSubsystem'da uzantı yöntemini kullanın:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
XRAnchorStore'yu Unity 2019/2020 ve Windows XR Eklentisi ile yüklemek için, ARReferencePointManager/ARAnchorManager'ın alt sistemi olan XRReferencePointSubsystem (Unity 2019) veya XRAnchorSubsystem (Unity 2020) üzerindeki uzantı yöntemini kullanın:
// Unity 2019 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRReferencePointSubsystem anchorSubsystem);
// Unity 2020 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem);
Yer işareti deposu yükleme
Unity 2020 ve OpenXR'da yer işareti deposu yüklemek için, aranchorManager'ın alt sisteminden aşağıdaki gibi bu depoya erişin:
Kalıcı/kalıcı olmayan tutturucuların tam örneğini görmek için [Karma Gerçeklik OpenXR Eklentisi Örnek Sahnesi]()https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples içindeki Anchors -> Anchors Sample GameObject ve AnchorsSample.cs betiğine göz atın:
Eski Unity sürümlerinde veya WSA projelerinde hologram kalıcılığı için WorldAnchor kullanın.
Ad Alanı:UnityEngine.XR.WSA.Persistence Sınıf:WorldAnchorStore
WorldAnchorStore, hologramların uygulama örnekleri arasında belirli gerçek dünya konumlarında kaldığı holografik deneyimler oluşturur. Kullanıcılar hologramları istedikleri yere sabitleyebilir ve daha sonra uygulama oturumları üzerinden aynı yerde bulabilir.
, WorldAnchorStore oturumlar arasında dünya tutturucularının konumunu kalıcı hale almanızı sağlar. Hologramları oturumlar arasında kalıcı hale getirmek için, belirli bir dünya bağlantısı kullanan hologramları GameObjects ayrı bir şekilde izleyin. Dünya bağlantısı olan bir GameObject kök oluşturabilir ve alt hologramları yerel konum uzaklığıyla buna sabitleyebilirsiniz.
Önceki oturumlardan hologramları yüklemek için:
WorldAnchorStoreöğesini alın.
Dünya bağlantısı uygulama verilerini yükleyin ve bu da size dünya tutturucunun kimliğini verir.
Kimlikle birlikte dünya bağlantısıyla ilgili uygulama verilerini kaydedin.
WorldAnchorStore'yu edinin
bir işlem gerçekleştirmeye hazır olduğunda bilgi edinmek için WorldAnchorStoreöğesine bir başvuru tutun. Bu çağrı zaman uyumsuz olduğundan, uygulama başlatılır başlatılmaz şunları çağırabilirsiniz:
Artık belirli dünya tutturucularını WorldAnchorStorekaydetmek ve yüklemek için kullanabileceğiniz öğesine bir başvurunuz var.
Dünya çapalarını kurtar
Bir dünya çapasını kurtarmak için, dünya çapasını adlandırın ve daha önce yaptığınız gibi geçirin WorldAnchorStore . Aynı dizeye iki yer işareti kaydetmeye çalışırsanız false store.Save döndürür. Yenisini kaydetmeden önce önceki kaydı silin.
private void SaveGame()
{
// Save data about holograms that this world anchor positions
if (!this.savedRoot) // Only save the root once
{
this.savedRoot = this.store.Save("rootGameObject", anchor);
Assert(this.savedRoot);
}
}
Dünya tutturucu yükleme
Dünya çapasını yüklemek için:
private void LoadGame()
{
// Saved data about holograms that this world anchor positions:
this.savedRoot = this.store.Load("rootGameObject", rootGameObject);
if (!this.savedRoot)
{
// Game root not saved. Re-place objects or start over.
}
}
Ayrıca, daha önce kaydettiğiniz bir tutturucuyu kaldırmak ve store.Clear() daha önce kaydedilmiş tüm verileri kaldırmak için de kullanabilirsinizstore.Delete().
Mevcut tutturucuları numaralandır
Depolanan tutturucuları listelemek için çağrısında bulunur GetAllIds.
string[] ids = this.store.GetAllIds();
for (int index = 0; index < ids.Length; index++)
{
Debug.Log(ids[index]);
}
Hologramları birden çok cihaz için kalıcı hale
Yerel bir dünya yer işaretinden dayanıklı bir bulut bağlantısı oluşturmak için Azure Spatial Anchors'ı kullanabilirsiniz. Uygulamanız, cihazlar aynı anda birlikte olmasa bile birden çok HoloLens, iOS ve Android cihazı arasında bulut tutturucuyu bulabilir. Bulut tutturucuları kalıcı olduğundan, birden çok cihaz zaman içinde aynı fiziksel konumda yer alan bu tutturucuya göre işlenen içeriği görebilir.