Sdílet prostřednictvím


Kamera

Aby se zajistilo, že místně a vzdáleně vykreslovaný obsah je možné bezproblémově složeného, musí různé vlastnosti fotoaparátu zůstat synchronizované mezi serverem a klientem. Nejvýraznější je transformace a projekce kamery. Například místně vykreslený obsah musí používat stejnou transformaci a projekci fotoaparátu, se kterou byl vykreslen nejnovější vzdálený snímek.

Local and remote camera

Na obrázku výše se místní kamera přesunula ve srovnání se vzdáleným snímkem odeslaný serverem. V důsledku toho se místní obsah musí vykreslit ze stejného pohledu jako vzdálený snímek a nakonec se výsledný obrázek přeprojektuje do prostoru místního fotoaparátu, který je podrobně vysvětlen v pozdější fázi reprojektování.

Zpoždění mezi vzdáleným a místním vykreslováním znamená, že jakákoli změna těchto nastavení se použije se zpožděním. Proto není možné použít žádnou novou hodnotu okamžitě se stejným rámcem.

Na nastavení kamery je možné nastavit nejbližší a vzdálené vzdálenosti letadla. Na HoloLens 2 je zbývající transformační a projekční data definovaná hardwarem. Při použití simulace plochy se nastaví prostřednictvím vstupu jeho Update funkce.

Změněné hodnoty lze použít místně, jakmile dorazí první vzdálený rámec, který se s nimi vykresloval. Na HoloLens 2 jsou data, která se mají použít k vykreslování, poskytována holographicFrame stejně jako v jakékoli jiné holografické aplikaci. V simulaci plochy se načtou prostřednictvím výstupu Update funkce.

nastavení Kamera

V nastavení fotoaparátu je možné změnit následující vlastnosti:

Blízko a daleko rovina:

Chcete-li zajistit, aby nebyly nastaveny žádné neplatné rozsahy, jsou vlastnosti NearPlane a FarPlane jen pro čtení a existuje samostatná funkce SetNearAndFarPlane pro změnu rozsahu. Tato data budou odeslána na server na konci rámce. Při nastavování těchto hodnot musí být NearPlane menší než FarPlane. V opačném případě dojde k chybě.

Důležité

V Unity se to zpracovává automaticky při změně hlavní kamery blízko a daleko letadla.

PovolitDepth:

Někdy je užitečné zakázat zápis vzdálené image do vyrovnávací paměti hloubky pro účely ladění. Zakázáním hloubky také zastavíte odesílání podrobných dat serveru, čímž se sníží šířka pásma.

Tip

V Unity je k dispozici ladicí komponenta s názvem EnableDepthComponent , která se dá použít k přepnutí této funkce v uživatelském rozhraní editoru.

InverseDepth:

Poznámka:

Toto nastavení je důležité pouze v případě, že EnableDepth je nastaveno .true Jinak toto nastavení nemá žádný vliv.

Hloubkové vyrovnávací paměti obvykle zaznamenávají hodnoty z v rozsahu s plovoucí desetinou čárkou [0; 1], s 0 označující hloubku blízké roviny a 1 označující hloubku daleko roviny. Je také možné invertovat tento rozsah a zaznamenávat hloubkové hodnoty v rozsahu [1; 0], to znamená, že hloubka blízké roviny se změní na 1 a hloubka daleko roviny se změní na hodnotu 0. Obecně platí, že tato funkce zlepšuje rozdělení přesnosti s plovoucí desetinnou čárkou v nelineárním rozsahu z.

Upozorňující

Běžným přístupem je invertování hodnot blízko roviny a vzdálené roviny na objektech kamery. U služby Azure Remote Rendering dojde k selhání s chybou při pokusu o tuto funkci na serveru CameraSettings.

Rozhraní API služby Azure Remote Rendering potřebuje vědět o konvenci hloubkové vyrovnávací paměti místního rendereru, aby správně nakreslila vzdálenou hloubku do vyrovnávací paměti místní hloubky. Pokud je rozsah hloubkové vyrovnávací paměti [0; 1] nechte tento příznak jako false. Použijete-li invertovanou hloubkovou vyrovnávací paměť s [1; 0] rozsah, nastavte InverseDepth příznak na true.

Poznámka:

Pro Unity je správné nastavení již použito RenderingConnection , takže není nutné ruční zásah.

Změna nastavení kamery se dá provést takto:

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

Dokumentace k rozhraní API

Další kroky