Dela via


Kamera

För att säkerställa att innehåll som återges lokalt och via fjärranslutning kan sammansattas sömlöst måste olika kameraegenskaper förbli synkroniserade mellan server och klient. Framför allt kameran transformera och projektion. Det lokalt renderade innehållet måste till exempel använda samma kameratransformering och projektion som den senaste fjärrramen renderades med.

Local and remote camera

I bilden ovan har den lokala kameran flyttats jämfört med fjärrramen som skickas av servern. Därför måste det lokala innehållet återges från samma perspektiv som fjärrramen och slutligen återskapas den resulterande bilden till det lokala kamerautrymmet, vilket förklaras i detalj i den sena omprojektionen.

Fördröjningen mellan fjärråtergivningen och den lokala återgivningen innebär att alla ändringar av dessa inställningar tillämpas med en fördröjning. Därför kan inget nytt värde användas direkt i samma ram.

Avstånden nära och långt från planet kan ställas in på kamerainställningarna. På HoloLens 2 definieras återstående transformerings- och projektionsdata av maskinvaran. När du använder skrivbordssimuleringen anges de via indata för dess Update funktion.

De ändrade värdena kan användas lokalt så snart den första fjärrramen kommer som renderades med dem. På HoloLens 2 tillhandahålls de data som ska användas för återgivning av HolographicFrame precis som i andra holografiska program. På skrivbordssimulering hämtas de via utdata från Update funktionen.

Kamera inställningar

Följande egenskaper kan ändras i kamerainställningarna:

Nära och långt plan:

För att säkerställa att inga ogiltiga intervall kan anges är egenskaperna NearPlane och FarPlane skrivskyddade och en separat funktion SetNearAndFarPlane finns för att ändra intervallet. Dessa data skickas till servern i slutet av ramen. När du anger dessa värden måste NearPlane vara mindre än FarPlane. Annars uppstår ett fel.

Viktigt!

I Unity hanteras detta automatiskt när huvudkameran ändras nära och långt flygplan.

EnableDepth:

Ibland är det bra att inaktivera djupbuffertens skrivning av fjärrbilden i felsökningssyfte. Om du inaktiverar djup stoppas även servern från att skicka djupdata, vilket minskar bandbredden.

Dricks

I Unity tillhandahålls en felsökningskomponent med namnet EnableDepthComponent som kan användas för att växla den här funktionen i redigeringsgränssnittet.

InverseDepth:

Kommentar

Den här inställningen är bara viktig om EnableDepth är inställd på true. Annars påverkas inte den här inställningen.

Djupbuffertar registrerar normalt z-värden i ett flyttalsintervall på [0; 1], med 0 som anger det nära planets djup och 1 som anger det avlägsna planets djup. Det är också möjligt att invertera det här intervallet och registrera djupvärden i intervallet [1; 0], d.v.s. det nära planets djup blir 1 och det avlägsna planets djup blir 0. I allmänhet förbättrar det senare fördelningen av flyttalsprecision över det icke-linjära z-intervallet.

Varning

En vanlig metod är att invertera värdena på nära och fjärran plan på kameraobjekten. Detta misslyckas för Azure Remote Rendering med ett fel när du provar detta på CameraSettings.

Azure Remote Rendering-API:et måste känna till djupbuffertkonventionen för din lokala renderare för att korrekt kunna skapa fjärrdjup i den lokala djupbufferten. Om ditt djupbuffertintervall är [0; 1] lämna den här flaggan som false. Om du använder en inverterad djupbuffert med [1; 0] intervall, ange InverseDepth flaggan till true.

Kommentar

För Unity tillämpas redan rätt inställning av så att det inte finns något behov av RenderingConnection manuella åtgärder.

Du kan ändra kamerainställningarna på följande sätt:

void ChangeCameraSetting(RenderingSession session)
{
    CameraSettings settings = session.Connection.CameraSettings;

    settings.SetNearAndFarPlane(0.1f, 20.0f);
    settings.EnableDepth = false;
    settings.InverseDepth = false;
}
void ChangeCameraSetting(ApiHandle<RenderingSession> session)
{
    ApiHandle<CameraSettings> settings = session->Connection()->GetCameraSettings();

    settings->SetNearAndFarPlane(0.1f, 20.0f);
    settings->SetEnableDepth(false);
    settings->SetInverseDepth(false);
}

API-dokumentation

Nästa steg