Compartilhar via


Câmera

Para garantir que o conteúdo renderizado local e remotamente possa ser composto perfeitamente, várias propriedades da câmera precisam permanecer em sincronia entre o servidor e o cliente. Especialmente a projeção e a transformação da câmera. Por exemplo, o conteúdo renderizado localmente deve usar a mesma projeção e transformação da câmera usada ao renderizar o quadro remoto mais recente.

Local and remote camera

Na imagem acima, a câmera local foi movida em comparação com o quadro remoto enviado pelo servidor. Como resultado, o conteúdo local precisa ser renderizado da mesma perspectiva que o quadro remoto e, por fim, a imagem resultante é reprojetada no espaço da câmera local, o que é explicado em detalhes na reprojeção de fase tardia.

O atraso entre a renderização remota e local significa que qualquer alteração nessas configurações será aplicada com atraso. Portanto, qualquer novo valor não pode ser usado imediatamente no mesmo quadro.

As distâncias de plano próximo e distante podem ser definidas nas configurações da câmera. No HoloLens 2, os dados restantes de transformação e projeção são definidos pelo hardware. Ao usar a simulação da área de trabalho, eles são definidos através da entrada de sua função Update.

Os valores alterados podem ser usados localmente assim que o primeiro quadro remoto renderizado com eles chegar. No HoloLens 2, os dados a serem usados para renderização são fornecidos pelo HolographicFrame, assim como em qualquer outro aplicativo holográfico. Na simulação da área de trabalho, eles são recuperados através da saída da função Update.

Configurações da câmera

As propriedades a seguir podem ser alteradas nas configurações da câmera:

Plano próximo e distante:

Para garantir que nenhum intervalo inválido possa ser definido, as propriedades NearPlane e FarPlane são somente leitura, e existe uma função separada SetNearAndFarPlane para alterar o intervalo. Esses dados serão enviados ao servidor no final do quadro. Ao definir esses valores, NearPlane precisa ser menor que FarPlane. Caso contrário, ocorrerá um erro.

Importante

No Unity, isso é identificado automaticamente ao alterar os planos próximo e distante da câmera principal.

EnableDepth:

Às vezes, é útil desabilitar a gravação do buffer de profundidade da imagem remota para fins de depuração. A desabilitação da profundidade também impedirá que o servidor envie dados de profundidade, reduzindo, assim, a largura de banda.

Dica

No Unity, é fornecido um componente de depuração chamado EnableDepthComponent, que pode ser usado para alternar esse recurso na interface do usuário do editor.

InverseDepth:

Observação

Essa configuração só será importante se EnableDepth for definido como true. Caso contrário, essa configuração não terá nenhum impacto.

Buffers de profundidade normalmente registram valores z em um intervalo de ponto flutuante de [0;1], com 0 indicando a profundidade do plano próximo, e 1 indicando a profundidade do plano distante. Também é possível inverter esse intervalo e registrar valores de profundidade no intervalo [1;0], ou seja, a profundidade do plano próximo se torna 1 e a profundidade do plano distante se torna 0. Em geral, a última opção melhora a distribuição da precisão de ponto flutuante no intervalo z não linear.

Aviso

Uma abordagem comum é inverter os valores do plano próximo e distante nos objetos da câmera. Isso irá falhar no Azure Remote Rendering, com um erro ao tentar isso no CameraSettings.

A API do Azure Remote Rendering precisa saber sobre a convenção de buffer de profundidade do seu renderizador local para compor corretamente a profundidade remota no buffer de profundidade local. Se o intervalo do buffer de profundidade for [0;1], esse sinalizador deve ser igual a false. Se você usar um buffer de profundidade invertido com um intervalo de [1;0], defina o sinalizador InverseDepth como true.

Observação

Para o Unity, a configuração correta já é aplicada pelo RenderingConnection, portanto, não há necessidade de intervenção manual.

A alteração das configurações da câmera pode ser feita da seguinte maneira:

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

Documentação da API

Próximas etapas