Prostorové mapování v Unity

prostorové mapování umožňuje načíst trojúhelníkové sítě, které reprezentují povrchy v celém světě kolem zařízení HoloLens. Data Surface můžete použít k umístění, překrytí a analýze místností, abyste svým projektům Unity poskytovali mimořádnou dávku s ponořením.

Unity obsahuje úplnou podporu pro prostorové mapování, která se zveřejňují vývojářům následujícími způsoby:

  1. Komponenty prostorového mapování dostupné v MixedRealityToolkit, které poskytují pohodlný a rychlý způsob, jak začít s prostorovým mapováním
  2. Rozhraní API pro víceúrovňové mapování na nižší úrovni, která poskytují úplné řízení a umožňují přesnější přizpůsobení pro konkrétní aplikace

Pokud chcete ve své aplikaci použít územní mapování, musí být funkce SpatialPerception nastavená ve vašich AppxManifest.

Podpora zařízení

Funkce HoloLens (první gen) HoloLens 2 Moderní sluchátka
Územní mapování ✔️ ✔️

Nastavení schopnosti SpatialPerception

Aby aplikace mohla využívat data s prostorovými mapováními, musí být povolená funkce SpatialPerception.

Jak povolit funkci SpatialPerception:

  1. v editoru Unity otevřete podokno "aktér Nastavení" (upravit Project Nastavení > player).
  2. vyberte na kartě Windows Store .
  3. rozbalte publikování Nastavení a v seznamu Capabilities ověřte schopnost "SpatialPerception" .

Poznámka

pokud jste už projekt Unity exportovali do řešení Visual Studio, budete muset buď exportovat do nové složky, nebo tuto možnost ručně nastavit v AppxManifest v Visual Studio.

Prostorové mapování vyžaduje také MaxVersionTested alespoň 10.0.10586.0:

  1. v Visual Studio klikněte pravým tlačítkem na soubor Package. appxmanifest v Průzkumník řešení a vyberte zobrazit kód.
  2. Najděte řádek určující TargetDeviceFamily a změňte MaxVersionTested = "10.0.10240.0" na MaxVersionTested = "10.0.10586.0" .
  3. Uložte balíček. appxmanifest.

Postup přidání mapování v Unity

Systém pro povědomí prostorů

V MRTK se podívejte na příručka Začínáme s prostorovým zobrazením informací o nastavení různých pozorovatelů prostorové mřížky.

Informace o pozorovatelích zařízení v zařízeních najdete v části Konfigurace pozorovatelů pro sítě pro Průvodce zařízením .

Informace o tom, jak porozumět pozorovatelům, najdete v příručce pro pozorovatele na scéně .

Analytická síť na vyšší úrovni: prostorové porozumění

Upozornění

Prostorové porozumění se už nepoužívá ve prospěch porozumění scény.

MixedRealityToolkit je kolekce programového kódu pro holografický vývoj postavená na holografických rozhraních API Unity.

Prostorové porozumění

Při umísťování hologramů do fyzického světa je často vhodné jít i nad rámec prostorového mapování a rovin Surface. Až se umístění provede v procedurálních případech, je žádoucí vyšší úroveň porozumění v oblasti životního prostředí. To obvykle vyžaduje rozhodování o tom, co je podlaha, strop a zdi. Máte také možnost optimalizovat proti sadě omezení umístění k určení nejlepšího fyzického umístění pro holografické objekty.

V průběhu vývoje mladých conker a fragmentů ASOBO studia čelí tomuto problému na základě vývoje laboratorního Řešitele. Každá z těchto her má potřeby pro konkrétní hry, ale sdílela si základní prostorové porozumění technologii. Knihovna HoloToolkit. SpatialUnderstanding zapouzdřuje tuto technologii, což vám umožní rychle najít prázdné mezery na stěnách, umístit objekty do stropu, identifikovat znak, který se má vložit, a nesčetných další prostorové porozumění dotazům.

Je zahrnutý všechen zdrojový kód, který vám umožní přizpůsobit ho vašim potřebám a sdílet vaše vylepšení s komunitou. Kód pro Řešitele C++ byl zabalen do knihovny UWP dll a zpřístupněný v Unity s prefabem obsaženým v MixedRealityToolkit.

Porozumění modulům

Modul zveřejňuje tři primární rozhraní: topologie pro jednoduché Surface a prostorové dotazy, obrazec pro detekci objektů a Řešitel umístění objektu pro umístění sad objektů na základě omezení. Každá z nich je popsána níže. Kromě tří primárních modulů je možné pomocí rozhraní přetypování do pole načíst typy tagovaného povrchu a zkopírovat vlastní vodotěsnou Playspace síť.

Obsazení Ray

Po dokončení kontroly místnosti se popisy vygenerují interně pro povrchy, jako jsou podlahová, strop a zdi. PlayspaceRaycastFunkce bere v poli hodnotu ray a vrátí, pokud se Ray střetem se známým povrchem, a pokud ano, informace o tomto povrchu ve formě 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;
};

Interně je raycast vypočítán proti vypočítané 8-cm třetí reprezentace Voxel reprezentace Playspace. Každý Voxel obsahuje sadu prvků povrchu se zpracovanými daty topologie (neboli surfels). Surfels obsažená v buňce protínající Voxel je porovnána s nejlepší shodou použitou k vyhledání informací o topologii. Tato data topologie obsahují označení vracené ve formě výčtu "SurfaceTypes" a také oblast povrchu protínající se plochy.

V ukázce Unity přetypování ukazatelem na každý snímek. Nejdřív, proti kolizím v Unity. Za sekundu, na základě světové reprezentace modulu. A nakonec znovu prvky uživatelského rozhraní. V této aplikaci má uživatelské rozhraní prioritu, další výsledek porozumění a nakonec kokolizi Unity. SurfaceType je hlášen jako text vedle kurzoru.

Typ povrchu je označený vedle kurzoru.
Typ povrchu je označený vedle kurzoru.

Dotazy topologie

V rámci knihovny DLL zpracovává správce topologie označování prostředí. Jak je uvedeno výše, většina dat je uložená v rámci surfels, která je obsažená ve svazku voxel. Struktura "PlaySpaceInfos" se navíc používá k ukládání informací o Playspace, včetně zarovnání světa (další podrobnosti najdete níže), patra a výšky stropu. Heuristiky se používají k určení podlahové, horní meze a zdí. Například největší a nejnižší vodorovný povrch s větší než 1-m2 Surface je považován za podlahovou plochu.

Poznámka

V tomto procesu se používá také cesta kamery během procesu skenování.

Podmnožina dotazů zveřejněných správcem topologie se zveřejňuje prostřednictvím knihovny DLL. Zveřejněné dotazy topologie jsou následující.

QueryTopology_FindPositionsOnWalls
QueryTopology_FindLargePositionsOnWalls
QueryTopology_FindLargestWall
QueryTopology_FindPositionsOnFloor
QueryTopology_FindLargestPositionsOnFloor
QueryTopology_FindPositionsSittable

Každý z dotazů má sadu parametrů, které jsou specifické pro typ dotazu. V následujícím příkladu uživatel určí šířku minimální výšky & požadovaného svazku, minimální výšku umístění nad podlahou a minimální velikost prostoru před svazkem. Všechna měření jsou v měřičích.

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)

Každý z těchto dotazů přijímá předem vyhrazené pole struktur "TopologyResult". Parametr "locationCount" Určuje délku předaného pole. Vrácená hodnota hlásí počet vrácených umístění. Tento počet není nikdy větší než předaný parametr "locationCount".

"TopologyResult" obsahuje střední polohu vráceného svazku, směrem ke směru (tj. normální) a rozměrů nalezeného prostoru.

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

Poznámka

V ukázce Unity se každý z těchto dotazů odkazuje na tlačítko na panelu virtuálního uživatelského rozhraní. Ukázky pevných kódů parametrů pro každý z těchto dotazů na rozumnou hodnotu. Další příklady najdete v tématu SpaceVisualizer. cs v ukázkovém kódu.

Dotazy obrazce

Analyzátor obrazců ("ShapeAnalyzer_W") v knihovně DLL používá analyzátor topologie k porovnání s vlastními tvary definovanými uživatelem. Ukázka Unity definuje sadu obrazců a zpřístupňuje výsledky prostřednictvím nabídky dotazu v aplikaci na kartě Shape (tvar). Záměrem je, že uživatel může definovat vlastní dotazy obrazce objektu a využívat je podle potřeby jejich aplikace.

Analýza obrazce funguje pouze na horizontálních površích. Couch, například, je definován plochým sedadlem a plochým horním okrajem Couch zpátky. Dotaz obrazce vyhledává dva povrchy určité velikosti, výšky a rozsahu stran, přičemž se tyto dvě plochy zarovnají a připojují. Pomocí terminologie rozhraní API, Couch a back-Top jsou komponenty tvarů a požadavky na zarovnání jsou omezení komponenty obrazce.

Vzorový dotaz definovaný v ukázce Unity (ShapeDefinition. cs) pro objekty sittable je následující.

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);

Každý dotaz obrazce je definován sadou komponent Shape, každou se sadou omezení komponenty a sadou omezení tvaru, které vypisují závislosti mezi komponentami. Tento příklad obsahuje tři omezení v rámci jedné definice komponenty a žádné omezení obrazce mezi komponentami (stejně jako jedna součást).

Naproti tomu má obrazec Couch dvě součásti obrazce a čtyři omezení obrazce. Komponenty jsou identifikovány podle indexu v seznamu součástí uživatele (v tomto příkladu je to 0 a 1).

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),
};

Funkce obálky jsou k dispozici v modulu Unity pro snadné vytváření definic vlastních tvarů. Úplný seznam omezení součásti a obrazce najdete v části "SpatialUnderstandingDll. cs" v rámci struktur "ShapeComponentConstraint" a "ShapeConstraint".

Na tomto povrchu se našel obdélníkový obrazec.
Na tomto povrchu se našel obdélníkový obrazec.

Řešitel umístění objektu

Řešitel umístění objektu lze použít k identifikaci ideálních míst ve fyzické místnosti pro umístění vašich objektů. Řešitel vyhledá nejlepší umístění podle pravidel a omezení objektu. Kromě toho jsou dotazy objektů trvalé, dokud není objekt odstraněn pomocí volání "Solver_RemoveObject" nebo "Solver_RemoveAllObjects", což umožňuje omezené umístění více objektů. Objekty dotazování na umístění se skládají ze tří částí: typ umístění s parametry, seznam pravidel a seznam omezení. Pokud chcete spustit dotaz, použijte následující rozhraní API.

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)

Tato funkce přijímá název objektu, definici umístění a seznam pravidel a omezení. Obálky jazyka C# poskytují pomocné funkce konstrukce, které usnadňují konstrukci pravidla a omezení. Definice umístění obsahuje typ dotazu – to je jedna z následujících.

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

Každé typy umístění má sadu parametrů, které jsou pro daný typ jedinečné. Struktura "ObjectPlacementDefinition" obsahuje sadu statických pomocných funkcí pro vytváření těchto definic. Chcete-li například najít místo pro vložení objektu do podlahy, můžete použít následující funkci. veřejné statické ObjectPlacementDefinition Create_OnFloor (Vector3 halfDims) kromě typu umístění můžete zadat sadu pravidel a omezení. Pravidla nelze porušovat. Možná umístění umístění, která odpovídají typu a pravidla, jsou optimalizována proti sadě omezení, aby bylo možné vybrat optimální umístění umístění. Každé pravidlo a omezení lze vytvořit pomocí funkcí statického vytvoření. Ukázková funkce pravidla a konstrukce omezení je uvedená níže.

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

Následující dotaz na umístění objektu hledá místo pro vložení datové krychle o poloviční měřiči na okraji povrchu, a to od jiných objektů, které dříve umístily do středu místnosti.

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());

V případě úspěchu se vrátí struktura "ObjectPlacementResult", která obsahuje umístění, rozměry a orientaci umístění. Kromě toho je umístění přidáno do interního seznamu umístěných objektů knihovny DLL. Další dotazy na umístění budou tento objekt brát v úvahu. Soubor "LevelSolver. cs" v ukázce Unity obsahuje další příklady dotazů.

Výsledky umístění objektu
Obrázek 3: modré čtverečky, jak výsledek ze tří míst v dotazech na podlaze s pryč z pravidel pozice kamery

Při řešení umístění umístění více objektů potřebných pro daný scénář nebo pro aplikaci nejprve vyřešte nepostradatelné a velké objekty, aby bylo možné maximalizovat pravděpodobnost, že se místo nachází. Pořadí umístění je důležité. Pokud nejde najít umístění objektu, zkuste méně omezené konfigurace. Sada záložních konfigurací je zásadní pro podporu funkcí napříč mnoha konfiguracemi místností.

Proces skenování místností

i když je řešení mapování prostorů poskytované HoloLens navržené tak, aby splňovalo potřeby celého škály problematických prostorů, byl modul prostorového porozumění sestavený tak, aby podporoval požadavky dvou konkrétních her. Jeho řešení je strukturované kolem konkrétního procesu a sady předpokladů, které jsou shrnuty níže.

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.

Uživatelem řízený Playspace "Malování" – během fáze skenování se uživatel pohybuje a hledá v průběhu přehrávání a efektivně vybarví oblasti, které by měly být zahrnuty. Vygenerovaná síť je důležitá k poskytnutí zpětné vazby uživatele v této fázi. Nastavení pro domovskou plochu nebo instalační program Office – funkce dotazu jsou navržené kolem plochých a zdí na pravé úhly. Toto je tiché omezení. Během fáze prohledávání se ale dokončila analýza primární osy, která optimalizuje teselaci mřížky podél hlavní a vedlejší osy. Zahrnutý soubor SpatialUnderstanding. cs spravuje proces fáze skenování. Volá následující funkce.

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.

Tok skenování řízený chováním "SpatialUnderstanding" volá InitScan a potom každý snímek UpdateScan. Když dotaz statistiky oznámí přiměřené pokrytí, uživatel může airtap volat RequestFinish a označit konec fáze prohledávání. Hodnota UpdateScan je nadále volána, dokud její vrácená hodnota neindikuje, že knihovna DLL dokončila zpracování.

Princip sítě

Porozumění DLL interně ukládá Playspace jako mřížku Voxel datových krychlí velikosti 8 cm. Během prvotní části kontroly je dokončena analýza primární komponenty, která určuje osy místnosti. Interně ukládá své Voxel místo zarovnané na tyto osy. Síť se vygeneruje přibližně každou sekundu extrakcí isosurface ze svazku voxel.

Vygenerovaná síť vytvořená ze svazku Voxel
Vygenerovaná síť vytvořená ze svazku Voxel

Řešení potíží

  • Ujistěte se, že jste nastavili funkci SpatialPerception
  • Když se sledování ztratí, další událost OnSurfaceChanged odstraní všechny sítě.

Územní mapování ve smíšené realitě Toolkit

další informace o použití územního mapování se smíšenými Toolkitmi realit najdete v části věnované prostorům na vědomí v dokumentaci MRTK.

Další kontrolní bod vývoje

Pokud sledujete svou cestu pro vývoj Unity, jste v průběhui zkoumání MRTK základních stavebních bloků. Odsud můžete pokračovat k dalšímu stavebnímu bloku:

Nebo se můžete přecházet na možnosti hybridních platforem pro realitu a rozhraní API:

Kdykoli se můžete kdykoli vrátit k kontrolním bodům vývoje Unity .

Viz také