Dela via


Förstå SessionOrigin

SessionOrigin är en relativt ny implementering, introducerad i AR Foundation, men idén har dykt upp i kamerariggar som går tillbaka årtionden av renderingsmotorer. Du kanske känner till det som noden MRTK Playspace. Det är ganska kraftfullt, men tyvärr dåligt förklarat och följaktligen dåligt förstått.

Vad är SessionOrigin?

SessionOrigin är bara ett transformeringsobjekt som kameran är ansluten till. Det enklaste är att den tillåter placering av kameran i den virtuella scenen. Mer subtilt definierar det ett särskilt koordinatutrymme.

Som vanligt med transformeringsrelationen mellan överordnad och underordnad i Unity (och alla moderna renderingsmotorer) kommer "flytta" den överordnade "flytta" barnet. Det som menas med termen "flytta" i den här kontexten är att en ändring i den överordnades globala pose ändrar de globala koordinaterna för det underordnade objektet, och när de globala koordinaterna för ett objekt ändras verkar objektet ha flyttats i förhållande till objekt vars globala koordinater inte har ändrats.

Kameran är ganska speciell i denna mening, eftersom den inte återges. Den bestämmer återgivningsverktygets synvinkel. Ett konkret exempel kan klargöra detta.

Enklaste exemplet på SessionOrigin

Föreställ dig en mycket enkel scen, där kameran är vid start (som vanligt i AR-program), och det finns en enda röd sfär placerad på Z-axeln 10 meter framför kameran (position =(0,0,10)).

Enklaste virtuella scenen

Av någon anledning kan du anta att vi vill att användaren ska starta 1 meter från sfären i stället.

Vi har två intressanta alternativ:

  1. Flytta kameran till ny position (0,0,9).
  2. Flytta sfären till ny position (0,0,1).

Två alternativ

Det är ganska uppenbart att de två alternativen i slutändan är likvärdiga utan något annat sammanhang. I båda fallen är sfären 1 meter framför kameran vid start. Den enda skillnaden är de absoluta globala koordinaterna för de två objekten. Deras relativa koordinater, som är vektorn mellan de två, är desamma i båda fallen.

Hur skulle vi gå till väga om vi vill använda alternativ 1. Om vi ställer in kamerans koordinater skrivs de över av spårningssystemet. I stället kopplar vi kameran till ett överordnat objekt och flyttar sedan det överordnade objektet. Spåraren ställer in kamerans lokala pose, vilket flyttar den i förhållande till den överordnade. Den överordnade är nu SessionOrigin.

Varför flytta kameran i stället för sfären?

I det här enkla fallet är de två alternativen tydligt utbytbara. Men kom ihåg att "sfären" verkligen representerar "allt i scenen men kameran". När scenens komplexitet växer blir det mer komplicerat att flytta allt. Att flytta kameran via SessionOrigin är alltid exakt samma åtgärd.

Dessutom finns det typer av objekt som är svåra eller omöjliga att flytta, till exempel partikelsystem eller navigeringsnät. Men även om ingen av dessa är inblandade finns det tydliga fördelar med att ändra koordinaterna för ett enda objekt i scenen, SessionOrigin, jämfört med att ändra de globala koordinaterna för allt annat.

SessionOrigin bör inte flytta allt

Överväg återigen vårt enklaste exempel. Men det här är ett AR-program, så tillsammans med den renderade röda sfären ser användaren även den fysiska miljön. För enkelhetens skull kommer vår fysiska miljö att begränsas till den enda gröna stolen som visas.

Både virtuella och fysiska objekt

Nu, när vi flyttar kameran via SessionOrigin, har vi flyttat den i förhållande till den röda sfären, men uppenbarligen har vi inte plockat upp användaren och flyttat dem i förhållande till den gröna stolen. Sfären visas nu närmare, men stolen är i exakt samma position.

Fysiska objekt som är fasta i förhållande till fysisk användare

Vad händer om det finns ett ankare på stolssätet? Ska fästpunkten röra sig med den röda sfären eller förbli fast i förhållande till stolssätet? Hela fästpunkten är att förbli fast i förhållande till den fysiska världen, så klart bör den stanna med stolen.

Ett annat exempel är det rumsliga nätet. Det är det nät som genereras för att tillhandahålla en virtuell version av den fysiska miljön för kontext, ray-casting osv. Vi vill definitivt att det rumsliga nätet ska förbli fast i den fysiska världen.

Ytterligare exempel sträcker sig från handnät till ögonögavektorer. Alla delar det gemensamma drag som om koordinaterna för kameran justeras (transformeras), bör koordinaterna för dessa objekt få samma justering.

Så konceptuellt är alla de objekt som rör sig i samordning med kameran också kopplade till SessionOrigin. När SessionOrigin flyttas i förhållande till globala objekt som den röda sfären, tas alla dessa objekt med.

Det är viktigt att betona att detta är oberoende av kamerans rörelse på grund av huvudspårning. Spåraren flyttar kameran i förhållande till SessionOrigin.

En något mer matematisk förklaring

Unitys globala koordinatsystem finns som standard något godtyckligt i ett AR-program. Förutom att justera gravitationsvektorn (Y-axeln) med "uppåt" bestäms positionen och orienteringen helt av var spåraren placerar kameran vid start.

Även om det kan vara bra för många program, öppnas en mängd olika möjligheter genom att kunna ta bort den godtyckligheten i det globala koordinatutrymmet.

När du tittar tillbaka på föregående exempel kan du tänka dig att det är viktigt för programmet att den virtuella röda sfären placeras i förhållande till den fysiska stolen som visas. Vi kan göra det genom att justera SessionOrigin.

Önskad layout

Om vi vill att sfären på (0,0,10) ska vara 1 meter längs X-axeln från stolen, vill vi att stolen ska vara på (-1,0,10). Om vi bestämmer att kameran ska vara 2 meter tillbaka från stolen direkt längs den negativa Z-axeln när kameran är vid ursprunget, är stolen för närvarande på (0,0,2). (Kom ihåg att fysiska objekt inte har några medfödda koordinater, endast koordinater som är underförstådda med närhet till kameran och virtuella objekt).

Inledande layout

Men om vi ställer in SessionOrigin-transformering till (-1,0,8) är kamerans position (-1,0,8). Stolen, 2 meter direkt framåt, ligger på (-1,0,10). Och den röda sfären, på (0,0,10), kommer att visas 1 meter höger om stolen som önskat.

Justerad layout

Så vi har effektivt använt SessionOrigin-transformering för att flytta Unitys globala utrymme så att den röda sfären, och alla andra globala objekt, bara råkar visas i rätt position i förhållande till den fysiska världen.

Den här enkla men kraftfulla mekanismen för att anpassa Unitys globala koordinatutrymme till den fysiska världen kan användas för att stödja komplex layout, beständighet av koordinatutrymmen, koordinatutrymmen som delas mellan enheter med mera.

Se även