Condividi tramite


Fotocamera

Per assicurarsi che il contenuto sottoposto a rendering locale e remoto possa essere composto senza problemi, è necessario che varie proprietà della fotocamera rimangano sincronizzate tra server e client. In particolare la trasformazione e la proiezione della fotocamera. Ad esempio, il contenuto sottoposto a rendering locale deve usare la stessa trasformazione della fotocamera e la stessa proiezione con cui è stato eseguito il rendering del fotogramma remoto più recente.

Local and remote camera

Nell'immagine precedente, la fotocamera locale è stata spostata rispetto al fotogramma remoto inviato dal server. Di conseguenza, il rendering del contenuto locale deve essere eseguito dalla stessa prospettiva del fotogramma remoto e infine l'immagine risultante viene riprogettazione nello spazio della fotocamera locale, come illustrato in dettaglio nella riprogettazione in fase tardiva.

Il ritardo tra il rendering remoto e locale indica che qualsiasi modifica di queste impostazioni viene applicata con un ritardo. Pertanto, qualsiasi nuovo valore non può essere usato immediatamente nello stesso frame.

Le distanze del piano vicino e lontano possono essere impostate sulle impostazioni della fotocamera. In HoloLens 2 i dati di trasformazione e proiezione rimanenti sono definiti dall'hardware. Quando si usa la simulazione desktop, vengono impostati tramite l'input della relativa Update funzione.

I valori modificati possono essere usati localmente non appena arriva il primo frame remoto di cui è stato eseguito il rendering. In HoloLens 2 i dati da usare per il rendering vengono forniti da HolographicFrame esattamente come in qualsiasi altra applicazione olografica. Nella simulazione desktop, vengono recuperati tramite l'output della Update funzione.

impostazioni di Fotocamera

Le proprietà seguenti possono essere modificate nelle impostazioni della fotocamera:

Piano vicino e lontano:

Per assicurarsi che non sia possibile impostare intervalli non validi, le proprietà NearPlane e FarPlane sono di sola lettura e esiste una funzione separata SetNearAndFarPlane per modificare l'intervallo. Questi dati verranno inviati al server alla fine del frame. Quando si impostano questi valori, NearPlane deve essere inferiore a FarPlane. In caso contrario, si verificherà un errore.

Importante

In Unity questo viene gestito automaticamente quando si modifica la fotocamera principale vicino e lontano piani.

EnableDepth:

A volte è utile disabilitare la scrittura depth buffer dell'immagine remota a scopo di debug. La disabilitazione della profondità impedirà inoltre al server di inviare dati di profondità, riducendo così la larghezza di banda.

Suggerimento

In Unity viene fornito un componente di debug denominato EnableDepthComponent che può essere usato per attivare o disattivare questa funzionalità nell'interfaccia utente dell'editor.

InverseDepth:

Nota

Questa impostazione è importante solo se EnableDepth è impostata su true. In caso contrario, questa impostazione non ha alcun impatto.

I buffer di profondità registrano normalmente i valori z in un intervallo a virgola mobile [0; 1], con 0 che indica la profondità del piano vicino e 1 che indica la profondità del piano lontano. È anche possibile invertire questo intervallo e registrare i valori di profondità nell'intervallo [1; 0], ovvero, la profondità del piano vicino diventa 1 e la profondità del piano lontano diventa 0. In genere, quest'ultimo migliora la distribuzione della precisione a virgola mobile nell'intervallo z non lineare.

Avviso

Un approccio comune consiste nell'invertire i valori del piano vicino e del piano lontano sugli oggetti della fotocamera. Questo errore avrà esito negativo per Azure Rendering remoto con un errore durante il tentativo in CameraSettings.

L'API Rendering remoto di Azure deve conoscere la convenzione depth buffer del renderer locale per comporre correttamente la profondità remota nel buffer di profondità locale. Se l'intervallo di buffer di profondità è [0; 1] lasciare questo flag come false. Se si usa un buffer di profondità invertito con [1; Intervallo 0] impostare il InverseDepth flag su true.

Nota

Per Unity, l'impostazione corretta è già applicata da RenderingConnection , quindi non è necessario alcun intervento manuale.

La modifica delle impostazioni della fotocamera può essere eseguita come segue:

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

Documentazione sull'API

Passaggi successivi