Rumslig mappning

Rumslig mappning ger en detaljerad representation av verkliga ytor i miljön runt HoloLens, vilket gör det möjligt för utvecklare att skapa en övertygande mixad verklighetsupplevelse. Genom att slå samman den verkliga världen med den virtuella världen kan ett program få hologram att verka verkliga. Program kan också mer naturligt anpassa sig till användarnas förväntningar genom att tillhandahålla välbekanta verkliga beteenden och interaktioner.


Enheten stöder

Funktion HoloLens (första generationen) HoloLens 2 Integrerande headset
Rumslig mappning ✔️ ✔️

Varför är rumslig mappning viktigt?

Rumslig mappning gör det möjligt att placera objekt på verkliga ytor. Detta hjälper till att förankra objekt i användarens värld och dra nytta av verkliga djupsignaler. Om du ocksuderar dina hologram baserat på andra hologram och verkliga objekt kan du övertyga användaren om att dessa hologram faktiskt finns i deras utrymme. Hologram som flyter i rymden eller flyttas med användaren kommer inte att kännas lika verkliga. När det är möjligt, placera föremål för komfort.

Visualisera ytor när du placerar eller flyttar hologram (använd ett projicerat rutnät). Detta hjälper användarna att veta var de bäst kan placera sina hologram och visar om den plats de försöker placera hologrammet inte är mappat. Du kan "affischtavlor" mot användaren om de hamnar i för mycket vinkel.

Begreppsmässig översikt

Nätytor som täcker ett rum
Ett exempel på ett rumsligt mappningsnät som täcker ett rum

De två primära objekttyperna som används för rumslig mappning är "Spatial Surface Observer" och "Spatial Surface".

Programmet ger Spatial Surface Observer en eller flera avgränsningsvolymer för att definiera de områden i utrymmet där programmet vill ta emot spatiala mappningsdata. För var och en av dessa volymer ger rumslig mappning programmet en uppsättning rumsliga ytor.

Dessa volymer kan vara stationära (på en fast plats baserat på den verkliga världen) eller så kan de kopplas till HoloLens (de flyttas, men roterar inte, med HoloLens när de rör sig genom miljön). Varje rumslig yta beskriver verkliga ytor i en liten rymdvolym, representerad som ett triangelnät som är kopplat till ett världslåst rumsligt koordinatsystem.

När HoloLens samlar in nya data om miljön, och när ändringar i miljön sker, visas rumsliga ytor, försvinner och ändras.

Demo för designkoncept för rumslig medvetenhet

Om du vill se designkoncept för rumslig medvetenhet i praktiken kan du titta på vår videodemo Designing Holograms - Spatial Awareness nedan. När du är klar fortsätter du för en mer detaljerad genomgång av specifika ämnen.

Den här videon togs från appen "Designing Holograms" HoloLens 2. Ladda ned och njut av den fullständiga upplevelsen här.

Rumslig mappning jämfört med Scenförståelse WorldMesh

För HoloLens 2 går det att köra frågor mot en statisk version av rumsliga mappningsdata med hjälp av SDK för scentolkning (EnableWorldMesh-inställning). Här är skillnaderna mellan två sätt att komma åt rumsliga mappningsdata:

  • API för rumslig mappning:
    • Begränsat intervall: de spatiala mappningsdata som är tillgängliga för program i en begränsad storlek cachelagrad "bubbla" runt användaren.
    • Ger uppdateringar med korta svarstider för ändrade nätregioner via SurfacesChanged-händelser.
    • Variabel detaljnivå som styrs av trianglar per kubikmeterparameter.
  • SDK för scentolkning:
    • Obegränsat intervall – innehåller alla skannade rumsliga mappningsdata inom frågeradien.
    • Ger en statisk ögonblicksbild av spatial mappningsdata. För att hämta uppdaterade rumsliga mappningsdata måste du köra en ny fråga för hela nätet.
    • Konsekvent informationsnivå som styrs av inställningen RequestedMeshLevelOfDetail.

Vad påverkar kvaliteten på rumslig mappning?

Flera faktorer, som beskrivs här, kan påverka frekvensen och allvarlighetsgraden för dessa fel. Du bör dock utforma ditt program så att användaren kan uppnå sina mål även om det finns fel i spatial mappningsdata.

Vanliga användningsscenarier

Illustrationer av vanliga användningsscenarier för rumslig mappning: Placering, ocklusion, fysik och navigering

Placering

Rumslig mappning ger program möjlighet att presentera naturliga och välbekanta former av interaktion för användaren. vad kan vara mer naturligt än att lägga ner telefonen på skrivbordet?

Att begränsa placeringen av hologram (eller mer allmänt val av rumsliga platser) att ligga på ytor ger en naturlig mappning från 3D (punkt i rymden) till 2D (punkt på ytan). Detta minskar mängden information som användaren behöver tillhandahålla programmet och gör användarens interaktioner snabbare, enklare och mer exakta. Detta är sant eftersom "avstånd bort" inte är något som vi är vana vid att fysiskt kommunicera med andra människor eller till datorer. När vi pekar med fingret anger vi en riktning men inte ett avstånd.

En viktig varning här är att när ett program härleder avstånd från riktning (till exempel genom att göra en raycast längs användarens blickriktning för att hitta närmaste rumsliga yta), måste detta ge resultat som användaren kan förutsäga på ett tillförlitligt sätt. Annars förlorar användaren sin kontrollkänsla och det kan snabbt bli frustrerande. En metod som hjälper till med detta är att göra flera raycasts i stället för bara en. Aggregerade resultat bör vara smidigare och mer förutsägbara, mindre mottagliga för påverkan från tillfälliga "avvikare" resultat (som kan orsakas av strålar som passerar genom små hål eller slår små bitar av geometri som användaren inte känner till). Sammansättning eller utjämning kan också utföras över tid. Du kan till exempel begränsa den maximala hastighet med vilken ett hologram kan variera i avstånd från användaren. Att bara begränsa minimi- och maxavståndsvärdet kan också hjälpa, så att hologrammet som flyttas inte plötsligt flyger iväg i avståndet eller kraschar tillbaka in i användarens ansikte.

Program kan också använda formen och riktningen på ytorna för att styra hologramplaceringen. En holografisk stol bör inte penetrera genom väggar och bör sitta spola med golvet även om det är något ojämnt. Den här typen av funktioner skulle sannolikt förlita sig på användningen av fysikkollisioner snarare än raycasts, men liknande problem kommer att gälla. Om hologrammet som placeras har många små polygoner som sticker ut, som benen på en stol, kan det vara meningsfullt att utöka fysikrepresentationen av dessa polygoner till något bredare och smidigare så att de är mer kapabla att glida över rumsliga ytor utan att tjata.

I yttersta fall kan användarindata förenklas helt och hållet och rumsliga ytor kan användas för att göra helt automatisk hologramplacering. Programmet kan till exempel placera en holografisk ljusswitch någonstans på väggen så att användaren kan trycka. Samma förbehåll om förutsägbarhet gäller dubbelt här; Om användaren förväntar sig kontroll över hologramplaceringen, men programmet inte alltid placerar hologram där de förväntar sig (om ljusswitchen visas någonstans som användaren inte kan nå), blir detta en frustrerande upplevelse. Det kan faktiskt vara värre att göra automatisk placering som kräver användarkorrigering en del av tiden, än att bara kräva att användaren alltid gör placering själva; eftersom en lyckad automatisk placering förväntas känns manuell korrigering som en börda!

Observera också att möjligheten för ett program att använda rumsliga ytor för placering beror mycket på programmets genomsökningsupplevelse. Om en yta inte har genomsökts kan den inte användas för placering. Det är upp till programmet att göra detta klart för användaren, så att de antingen kan hjälpa till att skanna nya ytor eller välja en ny plats.

Visuell feedback till användaren är av största vikt under placeringen. Användaren måste veta var hologrammet baseras på närmaste yta med jordningseffekter. De bör förstå varför förflyttningen av deras hologram begränsas (till exempel på grund av kollisioner med en annan närliggande yta). Om de inte kan placera ett hologram på den aktuella platsen bör visuell feedback göra det tydligt varför inte. Om användaren till exempel försöker placera en holografisk soffa som fastnat halvvägs in i väggen, bör de delar av soffan som ligger bakom väggen pulsera i en arg färg. Eller omvänt, om programmet inte kan hitta en rumslig yta på en plats där användaren kan se en verklig yta, bör programmet göra detta tydligt. Den uppenbara avsaknaden av en grundeffekt på detta område kan uppnå detta syfte.

Ocklusion

En av de primära användningsområdena för rumsliga mappningsytor är helt enkelt att occlude hologram. Detta enkla beteende har en enorm inverkan på den upplevda realismen hos hologram, vilket bidrar till att skapa en visceral känsla som verkligen bor i samma fysiska utrymme som användaren.

Ocklusion ger också information till användaren; När ett hologram verkar vara occluded av en verklig yta ger detta extra visuell feedback om hologrammets rumsliga plats i världen. Ocklusion kan också på ett användbart sätt dölja information från användaren. att occludera hologram bakom väggar kan minska den visuella röran på ett intuitivt sätt. För att dölja eller visa ett hologram behöver användaren bara flytta huvudet.

Ocklusion kan också användas för att uppfylla förväntningarna på ett naturligt användargränssnitt baserat på välbekanta fysiska interaktioner; Om ett hologram ockluseras av en yta beror det på att den ytan är fast, så användaren bör förvänta sig att hologrammet kolliderar med den ytan och inte passerar genom den.

Ibland är ocklusion av hologram oönskade. Om en användare behöver interagera med ett hologram måste de se det – även om det ligger bakom en verklig yta. I sådana fall är det vanligtvis klokt att återge ett sådant hologram på ett annat sätt när det är ockluderat (till exempel genom att minska dess ljusstyrka). På så sätt kan användaren visuellt hitta hologrammet, men de vet fortfarande att det finns bakom något.

Fysik

Användningen av fysiksimulering är ett annat sätt på vilket rumslig mappning kan användas för att förstärka förekomsten av hologram i användarens fysiska utrymme. När min holografiska gummiboll rullar realistiskt från mitt skrivbord, studsar över golvet och försvinner under soffan, kan det vara svårt för mig att tro att den inte är där.

Fysiksimulering ger också möjlighet för ett program att använda naturliga och välbekanta fysikbaserade interaktioner. Att flytta en bit holografiska möbler runt på golvet kommer sannolikt att vara lättare för användaren om möblerna svarar som om den glider över golvet med lämplig tröghet och friktion.

För att generera realistiska fysiska beteenden behöver du förmodligen utföra viss nätbearbetning , till exempel fylla hål, ta bort flytande hallucinationer och jämna ut grova ytor.

Du måste också tänka på hur programmets skanningsupplevelse påverkar dess fysiksimulering. För det första kommer saknade ytor inte att kollidera med någonting; vad händer när gummibollen rullar av i korridoren och utanför slutet av den kända världen? För det andra måste du bestämma om du ska fortsätta att svara på ändringar i miljön över tid. I vissa fall vill du svara så snabbt som möjligt. säg om användaren använder dörrar och möbler som flyttbara barrikader i försvar mot en storm av inkommande romerska pilar. I andra fall kanske du vill ignorera nya uppdateringar. kör din holografiska sportbil runt racerbanan på ditt golv kanske plötsligt inte är så roligt om din hund bestämmer sig för att sitta mitt på banan.

Program kan använda spatial mappningsdata för att ge holografiska tecken (eller agenter) möjlighet att navigera i den verkliga världen på samma sätt som en verklig person skulle göra. Detta kan hjälpa till att förstärka förekomsten av holografiska tecken genom att begränsa dem till samma uppsättning naturliga, välbekanta beteenden som användarens och deras vänners.

Navigeringsfunktioner kan också vara användbara för användarna. När en navigeringskarta har skapats i ett visst område kan den delas för att ge holografiska anvisningar för nya användare som inte känner till den platsen. Denna karta kan utformas för att hjälpa till att hålla fotgängare "trafik" flytande smidigt, eller för att undvika olyckor på farliga platser som byggarbetsplatser.

De viktigaste tekniska utmaningarna med att implementera navigeringsfunktioner är tillförlitlig identifiering av gångbara ytor (människor går inte på bord!) och en korrekt anpassning till förändringar i miljön (människor går inte genom stängda dörrar!). Nätet kan kräva viss bearbetning innan det kan användas för sökvägsplanering och navigering med ett virtuellt tecken. Att jämna ut nätet och ta bort hallucinationer kan hjälpa till att undvika att tecken fastnar. Du kanske också vill förenkla nätet drastiskt för att påskynda din karaktärs vägplanerings- och navigeringsberäkningar. Dessa utmaningar har fått stor uppmärksamhet i utvecklingen av videospelsteknik, och det finns en mängd tillgänglig forskningslitteratur om dessa ämnen.

De inbyggda NavMesh-funktionerna i Unity kan inte användas som standard för rumsliga mappningsytor eftersom ytorna inte är kända förrän programmet startar. Du kan dock skapa en NavMesh under körning genom att installera NavMeshComponents. Observera att det rumsliga mappningssystemet inte ger information om ytor långt bort från användarens aktuella plats. om du vill skapa en karta över ett stort område måste programmet "komma ihåg" ytor. Du kan också öka inställningen för observationsområden i profilen för rumslig medvetenhet, vilket ökar det område där du kan bygga navMesh.

Visualisering

För det mesta är det lämpligt att rumsliga ytor är osynliga; för att minimera den visuella röran och låta den verkliga världen tala för sig själv. Ibland är det dock användbart att visualisera rumsliga mappningsytor direkt, trots att deras verkliga motsvarigheter är synliga.

När användaren till exempel försöker placera ett hologram på en yta (placera ett holografiskt skåp på väggen, till exempel) kan det vara användbart att "jorda" hologrammet genom att kasta en skugga på ytan. Detta ger användaren en mycket tydligare uppfattning om den exakta fysiska närheten mellan hologrammet och ytan. Det här är också ett exempel på den mer allmänna metoden att visuellt "förhandsgranska" en ändring innan användaren checkar in den.

Genom att visualisera ytor kan programmet dela med användaren sin förståelse av miljön. Till exempel kan ett holografiskt brädspel visualisera de vågräta ytor som det har identifierat som "tabeller", så att användaren vet vart de ska gå för att interagera.

Visualisering av ytor kan vara ett användbart sätt att visa användarens närliggande utrymmen som är dolda från vyn. Detta kan ge användaren åtkomst till köket (och alla dess inneslutna hologram) från deras vardagsrum.

De ytnät som tillhandahålls av rumslig mappning får inte vara särskilt "rena". Det är viktigt att visualisera dem på rätt sätt. Traditionella ljusberäkningar kan markera fel i ytnormalerna visuellt distraherande, medan "rena" texturer som projiceras på ytan kan hjälpa till att ge det ett snyggare utseende. Det går också att utföra nätbearbetning för att förbättra nätegenskaperna innan ytorna renderas.

Anteckning

HoloLens 2 implementerar en ny Scene Understanding Runtime som ger Mixed Reality utvecklare en strukturerad miljörepresentation på hög nivå som är utformad för att förenkla implementeringen av placering, ocklusion, fysik och navigering.

Använda Surface Observer

Startpunkten för rumslig mappning är ytobservatören. Programflödet är följande:

  • Skapa ett objekt för ytobservatör
    • Ange en eller flera rumsliga volymer för att definiera de regioner av intresse som programmet vill ta emot spatiala mappningsdata i. En rumslig volym är helt enkelt en form som definierar ett utrymmesområde, till exempel en sfär eller en ruta.
    • Använd en rumslig volym med ett världslåst rumsligt koordinatsystem för att identifiera en fast region i den fysiska världen.
    • Använd en rumslig volym, uppdatera varje ram med ett kroppslåst rumsligt koordinatsystem för att identifiera en region med utrymme som rör sig (men inte roterar) med användaren.
    • Dessa rumsliga volymer kan ändras senare när som helst, när programmets eller användarens status ändras.
  • Använd avsökning eller avisering för att hämta information om rumsliga ytor
    • Du kan när som helst "avsöka" ytobservatören efter rumslig ytstatus. I stället kan du registrera dig för ytobservatörens händelse "ytor har ändrats", vilket meddelar programmet när rumsliga ytor har ändrats.
    • För en dynamisk rumslig volym, till exempel view frustum eller en kroppslåst volym, måste program söka efter ändringar i varje bildruta genom att ange det intressanta området och sedan hämta den aktuella uppsättningen rumsliga ytor.
    • För en statisk volym, till exempel en världslåst kub som täcker ett enda rum, kan program registrera sig för händelsen "ytor som ändrats" för att meddelas när rumsliga ytor inuti volymen kan ha ändrats.
  • Ändringar av processytor
    • Iterera den angivna uppsättningen rumsliga ytor.
    • Klassificera rumsliga ytor som läggs till, ändras eller tas bort.
    • För varje tillagd eller ändrad rumslig yta skickar du vid behov en asynkron begäran om att få ett uppdaterat nät som representerar ytans aktuella tillstånd på önskad detaljnivå.
  • Bearbeta den asynkrona nätbegäran (mer information finns i följande avsnitt).

Cachelagring av nät

Rumsliga ytor representeras av täta triangelnät. Lagring, rendering och bearbetning av dessa nät kan förbruka betydande beräknings- och lagringsresurser. Därför bör varje program införa ett cachelagringsschema för nät som är lämpligt för dess behov, för att minimera de resurser som används för nätbearbetning och lagring. Detta schema bör bestämma vilka nät som ska behållas och vilka som ska kasseras och när nätet ska uppdateras för varje rumslig yta.

Många av de överväganden som diskuteras där informerar direkt om hur ditt program ska närma sig nätcachelagring. Du bör tänka på hur användaren rör sig genom miljön, vilka ytor som behövs, när olika ytor observeras och när ändringar i miljön ska avbildas.

När du tolkar händelsen "surfaces changed" som tillhandahålls av ytobservatören är den grundläggande cachelagringslogik för nät följande:

  • Om programmet ser ett rumsligt yt-ID som det inte har sett förut bör det behandla detta som en ny rumslig yta.
  • Om programmet ser en rumslig yta med ett känt ID men med en ny uppdateringstid bör den behandla detta som en uppdaterad rumslig yta.
  • Om programmet inte längre ser en rumslig yta med ett känt ID bör det behandla detta som en borttagen rumslig yta.

Det är upp till varje program att sedan göra följande val:

  • För nya rumsliga ytor, bör nät begäras?
    • I allmänhet bör nät begäras omedelbart för nya rumsliga ytor, vilket kan ge användbar ny information till användaren.
    • Nya rumsliga ytor nära och framför användaren bör dock prioriteras och deras nät bör begäras först.
    • Om det nya nätet inte behövs, om till exempel programmet har permanent eller tillfälligt "fryst" sin miljömodell, bör det inte begäras.
  • Ska nät begäras för uppdaterade rumsliga ytor?
    • Uppdaterade rumsliga ytor nära och framför användaren bör prioriteras och deras nät bör begäras först.
    • Det kan också vara lämpligt att prioritera nya ytor högre än för uppdaterade ytor, särskilt under genomsökningen.
    • För att begränsa bearbetningskostnaderna kan program vilja begränsa den hastighet med vilken de bearbetar uppdateringar till rumsliga ytor.
    • Det kan vara möjligt att dra slutsatsen att förändringar av en rumslig yta är mindre, till exempel om ytans gränser är små, i vilket fall uppdateringen kanske inte är tillräckligt viktig för att bearbetas.
    • Uppdateringar till rumsliga ytor utanför användarens aktuella intresseområde kan ignoreras helt och hållet, men i det här fallet kan det vara mer effektivt att ändra de rumsliga avgränsningsvolymer som används av ytobservatören.
  • För borttagna rumsliga ytor, bör nät kasseras?
    • I allmänhet bör nät kasseras omedelbart för borttagna rumsliga ytor, så att hologramocklusionen förblir korrekt.
    • Men om programmet har anledning att tro att en rumslig yta kommer att dyka upp igen inom kort (baserat på användarupplevelsens design), kan det vara mer effektivt att behålla den än att ta bort nätnätet och återskapa det igen senare.
    • Om programmet skapar en storskalig modell av användarens miljö kanske det inte vill ta bort några nät alls. Det kommer dock fortfarande att behöva begränsa resursanvändningen, möjligen genom att buffring av nät till disk när rumsliga ytor försvinner.
    • Vissa relativt sällsynta händelser under generering av rumslig yta kan orsaka att rumsliga ytor ersätts av nya rumsliga ytor på en liknande plats men med olika ID:n. Därför bör program som väljer att inte ta bort en borttagen yta vara noga med att inte hamna med flera mycket överlappande spatiala ytor som täcker samma plats.
  • Bör nät kasseras för andra rumsliga ytor?
    • Även om det finns en rumslig yta bör den tas bort om den inte längre är användbar för användarens upplevelse. Om programmet till exempel "ersätter" rummet på andra sidan av en dörröppning med ett alternativt virtuellt utrymme så spelar de rumsliga ytorna i rummet ingen roll längre.

Här är ett exempel på en cachelagringsstrategi för nät med rumslig och temporal hysteres:

  • Tänk dig ett program som vill använda en frustumformad rumslig volym av intresse som följer användarens blick när de ser sig omkring och går runt.
  • En rumslig yta kan försvinna tillfälligt från den här volymen bara för att användaren tittar bort från ytan eller kliver längre bort från den... bara för att se tillbaka eller rör sig närmare igen en stund senare. I det här fallet representerar borttagning och återskapande av nätet för den här ytan många redundanta bearbetningar.
  • För att minska antalet bearbetade ändringar använder programmet två rumsliga ytobservatörer, en i den andra. Den större volymen är sfärisk och följer användaren "lazily"; den flyttas bara när det behövs för att säkerställa att dess centrum är inom 2,0 meter från användaren.
  • Nya och uppdaterade rumsliga ytnät bearbetas alltid från den mindre inre ytobservatören, men nät cachelagras tills de försvinner från den större yttre ytobservatören. På så sätt kan programmet undvika att bearbeta många redundanta ändringar på grund av lokal användarflytt.
  • Eftersom en rumslig yta också kan försvinna tillfälligt på grund av spårningsförlust, defersar programmet också borttagna rumsliga ytor under spårningsförlust.
  • I allmänhet bör ett program utvärdera kompromissen mellan minskad uppdateringsbearbetning och ökad minnesanvändning för att fastställa dess ideala cachelagringsstrategi.

Rendering

Det finns tre huvudsakliga sätt på vilka nät för rumslig mappning tenderar att användas för återgivning:

  • För ytvisualisering
    • Det är ofta användbart att visualisera rumsliga ytor direkt. Till exempel kan omvandling av "skuggor" från objekt till rumsliga ytor ge användbar visuell feedback till användaren när de placerar hologram på ytor.
    • En sak att tänka på är att rumsliga nät skiljer sig från den typ av nät som en 3D-konstnär kan skapa. Triangeltopologin blir inte lika "ren" som topologin som skapats av människor, och nätet kommer att drabbas av olika fel.
    • För att skapa en tilltalande visuell estetik kanske du vill göra lite nätbearbetning, till exempel för att fylla hål eller släta ytnormaler. Du kanske också vill använda en shader för att projicera konstnärsdesignade texturer på ditt nät i stället för att direkt visualisera nättopologi och normaliseringar.
  • För att occludera hologram bakom verkliga ytor
    • Rumsliga ytor kan renderas i ett pass med endast djup, vilket endast påverkar djupbufferten och inte påverkar mål för färgåtergivning.
    • Detta primer djupbufferten så att den ockluderar efterföljande renderade hologram bakom rumsliga ytor. Korrekt ocklusion av hologram förbättrar känslan av att hologram verkligen finns i användarens fysiska utrymme.
    • Om du vill aktivera återgivning med endast djup uppdaterar du blandningstillståndet för att ange RenderTargetWriteMask till noll för alla mål för färgåtergivning.
  • För att ändra utseendet på hologram occluded av verkliga ytor
    • Normalt renderad geometri döljs när den är occluded. Detta uppnås genom att djupfunktionen i djupstencilens tillstånd anges till "mindre än eller lika med", vilket gör att geometrin bara visas när den är närmare kameran än all tidigare renderad geometri.
    • Det kan dock vara bra att se till att viss geometri är synlig även när den är occluded, och att ändra dess utseende när den är occluded som ett sätt att ge visuell feedback till användaren. Detta gör det till exempel möjligt för programmet att visa användaren platsen för ett objekt samtidigt som det tydliggöras som ligger bakom en verklig yta.
    • För att uppnå detta återger du geometrin en andra gång med en annan skuggning som skapar önskat "occluded"-utseende. Innan du återger geometrin för andra gången gör du två ändringar i tillståndet för djupstencilen. Ställ först in djupfunktionen på "större än eller lika med" så att geometrin endast visas där den är längre från kameran än all tidigare renderad geometri. För det andra anger du DepthWriteMask till noll, så att djupbufferten inte ändras (djupbufferten bör fortsätta att representera djupet i geometrin närmast kameran).

Prestanda är ett viktigt problem vid återgivning av nät för rumslig mappning. Här följer några tekniker för renderingsprestanda som är specifika för återgivning av spatiala mappningsnät:

  • Justera triangeldensitet
    • När du begär rumsliga ytnät från din ytobservatör begär du den lägsta densiteten av triangelnät som räcker för dina behov.
    • Det kan vara meningsfullt att variera triangeldensiteten på en yta efter ytbas, beroende på ytans avstånd från användaren och dess relevans för användarupplevelsen.
    • Att minska antalet trianglar minskar kostnaderna för minnesanvändning och hörnbearbetning på GPU:n, även om det inte påverkar kostnaderna för pixelbearbetning.
  • Använda frustum-gallring
    • Frustum gallring hoppar över ritade objekt som inte kan ses eftersom de är utanför den nuvarande display frustum. Detta minskar både processor- och GPU-bearbetningskostnaderna.
    • Eftersom utslaktning utförs per nät och rumsliga ytor kan vara stora, kan brytning av varje rumsligt ytnät i mindre segment resultera i effektivare utslaktning (eftersom färre trianglar utanför skärmen återges). Det finns dock en kompromiss; Ju fler nät du har, desto fler anrop måste du göra, vilket kan öka CPU-kostnaderna. I ett extremt fall kan frustum-utslaktningsberäkningarna i sig till och med ha en mätbar CPU-kostnad.
  • Justera återgivningsordningen
    • Rumsliga ytor tenderar att vara stora eftersom de representerar användarens hela miljö som omger dem. Kostnaderna för pixelbearbetning på GPU:n kan vara höga, särskilt i fall där det finns mer än ett lager synlig geometri (inklusive både rumsliga ytor och andra hologram). I det här fallet kommer lagret närmast användaren att occludera alla lager längre bort, så all GPU-tid som ägnas åt att återge de mer avlägsna lagren slösas bort.
    • För att minska det här redundanta arbetet med GPU:n hjälper det till att rendera täckande ytor i front-to-back-ordning (närmare först, mer avlägsna ytor sist). Med "täckande" menar vi ytor för vilka DepthWriteMask är inställt på en i djupstencilens tillstånd. När närmaste ytor återges kommer de att primera djupbufferten så att mer avlägsna ytor effektivt hoppas över av pixelprocessorn på GPU:n.

Nätbearbetning

Ett program kanske vill utföra olika åtgärder på rumsliga ytnät för att passa dess behov. Index- och hörndata som medföljer varje rumsligt ytnät använder samma välbekanta layout som hörn- och indexbuffertar som används för återgivning av triangelnät i alla moderna renderings-API:er. Ett viktigt faktum att vara medveten om är dock att trianglar för rumslig mappning har en medurs lindningsordning framifrån. Varje triangel representeras av tre hörnindex i nätets indexbuffert och dessa index identifierar triangelns hörn i medurs ordning när triangeln visas från framsidan . Den främre sidan (eller utanför) av rumsliga yta nät motsvarar som du förväntar dig att den främre (synliga) sidan av verkliga ytor.

Program bör endast förenkla näten om den grövste triangeltätheten som tillhandahålls av ytobservatören fortfarande inte är tillräckligt grov - detta arbete är beräkningsmässigt dyrt och redan utförs av körningen för att generera de olika detaljnivåerna.

Eftersom varje ytobservatör kan tillhandahålla flera oanslutna rumsliga ytor kan vissa program vilja klippa dessa rumsliga ytnät mot varandra och sedan zippa ihop dem. I allmänhet krävs urklippssteget, eftersom nät med närliggande rumsliga ytor ofta överlappar något.

Raycasting och kollision

För att ett fysik-API (till exempel Havok) ska kunna tillhandahålla ett program med raycasting- och kollisionsfunktioner för rumsliga ytor måste programmet tillhandahålla spatiala ytnät till fysik-API:et. Nät som används för fysik har ofta följande egenskaper:

  • De innehåller bara ett litet antal trianglar. Fysikåtgärder är mer beräkningsintensiva än renderingsåtgärder.
  • De är "vattentäta". Ytor som är avsedda att vara fasta bör inte ha små hål i dem; även hål som är för små för att vara synliga kan orsaka problem.
  • De omvandlas till konvexa skrov. Konvexa skrov har få polygoner och är fria från hål, och de är mycket mer beräkningsmässigt effektiva att bearbeta än råa triangelnät.

När du gör raycasts mot rumsliga ytor, tänk på att dessa ytor ofta är komplexa, röriga former fulla av röriga små detaljer - precis som ditt skrivbord! Det innebär att en enda strålkastare ofta inte räcker till för att ge dig tillräckligt med information om ytans form och formen på det tomma utrymmet nära den. Det är vanligtvis en bra idé att göra många raycasts inom ett litet område och att använda aggregerade resultat för att härleda en mer tillförlitlig förståelse av ytan. Om du till exempel använder genomsnittet av 10 strålkastare för att styra hologramplaceringen på en yta blir resultatet mycket smidigare och mindre "jittery" som bara använder en enda raycast.

Tänk dock på att varje raycast kan ha en hög beräkningskostnad. Beroende på ditt användningsscenario bör du kompromissa med beräkningskostnaden för extra raycasts (görs varje bildruta) mot beräkningskostnaden för nätbearbetning för att jämna ut och ta bort hål i rumsliga ytor (görs när rumsliga nät uppdateras).

Miljögenomsökningsupplevelsen

Varje program som använder rumslig mappning bör överväga att tillhandahålla en "genomsökningsupplevelse". den process genom vilken programmet vägleder användaren att genomsöka ytor som krävs för att programmet ska fungera korrekt.

Exempel på genomsökning
Exempel på genomsökning

Den här skanningsupplevelsen kan variera mycket beroende på varje programs behov, men två huvudprinciper bör vägleda dess design.

För det första är tydlig kommunikation med användaren det viktigaste problemet. Användaren bör alltid vara medveten om huruvida programmets krav uppfylls. När de inte uppfylls bör det omedelbart visas för användaren varför detta är så och de bör snabbt ledas till att vidta lämpliga åtgärder.

För det andra bör program försöka hitta en balans mellan effektivitet och tillförlitlighet. När det är möjligt att göra det på ett tillförlitligt sätt bör program automatiskt analysera spatial mappningsdata för att spara användartiden. När det inte går att göra det på ett tillförlitligt sätt bör program i stället göra det möjligt för användaren att snabbt ge programmet den ytterligare information som krävs.

För att hjälpa dig att utforma rätt skanningsupplevelse bör du överväga vilka av följande möjligheter som gäller för ditt program:

  • Ingen skanningsupplevelse

    • Ett program kan fungera perfekt utan någon guidad skanningsupplevelse; Den lär sig om ytor som observeras under naturliga användarrörelser.
    • Ett program som gör att användaren kan rita på ytor med holografisk sprayfärg kräver till exempel bara kunskap om de ytor som för närvarande är synliga för användaren.
    • Miljön kan redan genomsökas om det är en miljö där användaren redan har tillbringat mycket tid med att använda HoloLens.
    • Tänk dock på att kameran som används av rumslig mappning bara kan se 3,1 m framför användaren, så rumslig mappning vet inte om några mer avlägsna ytor om inte användaren har observerat dem från ett närmare avstånd tidigare.
    • Så att användaren förstår vilka ytor som har genomsökts bör programmet ge visuell feedback om detta, till exempel kan omvandling av virtuella skuggor på skannade ytor hjälpa användaren att placera hologram på dessa ytor.
    • I det här fallet bör den rumsliga ytobservatörens avgränsningsvolymer uppdateras varje ram till ett kroppslåst rumsligt koordinatsystem, så att de följer användaren.
  • Hitta en lämplig plats

    • Ett program kan utformas för användning på en plats med specifika krav.
    • Programmet kan till exempel kräva ett tomt område runt användaren så att de på ett säkert sätt kan öva på holografisk kung-fu.
    • Program bör kommunicera specifika krav till användaren direkt och förstärka dem med tydlig visuell feedback.
    • I det här exemplet ska programmet visualisera omfattningen av det obligatoriska tomma området och visuellt markera förekomsten av oönskade objekt i den här zonen.
    • I det här fallet bör den rumsliga ytobservatörens avgränsningsvolymer använda ett världslåst rumsligt koordinatsystem på den valda platsen.
  • Hitta en lämplig konfiguration av ytor

    • Ett program kan kräva en specifik konfiguration av ytor, till exempel två stora, platta, motsatta väggar för att skapa en holografisk spegelhall.
    • I sådana fall måste programmet analysera de ytor som tillhandahålls av rumslig mappning för att identifiera lämpliga ytor och dirigera användaren mot dem.
    • Användaren bör ha ett reservalternativ om programmets ytanalys inte är tillförlitlig. Om programmet till exempel felaktigt identifierar en dörröppning som en plan vägg behöver användaren ett enkelt sätt att åtgärda felet.
  • Skanna en del av miljön

    • Ett program kanske bara vill avbilda en del av miljön enligt användarens anvisningar.
    • Programmet söker till exempel igenom en del av ett rum så att användaren kan publicera en holografisk klassificerad annons efter möbler som de vill sälja.
    • I det här fallet bör programmet samla in spatial mappningsdata i de regioner som observeras av användaren under genomsökningen.
  • Skanna hela rummet

    • Ett program kan kräva en genomsökning av alla ytor i det aktuella rummet, inklusive de bakom användaren.
    • Till exempel kan ett spel sätta användaren i rollen Som Gulliver, under belägring från hundratals små Lilliputians närmar sig från alla håll.
    • I sådana fall måste programmet fastställa hur många av ytorna i det aktuella rummet som redan har genomsökts och dirigera användarens blick för att fylla i betydande luckor.
    • Nyckeln till den här processen är att ge visuell feedback som gör det tydligt för användaren vilka ytor som ännu inte har genomsökts. Programmet kan till exempel använda avståndsbaserad dimma för att visuellt markera regioner som inte omfattas av rumsliga mappningsytor.
  • Ta en första ögonblicksbild av miljön

    • Ett program kanske vill ignorera alla ändringar i miljön efter att ha tagit en första "ögonblicksbild".
    • Detta kan vara lämpligt för att undvika avbrott i användarskapade data som är nära kopplade till det ursprungliga tillståndet i miljön.
    • I det här fallet bör programmet göra en kopia av spatial mappningsdata i sitt ursprungliga tillstånd när genomsökningen är klar.
    • Program bör fortsätta att ta emot uppdateringar av rumsliga mappningsdata om hologram fortfarande ska vara korrekt occluded av miljön.
    • Fortsatta uppdateringar av rumsliga mappningsdata gör det också möjligt att visualisera eventuella ändringar som har inträffat, vilket förtydligar för användaren skillnaderna mellan tidigare och nuvarande tillstånd i miljön.
  • Ta användarinitierade ögonblicksbilder av miljön

    • Ett program kanske bara vill svara på miljöförändringar när användaren instruerar det.
    • Användaren kan till exempel skapa flera 3D-statyer av en vän genom att fånga deras poser vid olika tillfällen.
  • Tillåt att användaren ändrar miljön

    • Ett program kan utformas för att svara i realtid på ändringar som görs i användarens miljö.
    • Användaren som ritar en gardin kan till exempel utlösa "scenförändring" för en holografisk pjäs som äger rum på andra sidan.
  • Vägleder användaren för att undvika fel i spatial mappningsdata

    • Ett program kanske vill ge vägledning till användaren när de genomsöker sin miljö.
    • Detta kan hjälpa användaren att undvika vissa typer av fel i spatial mappningsdata, till exempel genom att hålla sig borta från solbelysta fönster eller speglar.

En extra detalj att vara medveten om är att "intervallet" för spatial mappningsdata inte är obegränsat. Även om rumslig mappning skapar en permanent databas med stora utrymmen, gör den bara dessa data tillgängliga för program i en "bubbla" av begränsad storlek runt användaren. Om du börjar i början av en lång korridor och går tillräckligt långt bort från början, kommer så småningom de rumsliga ytorna tillbaka i början att försvinna. Du kan åtgärda detta genom att cachelagra dessa ytor i ditt program när de har försvunnit från tillgängliga rumsliga mappningsdata.

Nätbearbetning

Det kan hjälpa till att identifiera vanliga typer av fel i ytor och filtrera, ta bort eller ändra rumsliga mappningsdata efter behov.

Tänk på att spatial mappningsdata är avsedda att vara så trogna som möjligt till verkliga ytor, så all bearbetning du tillämpar riskerar att flytta dina ytor längre från "sanningen".

Här är några exempel på olika typer av nätbearbetning som kan vara användbara:

  • Hålfyllning

    • Om ett litet objekt av ett mörkt material inte kan skannas lämnar det ett hål i den omgivande ytan.
    • Hål påverkar ocklusion: hologram kan ses "genom" ett hål i en förment ogenomskinlig verklig yta.
    • Hål påverkar raycasts: om du använder raycasts för att hjälpa användare att interagera med ytor kan det vara oönskat för dessa strålar att passera genom hål. En åtgärd är att använda ett paket med flera raycasts som täcker en region av lämplig storlek. Detta gör att du kan filtrera "avvikande" resultat, så att även om en raycast passerar genom ett litet hål, kommer det aggregerade resultatet fortfarande att vara giltigt. Den här metoden kommer dock till en beräkningskostnad.
    • Hål påverkar fysikkollisioner: ett objekt som styrs av fysiksimulering kan falla genom ett hål i golvet och gå förlorat.
    • Det är möjligt att algoritmiskt fylla sådana hål i ytnätet. Du måste dock justera algoritmen så att "riktiga hål" som fönster och dörröppningar inte fylls i. Det kan vara svårt att på ett tillförlitligt sätt skilja "verkliga hål" från "imaginära hål", så du måste experimentera med olika heuristik som "storlek" och "gränsform".
  • Hallucination borttagning

    • Reflektioner, starkt ljus och rörliga föremål kan lämna små kvardröjande "hallucinationer" flytande i luften.
    • Hallucinationer påverkar ocklusion: hallucinationer kan bli synliga som mörka former som rör sig framför och occluding andra hologram.
    • Hallucinationer påverkar raycasts: om du använder raycasts för att hjälpa användare att interagera med ytor kan dessa strålar träffa en hallucination istället för ytan bakom den. Precis som med hål är en begränsning att använda många raycasts i stället för en enda raycast, men återigen kommer detta att komma till en beräkningskostnad.
    • Hallucinationer påverkar fysikkollisioner: ett objekt som styrs av fysiksimulering kan fastna mot en hallucination och inte kunna röra sig genom ett till synes tydligt utrymme.
    • Det är möjligt att filtrera sådana hallucinationer från ytnätet. Men precis som med hål måste du justera algoritmen så att verkliga små objekt som lampstativ och dörrhandtag inte tas bort.
  • Utjämning

    • Rumslig mappning kan returnera ytor som verkar vara grova eller "bullriga" jämfört med deras verkliga motsvarigheter.
    • Jämnhet påverkar fysikkollisioner: om golvet är grovt kan en fysiskt simulerad golfboll inte rulla smidigt över den i en rak linje.
    • Jämnhet påverkar återgivningen: om en yta visualiseras direkt kan ojämna ytnormaler påverka dess utseende och störa ett "rent" utseende. Det är möjligt att minimera detta genom att använda lämplig belysning och texturer i skuggningen som används för att återge ytan.
    • Det är möjligt att jämna ut grovhet i ett ytnät. Detta kan dock driva ytan längre bort från motsvarande verkliga yta. Att upprätthålla en nära korrespondens är viktigt för att skapa korrekt hologramocklusion och för att göra det möjligt för användare att uppnå exakta och förutsägbara interaktioner med holografiska ytor.
    • Om endast en kosmetisk förändring krävs kan det vara tillräckligt att släta ut hörnens normalitet utan att ändra hörnpositionerna.
  • Plansökning

    • Det finns många former av analys som ett program kanske vill utföra på de ytor som tillhandahålls av rumslig mappning.
    • Ett enkelt exempel är "plansökning"; identifiera avgränsade, mestadels plana områden av ytor.
    • Planar-regioner kan användas som holografiska arbetsytor, regioner där holografiskt innehåll automatiskt kan placeras av programmet.
    • Planar-regioner kan begränsa användargränssnittet så att användarna kan interagera med de ytor som bäst passar deras behov.
    • Planar-regioner kan användas som i den verkliga världen, för holografiska motsvarigheter till funktionella objekt som LCD-skärmar, tabeller eller whiteboards.
    • Planar-regioner kan definiera spelområden som utgör grunden för videospelnivåer.
    • Planar-regioner kan hjälpa virtuella agenter att navigera i den verkliga världen genom att identifiera de golvområden som verkliga människor sannolikt kommer att gå på.

Prototyper och felsökning

Användbara verktyg

  • HoloLens-emulatorn kan användas för att utveckla program med hjälp av rumslig mappning utan åtkomst till en fysisk HoloLens. Det gör att du kan simulera en livesession på en HoloLens i en realistisk miljö, med alla data som ditt program normalt skulle använda, inklusive HoloLens rörelse, rumsliga koordinatsystem och spatiala mappningsnät. Detta kan användas för att tillhandahålla tillförlitliga, repeterbara indata, vilket kan vara användbart för felsökning av problem och utvärdering av ändringar i koden.
  • Återskapa ett scenario genom att samla in spatial mappningsdata över nätverket från en live HoloLens och sedan spara dem på disken och återanvända dem i senare felsökningssessioner.
  • 3D-vyn i Windows-enhetsportalen är ett sätt att se alla rumsliga ytor som för närvarande är tillgängliga via det rumsliga mappningssystemet. Detta ger en jämförelsegrund för de rumsliga ytorna i ditt program. Du kan till exempel enkelt se om några rumsliga ytor saknas eller visas på fel plats.

Allmän vägledning för prototyper

  • Eftersom fel i spatial mappningsdata kan påverka användarens upplevelse rekommenderar vi att du testar programmet i en mängd olika miljöer.
  • Fastna inte i vanan att alltid testa på samma plats, till exempel vid ditt skrivbord. Se till att testa på olika ytor med olika positioner, former, storlekar och material.
  • Även om syntetiska eller registrerade data kan vara användbara för felsökning blir de inte alltför beroende av samma få testfall. Detta kan fördröja att hitta viktiga problem som mer varierad testning skulle ha fångat tidigare.
  • Det är en bra idé att utföra testning med riktiga (och helst ej coachade) användare, eftersom de kanske inte använder HoloLens eller ditt program på exakt samma sätt som du gör. Faktum är att det kan förvåna dig hur olika människors beteende, kunskap och antaganden kan vara!

Felsökning

  • För att ytmaskorna ska kunna orienteras korrekt måste varje GameObject vara aktivt innan det skickas till SurfaceObserver för att få sitt nät konstruerat. Annars visas näten i ditt utrymme men roteras i konstiga vinklar.
  • GameObject som kör skriptet som kommunicerar med SurfaceObserver måste anges till ursprunget. Annars har alla GameObjects som du skapar och skickar till SurfaceObserver för att få sina nät konstruerade en förskjutning som motsvarar förskjutningen av det överordnade spelobjektet. Detta kan göra att dina nät visas flera meter bort, vilket gör det svårt att felsöka vad som händer.

Se även