Unity'de dünya kilitleme ve uzamsal yer işaretleri
Makale
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'u kullanarak önerdiğimiz çözümde size yol gösterir, ancak Unity projelerinizde uzamsal bağlantıları el ile ayarlamayı da ele alacağız. Herhangi bir koda geçmeden ö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 geri 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ünya oluştururken kolayca düzeltilir. Oda ölçeğinde VR uygulamaları bugün genellikle zemindeki kökeniyle 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ünyanın sensör odaklı dinamik bir anlayışına sahiptir ve bir binanın tüm katında çok metrelerce ilerlerken kullanıcının çevresi hakkında zaman içinde bilgisini 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ünya temelinde veya birbirlerine göre kaymaya neden olur.
Örneğin mikrofonlu kulaklık şu anda dünyanın iki konumunun birbirinden 4 metre uzakta olduğuna inanabilir ve daha sonra konumların aslında 3,9 metre uzakta 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 el ile uzamsal yer işaretleri yerleştirebilirsiniz. Ancak bu, sanal dünya içindeki kendi kendine tutarlılığı feda eder. Farklı yer işaretleri sürekli olarak birbirine göre hareket eder ve aynı zamanda küresel 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), kullanıcı gezindikçe sanal sahne boyunca yayılan uzamsal yer işareti iç tedarikini kullanarak tek bir katı koordinat sistemini sabitleyerek her iki dünyanın da en iyi şekilde kullanılmasını sağlar. 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 Araçları , 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, tüm sahneyi ortak bir yer işareti havuzuyla dünya çapında kilitler.
World Locking Tools, uzamsal tutturucuların iç oluşturulmasını ve yönetilmesini otomatik olarak işler. Hologramlarınızı dünya çapında 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ı belge sayfasına bakın.
Projeniz kullanıma hazır olduğunda, Karma Gerçeklik > World Locking Tools'dan 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'ya 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 yer işareti işlevselliği sağlar. ARFoundation'da ARAnchors ile ilgili temel bilgileri öğrenmek için ARFoundation Manual for AR Anchor Manager'ı ziyaret edin.
Bu oyun nesnesi artık fiziksel dünyadaki mevcut 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 GameObject kilitlenmesini istemiyorsanız ve bu çerçeveyi taşımak istemiyorsanız World Anchor bileşenini arayın Destroy .
Destroy(gameObject.GetComponent<WorldAnchor>());
Bu çerçeveyi GameObject taşımak istiyorsanız, bunun yerine çağrısı DestroyImmediate yapın.
Bir Dünya Çapası, fiziksel dünyada belirli bir noktada locatable olmayabilir. Unity bundan 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ğini işleyememe, 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 locatable olma veya locatable olma durumu arasında 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);
}
Yer işaretleri hemen bulunursa, bağlayıcının isLocated özelliği döndürdüğünde AddComponent<WorldAnchor>() olarak ayarlanırtrue. Bu nedenle, OnTrackingChanged olay tetiklenmemiş. Daha temiz bir desen, bağlayıcı ekledikten sonra işleyiciyi ilk IsLocated duruma sahip olarak çağırmaktırOnTrackingChanged.
Uzamsal yer işaretleri, 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 yer işaretleri cihazda, Azure Spatial Anchors ise bulutta depolanır. Çakışma olmadan aynı projede yerel ve Azure yer işaretleri kullanabilirsiniz. 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 yerel uzamsal yer işaretlerin kalıcılığını destekleyen cihazlarda oturumlar arasında fiziksel dünyaya göre koordinat sistemini 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ı 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 yapma.
Dünya Kilitleme Araçları yalnızca HoloLens cihazlarında yerel yer işareti kalıcılığını destekler. Android, iOS ve HoloLens cihazlarında, 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 World Locking Tools'u 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, bağlayıcıların oturumlar arasında kalıcı olmasını sağlar. XRAnchorStore, bir cihazdaki kaydedilmiş tutturucuların bir gösterimidir. Bağlayıcıları ARAnchors Unity sahnesinde kalıcı hale getirebilirsiniz, yer işaretleri depolama alanından yenisine ARAnchorsyükleyebilir veya yer işaretleri depolama alanından silebilirsiniz.
Not
Bu tutturucuları aynı cihaza kaydedip yüklersiniz. Cihazlar arası yer işaretleri 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
XRAnchorStore'yu Unity 2020 ve OpenXR ile yüklemek için, BIR ARAnchorManager'ın alt sistemi olan XRAnchorSubsystem üzerinde 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'de 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ğini gözden geçirin:
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ında aynı noktada bulabilir.
, WorldAnchorStore oturumlar arasında dünya çapalarının konumunu kalıcı hale almanızı sağlar. Hologramları oturumlar arasında kalıcı hale getirmek için, belirli bir dünya çapasını GameObjects kullanan hologramları ayrı bir şekilde izleyin. Dünya çapalı bir GameObject kök oluşturabilir ve alt hologramları yerel konum uzaklığıyla buna sabitleyebilirsiniz.
Hologramları önceki oturumlardan yüklemek için:
WorldAnchorStoreöğesini alın.
Dünya çapa uygulamasının verilerini yükleyin ve bu da size dünya çapasının kimliğini verir.
Dünya çapasını kimliğine göre yükleyin.
Hologramları gelecek oturumlara kaydetmek için:
WorldAnchorStoreöğesini alın.
Bir kimlik belirterek dünya çapasını kaydedin.
Dünya bağlantısıyla ilgili uygulama verilerini kimlikle birlikte kaydedin.
WorldAnchorStore'yu edinin
bir işlem gerçekleştirmeye hazır olduğunu bilmeniz 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 çapalarını WorldAnchorStorekaydetmek ve yüklemek için kullanabileceğiniz bir başvurusuna sahipsiniz.
Bir dünya çapa kaydedin
Bir dünya çapasını kurtarmak için, dünya çapasını adlandırın ve daha önce sahip olduğunuz şekilde WorldAnchorStore geçirin. aynı dizeye iki yer işareti kaydetmeye çalışırsanız false store.Save döndürür. Yenisini kaydetmeden önce önceki kaydetmeyi 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 çapa 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ı listeleme
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]);
}
Birden çok cihaz için hologramları kalıcı hale ekleme
Azure Spatial Anchors'ı kullanarak yerel bir dünya yer işaretinden dayanıklı bir bulut bağlantısı oluşturabilirsiniz. Uygulamanız, cihazlar aynı anda birlikte olmasa bile birden çok HoloLens, iOS ve Android cihazı arasında bulut tutturucuyu bulabilir. Bulut yer işaretleri kalıcı olduğundan, birden çok cihaz zaman içinde aynı fiziksel konumda yer işaretine göre işlenen içeriği görebilir.