Unity 'de uzamsal eşleme

uzamsal eşleme , HoloLens bir cihazın etrafında dünyanın yüzeylerini temsil eden üçgen kafesler almanızı sağlar. Unity projelerinize bir Immersion ek DOS eklemek için yerleştirme, occlusiyon ve oda analizi için yüzey verilerini kullanabilirsiniz.

Unity, geliştiricilere aşağıdaki yollarla sunulan, uzamsal eşleme için tam destek içerir:

  1. Uzamsal eşleme ile çalışmaya başlamak için kullanışlı ve hızlı bir yol sağlayan MixedRealityToolkit 'te kullanılabilen uzamsal eşleme bileşenleri
  2. Tam denetim sağlayan ve daha gelişmiş uygulamaya özgü özelleştirmeyi etkinleştiren alt düzey uzamsal eşleme API 'Leri

Uygulamanızda uzamsal eşlemeyi kullanmak için, Appxbildiriminde SpatialPerception özelliğinin ayarlanması gerekir.

Cihaz desteği

Özellik HoloLens (ilk genel) HoloLens 2 Modern kulaklıklar
Uzamsal eşleme ✔️ ✔️

SpatialPerception özelliğini ayarlama

Bir uygulamanın uzamsal eşleme verilerini kullanabilmesi için, SpatialPerception özelliği etkinleştirilmelidir.

Istenmeyen yazılım yeteneklerini etkinleştirme:

  1. Unity düzenleyicisinde "oynatıcı Ayarlar" bölmesini açın ( Project Ayarlar > oynatıcıyı düzenleyin)
  2. "Windows deposu" sekmesinde seçin
  3. " yayımlama Ayarlar" öğesini genişletin ve " yetenekler" listesindeki "spatialperception" özelliğini denetleyin

Not

Unity projenizi zaten bir Visual Studio çözümüne dışarı aktardıysanız, yeni bir klasöre aktarmanız veya Visual Studio içindeki appxbildiriminde bu özelliğiel ile ayarlamanız gerekir.

Uzamsal eşleme Ayrıca en az 10.0.10586.0 için bir Maxversiontest gerektiriyor:

  1. Visual Studio ' de, Çözüm Gezgini Package. appxmanifest öğesine sağ tıklayın ve kodu görüntüle ' yi seçin.
  2. Targetdevicefamily öğesini belirten satırı bulun ve maxversiontested = "10.0.10240.0" değerini maxversiontested = "10.0.10586.0" olarak değiştirin
  3. Package. appxmanifest öğesini kaydedin .

Unity 'de eşleme ekleme

Uzamsal tanıma sistemi

MRTK 'de, çeşitli uzamsal kafes observers ayarlama hakkında bilgi edinmek için uzamsal tanıma Başlarken kılavuzuna bakın.

Cihaz üzerindeki gözlemcilerin hakkında daha fazla bilgi için bkz. cihaz için kafes gözlemcilerin 'ı yapılandırma Kılavuzu.

Observers 'ı anlama hakkında daha fazla bilgi için, sahneye gözlemci kılavuzuna bakın.

Üst düzey ağ analizi: uzamsal anlama

Dikkat

Uzamsal anlama, sahne 'Nin anlaşılmasındankullanım dışı bırakılmıştır.

Mixedrealitytoolkit , Unity 'Nin holographic API 'lerinde oluşturulan holographic geliştirmesi için yardımcı program kodu koleksiyonudur.

Uzamsal anlama

Fiziksel dünyadaki hologramlar yerleştirilirken, genellikle uzamsal eşlemenin kafeslerinin ve yüzey düzlemlerinin ötesine geçmek istenir. Yerleştirme tamamlandığında, daha yüksek bir çevresel anlama düzeyi tercih edilir. Bu, genellikle zemin, tavan ve duvarlar ile ilgili kararlar vermenizi gerektirir. Ayrıca, Holographic nesneleri için en iyi fiziksel konumları belirleyebilmek üzere bir yerleştirme kısıtlamaları kümesine karşı iyileştirebilirde olursunuz.

Gençler ve parçaların geliştirilmesi sırasında Asobo Studios, bir oda çözücüsü geliştirerek bu sorundan sonra ortaya çıkmış. Bu oyunların her biri, oyuna özgü gereksinimlere sahiptir, ancak temel uzamsal anlama teknolojisini paylaştı. Holoaraç seti. spatialanlamam kitaplığı bu teknolojiyi kapsüller, duvarlardaki boş alanları hızlıca bulabilir, üst sınıra nesne yerleştirebilir, üst sınıra kadar olan karakter için yerleştirilmiş ve diğer uzamsal anlama sorguları için sayısız ' ı tanımlar.

Kaynak kodun hepsi dahil edilmiştir. Bu, gereksinimlerinize göre özelleştirmenize ve geliştirmelerinizi toplulukla paylaşmanıza olanak sağlar. C++ çözücü 'nün kodu UWP dll 'ye sarmalanmış ve MixedRealityToolkit içinde bulunan prefab içindeki bir bırakmaya eklenmiş olan Unity 'ye sunuldu.

Modülleri anlama

Modül tarafından sunulan üç birincil arabirim vardır: basit yüzey ve uzamsal sorgular için topoloji, nesne algılama şekli ve nesne kümelerinin kısıtlama tabanlı yerleştirmesi için nesne yerleştirme çözücü. Bunların her biri aşağıda açıklanmıştır. Üç birincil modül arabirimine ek olarak, bir Ray atama arabirimi etiketli yüzey türlerini almak için kullanılabilir ve özel bir su sıkı Playspace ağı kopyalanabilir.

Ray atama

Oda taraması tamamlandıktan sonra, zemin, tavan ve duvarlar gibi yüzeyler için Etiketler dahili olarak oluşturulur. PlayspaceRaycastİşlev bir Ray alır ve Ray bilinen bir yüzey ile çakışıyorsa, bu yüzey ile ilgili bilgiler bir olarak RaycastResult .

struct RaycastResult
{
    enum SurfaceTypes
    {
        Invalid,    // No intersection
        Other,
        Floor,
        FloorLike,  // Not part of the floor topology,
                    //  but close to the floor and looks like the floor
        Platform,   // Horizontal platform between the ground and
                    //  the ceiling
        Ceiling,
        WallExternal,
        WallLike,   // Not part of the external wall surface,
                    //  but vertical surface that looks like a
                    //  wall structure
    };
    SurfaceTypes SurfaceType;
    float SurfaceArea;  // Zero if unknown
                        //  (i.e. if not part of the topology analysis)
    DirectX::XMFLOAT3 IntersectPoint;
    DirectX::XMFLOAT3 IntersectNormal;
};

Dış olarak, raycast, Playspace 'in hesaplanan 8 cm tarafından yürütülen Voxel gösterimine göre hesaplanır. Her Voxel, işlenen topoloji verileri (diğer adıyla) olan bir yüzey öğeleri kümesi içerir. Kesişen Voxel hücresinde bulunan surflikler karşılaştırılır ve topoloji bilgilerini aramak için en iyi eşleşme kullanılır. Bu topoloji verileri, "Surfacetype" numaralandırması biçiminde döndürülen etiketlemenin yanı sıra kesişen yüzeyinin yüzey alanını içerir.

Unity örneğinde, imleç her karede bir ışın yayınlar. İlk olarak, Unity 'nin çakışmasındaki çarpışlar. İkincisi, modülün dünya gösterimine göre. Son olarak, Kullanıcı arabirimi öğeleri. Bu uygulamada, Kullanıcı arabirimi önceliği, daha sonra anlama sonucunu ve son olarak Unity 'nin çarpışlamalarını alır. SurfaceType, imlecin yanında metin olarak bildirilir.

Yüzey türü imlecin yanında etiketlendi
Yüzey türü imlecin yanında etiketlendi

Topoloji sorguları

DLL içinde topoloji Yöneticisi, ortamın etiketlenmesini işler. Yukarıda belirtildiği gibi, verilerin büyük bölümü bir Voxel biriminde bulunan surfiksel içinde depolanır. Ayrıca, "Playspaceınfos" yapısı, dünya hizalaması (aşağıda bu konuda daha fazla ayrıntı), Floor ve tavan yüksekliğiyle birlikte Playspace hakkındaki bilgileri depolamak için kullanılır. Buluşsal yöntemler, zemin, tavan ve duvarlar belirlemek için kullanılır. Örneğin, 1-m2 yüzey alanından büyük ve en büyük yatay yüzey zemin olarak değerlendirilir.

Not

Tarama işlemi sırasında kamera yolu da bu işlemde kullanılır.

Topoloji Yöneticisi tarafından kullanıma sunulan sorguların bir alt kümesi dll aracılığıyla kullanıma sunulur. Ortaya çıkarılan topoloji sorguları aşağıdaki gibidir.

QueryTopology_FindPositionsOnWalls
QueryTopology_FindLargePositionsOnWalls
QueryTopology_FindLargestWall
QueryTopology_FindPositionsOnFloor
QueryTopology_FindLargestPositionsOnFloor
QueryTopology_FindPositionsSittable

Sorguların her biri, sorgu türüne özgü bir parametre kümesine sahiptir. Aşağıdaki örnekte, kullanıcı istenen birimin en küçük yükseklik & genişliğini, tabandaki en düşük yerleştirme yüksekliğini ve birimin önünde en düşük kullanım miktarını belirtir. Tüm ölçümler metre cinsindendir.

EXTERN_C __declspec(dllexport) int QueryTopology_FindPositionsOnWalls(
    _In_ float minHeightOfWallSpace,
    _In_ float minWidthOfWallSpace,
    _In_ float minHeightAboveFloor,
    _In_ float minFacingClearance,
    _In_ int locationCount,
    _Inout_ Dll_Interface::TopologyResult* locationData)

Bu sorguların her biri, önceden ayrılmış bir "Topologyıresult" yapıları dizisi alır. "LocationCount" parametresi, geçirilen dizinin uzunluğunu belirtir. Dönüş değeri, döndürülen konumların sayısını bildirir. Bu sayı, geçilen "locationCount" parametresinden daha büyük değil.

"Topologyıresult", döndürülen birimin orta konumunu, karşılıklı yönü (yani normal) ve bulunan alanın boyutlarını içerir.

struct TopologyResult
{
    DirectX::XMFLOAT3 position;
    DirectX::XMFLOAT3 normal;
    float width;
    float length;
};

Not

Unity örneğinde, bu sorguların her biri sanal kullanıcı arabirimi panelindeki bir düğmeye bağlanır. Örnek sabit, bu sorguların her biri için parametreleri makul değerlere göre kodlar. Daha fazla örnek için örnek kodda SpaceVisualizer. cs öğesine bakın.

Şekil sorguları

Dll 'de şekil Çözümleyicisi ("ShapeAnalyzer_W"), Kullanıcı tarafından tanımlanan özel şekillerle eşleşmesi için topoloji Çözümleyicisi 'ni kullanır. Unity örneği bir şekil kümesi tanımlar ve sonuçları şekil sekmesinde uygulama içi sorgu menüsünden gösterir. Amaç, kullanıcının kendi nesne şekli sorgularını tanımlayabilir ve bunların uygulamalarının gerektirdiği gibi bunları kullanmasına izin verebilir.

Şekil Analizi yalnızca yatay yüzeylerde kullanılır. Örneğin, bir oturak, düz oturun yüzeyi ve kolun düz üst öğesi tarafından tanımlanır. Şekil sorgusu, hizalanmış ve bağlanmış iki yüzey ile belirli bir boyut, yükseklik ve en boy aralığı için iki yüzey arar. API terminolojisini kullanarak, oturak ve arka üst, şekil bileşenleri ve hizalama gereksinimleri şekil bileşen kısıtlamalardır.

Unity örneğinde tanımlanmış örnek sorgu (ShapeDefinition. cs), "sittable" nesneleri için aşağıdaki gibidir.

shapeComponents = new List<ShapeComponent>()
{
    new ShapeComponent(
        new List<ShapeComponentConstraint>()
        {
            ShapeComponentConstraint.Create_SurfaceHeight_Between(0.2f, 0.6f),
            ShapeComponentConstraint.Create_SurfaceCount_Min(1),
            ShapeComponentConstraint.Create_SurfaceArea_Min(0.035f),
        }
    ),
};
AddShape("Sittable", shapeComponents);

Her şekil sorgusu, her biri bir bileşen kısıtlamaları kümesi ve bileşenler arasındaki bağımlılıkları listeleyerek bir dizi şekil kısıtlaması olan bir şekil bileşenleri kümesi tarafından tanımlanır. Bu örnek tek bir bileşen tanımında üç kısıtlama içerir ve bileşenler arasında şekil kısıtlamaları yoktur (yalnızca bir bileşen gibi).

Buna karşılık, II ch şeklinin iki Shape bileşeni ve dört Shape kısıtlaması vardır. Bileşenler, kullanıcının bileşen listesinde (0 ve 1) Bu örnekteki dizin tarafından tanımlanır.

shapeConstraints = new List<ShapeConstraint>()
{
    ShapeConstraint.Create_RectanglesSameLength(0, 1, 0.6f),
    ShapeConstraint.Create_RectanglesParallel(0, 1),
    ShapeConstraint.Create_RectanglesAligned(0, 1, 0.3f),
    ShapeConstraint.Create_AtBackOf(1, 0),
};

Sarmalayıcı işlevleri, özel şekil tanımlarının kolay oluşturulması için Unity modülünde sağlanır. Bileşen ve şekil kısıtlamalarının tam listesi, "ShapeComponentConstraint" ve "ShapeConstraint" yapıları içinde "SpatialUnderstandingDll. cs" içinde bulunabilir.

Bu yüzeyde dikdörtgen şekli bulundu
Bu yüzeyde dikdörtgen şekli bulundu

Nesne yerleştirme çözücü

Nesne yerleştirme çözücü, nesnelerinizi yerleştirmek için fiziksel odadaki ideal konumları belirlemek için kullanılabilir. Çözücü, nesne kuralları ve kısıtlamaları verilen en iyi sığdırma konumunu bulur. Ayrıca nesne sorguları, nesne "Solver_RemoveObject" veya "Solver_RemoveAllObjects" çağrılarında kaldırılana kadar kalıcı hale gelene kadar, kısıtlanmış çok nesneli yerleştirme sağlar. Nesne yerleştirme sorguları üç bölümden oluşur: parametrelere sahip yerleştirme türü, kuralların listesi ve kısıtlamaların listesi. Bir sorgu çalıştırmak için aşağıdaki API 'yi kullanın.

public static int Solver_PlaceObject(
            [In] string objectName,
            [In] IntPtr placementDefinition,        // ObjectPlacementDefinition
            [In] int placementRuleCount,
            [In] IntPtr placementRules,             // ObjectPlacementRule
            [In] int constraintCount,
            [In] IntPtr placementConstraints,       // ObjectPlacementConstraint
            [Out] IntPtr placementResult)

Bu işlev bir nesne adı, yerleştirme tanımı ve kural ve kısıtlamaların bir listesini alır. C# sarmalayıcıları kural ve kısıtlama oluşturmayı kolay hale getirmek için oluşturma Yardımcısı işlevlerini sağlar. Yerleştirme tanımı sorgu türünü (yani, aşağıdakilerden biri) içerir.

public enum PlacementType
{
    Place_OnFloor,
    Place_OnWall,
    Place_OnCeiling,
    Place_OnShape,
    Place_OnEdge,
    Place_OnFloorAndCeiling,
    Place_RandomInAir,
    Place_InMidAir,
    Place_UnderFurnitureEdge,
};

Yerleştirme türlerinin her biri, türü için benzersiz bir parametre kümesine sahiptir. "ObjectPlacementDefinition" yapısı, bu tanımları oluşturmak için bir statik yardımcı işlevler kümesi içerir. Örneğin, bir nesneyi kata yerleştirmek için bir yer bulmak için aşağıdaki işlevi kullanabilirsiniz. ortak statik ObjectPlacementDefinition Create_OnFloor (Vector3 yarı) yerleştirme türüne ek olarak, bir dizi kural ve kısıtlama sağlayabilirsiniz. Kurallar ihlal edilemez. Tür ve kuralları karşılayan olası yerleştirme konumları, en uygun yerleştirme konumunu seçmek için kısıtlamalar kümesine göre iyileştirilir. Kuralların ve kısıtlamaların her biri, belirtilen statik oluşturma işlevleri tarafından oluşturulabilir. Örnek bir kural ve kısıtlama oluşturma işlevi aşağıda verilmiştir.

public static ObjectPlacementRule Create_AwayFromPosition(
    Vector3 position, float minDistance)
public static ObjectPlacementConstraint Create_NearPoint(
    Vector3 position, float minDistance = 0.0f, float maxDistance = 0.0f)

Aşağıdaki nesne yerleştirme sorgusu, bir yarı ölçüm küpünü bir yüzey kenarına, daha önce yer alan nesnelerden uzağa ve odanın ortasına yakın bir yere yerleştirmede bir yer arıyor.

List<ObjectPlacementRule> rules =
    new List<ObjectPlacementRule>() {
        ObjectPlacementRule.Create_AwayFromOtherObjects(1.0f),
    };

List<ObjectPlacementConstraint> constraints =
    new List<ObjectPlacementConstraint> {
        ObjectPlacementConstraint.Create_NearCenter(),
    };

Solver_PlaceObject(
    “MyCustomObject”,
    new ObjectPlacementDefinition.Create_OnEdge(
        new Vector3(0.25f, 0.25f, 0.25f),
        new Vector3(0.25f, 0.25f, 0.25f)),
    rules.Count,
    UnderstandingDLL.PinObject(rules.ToArray()),
    constraints.Count,
    UnderstandingDLL.PinObject(constraints.ToArray()),
    UnderstandingDLL.GetStaticObjectPlacementResultPtr());

Başarılı olursa, yerleştirme konumunu, boyutları ve yönlendirmeyi içeren bir "ObjectPlacementResult" yapısı döndürülür. Ayrıca, yerleştirme dll 'nin yerleştirilmiş nesnelerin iç listesine eklenir. Sonraki yerleştirme sorguları, bu nesneyi hesaba götürür. Unity örneğindeki "Levelçözücü. cs" dosyası daha fazla örnek sorgu içerir.

Nesne yerleştirme sonuçları
Şekil 3: mavi sorgularda, kamera konumu kurallarından uzağa doğru üç yerden elde edilen sonucun

Bir düzey veya uygulama senaryosu için gereken birden çok nesnenin yerleştirme konumunu çözerken, bir alanın bulunabileceği olasılığını en üst düzeye çıkarmak için önce olmazdır ve büyük nesneleri çözün. Yerleştirme sırası önemlidir. Nesne yerleşimi bulunamazsa, daha az kısıtlanmış yapılandırma deneyin. Bir dizi geri dönüş yapılandırması, birçok oda yapılandırmasında işlevselliği desteklemek için kritik öneme sahiptir.

Oda tarama Işlemi

HoloLens tarafından sunulan uzamsal eşleme çözümü, sorun alanlarının tamamının tüm gamutunun ihtiyaçlarını karşılayacak kadar genel olacak şekilde tasarlandığından, uzamsal anlama modülü, iki belirli oyun ihtiyaçlarını destekleyecek şekilde oluşturulmuştur. Çözümü, aşağıda özetlenen belirli bir işlem ve varsayımlar kümesi etrafında yapılandırılır.

Fixed size playspace – The user specifies the maximum playspace size in the init call.

One-time scan process –
    The process requires a discrete scanning phase where the user walks around,
    defining the playspace.
    Query functions will not function until after the scan has been finalized.

Kullanıcı odaklı Playspace "boyama" – tarama aşamasında Kullanıcı, dahil olmak üzere alanları etkin bir şekilde boyayarak oynatılır ve bu hızda geziniyor. Oluşturulan kafes, bu aşamada Kullanıcı geri bildirimi sağlamak için önemlidir. Ana veya Office kurulumu: sorgu işlevleri, düz yüzeyler ve duvarlar etrafında doğru açılarda tasarlanır. Bu, geçici bir kısıtlamadır. Öte yandan, tarama aşamasında birincil eksen analizi, büyük ve küçük eksen boyunca kafes mozaik. Dahil edilen Spatialanlamamı. cs dosyası tarama aşaması işlemini yönetir. Aşağıdaki işlevleri çağırır.

SpatialUnderstanding_Init – Called once at the start.

GeneratePlayspace_InitScan – Indicates that the scan phase should begin.

GeneratePlayspace_UpdateScan_DynamicScan –
    Called each frame to update the scanning process. The camera position and
    orientation is passed in and is used for the playspace painting process,
    described above.

GeneratePlayspace_RequestFinish –
    Called to finalize the playspace. This will use the areas “painted” during
    the scan phase to define and lock the playspace. The application can query
    statistics during the scanning phase as well as query the custom mesh for
    providing user feedback.

Import_UnderstandingMesh –
    During scanning, the “SpatialUnderstandingCustomMesh” behavior provided by
    the module and placed on the understanding prefab will periodically query the
    custom mesh generated by the process. In addition, this is done once more
    after scanning has been finalized.

"Spatialbiliyor" davranışı tarafından yönetilen tarama akışı, ınitscan ' i çağırır ve sonra her çerçeveye UpdateScan. İstatistik sorgusu makul kapsamı bildirdiğinde, kullanıcının, tarama aşamasının sonunu belirtmek için Requestend çağrısı yapmasına izin verilir. UpdateScan, dönüş değeri dll 'nin işleme tamamlandığını gösterdiği sürece çağrılmaya devam eder.

Kafesi anlama

Anlama dll 'si, Playspace 'i 8 cm boyutlu Voxel küplerinin bir kılavuzu olarak dahili olarak depolar. Taramanın ilk bölümünde, odanın eksenlerini belirleyecek birincil bir bileşen analizi tamamlanmıştır. Dahili olarak, Voxel alanını bu eksenlere hizalı olarak depolar. Voxel biriminden ikizsel yüzey ayıklanarak bir ağ yaklaşık olarak her saniye oluşturulur.

Voxel biriminden üretilen oluşturulmuş kafes
Voxel biriminden üretilen oluşturulmuş kafes

Sorun giderme

  • Spatialperception özelliğini ayarlamış olduğunuzdan emin olun
  • İzleme kaybedildiği zaman, sonraki Onsurcede değiştirilen olay tüm kafesleri kaldırır.

Karma Gerçeklik araç setinde uzamsal eşleme

Karma Gerçeklik araç seti ile uzamsal eşleme kullanma hakkında daha fazla bilgi için, MRTK docs 'ın uzamsal tanıma bölümüne bakın.

Sonraki geliştirme kontrol noktası

Belirlediğimiz Unity geliştirme yolculuğunu takip ediyorsanız, MRTK çekirdeği oluşturma bloklarını araştırırken Orta ölçekli olursunuz. Buradan, sonraki yapı bloğuna devam edebilirsiniz:

Ya da karma gerçeklik platformu özelliklerine ve API 'Lerine atlayın:

Her zaman Unity geliştirme kontrol noktalarına dilediğiniz zaman geri dönebilirsiniz.

Ayrıca bkz.