Quando você usa um fone de ouvido de realidade mista, ele se torna o centro do seu mundo holográfico. O componente Unity Camera lidará automaticamente com a renderização estereoscópica e seguirá o movimento e a rotação da cabeça. No entanto, para otimizar totalmente a qualidade visual e a estabilidade do holograma, você deve definir as configurações da câmera descritas abaixo.
Fones de ouvido imersivos HoloLens vs VR
As configurações padrão no componente Unity Camera são para aplicativos 3D tradicionais, que precisam de um fundo semelhante a uma skybox, pois não têm um mundo real.
Ao rodar em um fone de ouvido imersivo, você está renderizando tudo o que o usuário vê e, portanto, provavelmente vai querer manter a skybox.
No entanto, ao rodar em um fone de ouvido holográfico como o HoloLens, o mundo real deve aparecer por trás de tudo o que a câmera renderiza. Defina o fundo da câmera para ser transparente (no HoloLens, o preto é renderizado como transparente) em vez de uma textura Skybox:
Selecione a câmera principal no painel Hierarquia
No painel Inspetor, localize o componente Câmera e altere a lista suspensa Limpar sinalizadores de Skybox para Cor sólida
Selecione o seletor de cores de plano de fundo e altere os valores RGBA para (0, 0, 0, 0)
Se definir isso a partir do código, você pode usar o Color.clear
MRTK irá lidar com configurações específicas da câmera automaticamente, com base na configuração no perfil do sistema de câmera.
Espaço de nomes:Microsoft.MixedReality.Toolkit.CameraSystem Tipo:MixedRealityCameraSystem
Para verificar a opacidade da câmara, o sistema MixedRealityCamera tem uma IsOpaque propriedade.
CoreServices.CameraSystem.IsOpaque;
Espaço de nomes:UnityEngine.XR Tipo:XRDisplaySubsystem
Você pode usar o código de script para determinar em tempo de execução se o fone de ouvido é imersivo ou holográfico marcando displayOpaque no XRDisplaySubsystem em execução ativa.
Espaço de nomes:UnityEngine.XR.WSA Tipo:HolographicSettings
Você pode usar o código de script para determinar em tempo de execução se o fone de ouvido é imersivo ou holográfico marcando HolographicSettings.IsDisplayOpaque.
Configuração da câmara
Seja qual for o tipo de experiência que esteja a desenvolver, a Câmara Principal é sempre o principal componente de renderização estéreo ligado ao ecrã montado na cabeça do seu dispositivo. Será mais fácil definir o layout do seu aplicativo se você imaginar a posição inicial do usuário como (X: 0, Y: 0, Z: 0). Uma vez que a câmera principal está rastreando o movimento da cabeça do usuário, a posição inicial do usuário pode ser definida definindo a posição inicial da câmera principal.
A escolha central que você precisa fazer é se você está desenvolvendo para fones de ouvido imersivos HoloLens ou VR. Depois de ter isso, pule para a seção de configuração aplicável.
Configuração da câmera HoloLens
Para aplicativos HoloLens, você precisa usar âncoras para quaisquer objetos que deseja bloquear no ambiente da cena. Recomendamos o uso de espaço ilimitado para maximizar a estabilidade e criar âncoras em várias salas.
Siga este tutorial passo a passo para adicionar e configurar automaticamente o Mixed Reality Toolkit em seu projeto Unity. Também é possível trabalhar diretamente com a classe MixedRealityPlayspace do MRTK for Unity e definir a Escala de Destino para o Mundo:
MRTK deve lidar com a posição do espaço de reprodução e da câmera automaticamente, mas é bom verificar duas vezes:
No painel Hierarquia, expanda o MixedRealityPlayspace GameObject e localize o objeto filho da câmera principal
No painel Inspetor, localize o componente Transformar e altere a Posição para (X: 0, Y: 0, Z: 0)
xrInputSubsystem.TrySetTrackingOriginMode(TrackingOriginModeFlags.Device);
xrInputSubsystem.TrySetTrackingOriginMode(TrackingOriginModeFlags.Unbounded); // Recommendation for OpenXR
Você pode usar ARSession para aplicações HoloLens, que funciona melhor com âncoras e ARKit/ARCore.
Importante
A sessão de RA e os recursos relacionados precisam do AR Foundation instalado.
Também é possível aplicar as alterações da câmera manualmente sem usar ARSession:
Selecione Câmera principal no painel Hierarquia
No painel Inspetor, localize o componente Transformar e altere a Posição para (X: 0, Y: 0, Z: 0)
Câmera no painel Inspetor no Unity
Adicionar um TrackedPoseDriver à câmera principal
Selecione Câmera principal no painel Hierarquia
No painel Inspetor, localize o componente Transformar e altere a Posição para (X: 0, Y: 0, Z: 0)
Câmera no painel Inspetor no Unity
Aceda à secção Outras Definições das Definições do Leitor da Loja Windows
Escolha o Windows Mixed Reality como o dispositivo, que pode ser listado como Windows Holographic em versões mais antigas do Unity
Selecione Realidade Virtual Suportada
Como o objeto da câmera principal é automaticamente marcado como a câmera, Unity alimenta todos os movimentos e translações.
Nota
Essas configurações precisam ser aplicadas à câmera em cada cena do seu aplicativo.
Por padrão, quando você cria uma nova cena no Unity, ela conterá um GameObject da câmera principal na hierarquia que inclui o componente Câmera, mas pode não ter as configurações aplicadas corretamente.
Configuração da câmera VR
O Windows Mixed Reality oferece suporte a aplicativos em uma ampla variedade de escalas de experiência, desde aplicativos somente de orientação e dimensionados até aplicativos de escala de sala. No HoloLens, você pode ir além e criar aplicativos em escala mundial que permitem que os usuários caminhem além de 5 metros, explorando um andar inteiro de um prédio e além.
Sua primeira etapa na criação de uma experiência de realidade mista no Unity é determinar qual escala de experiência seu aplicativo segmentará:
Se você estiver criando para HL2, recomendamos criar uma experiência ao nível dos olhos ou considerar usar o Entendimento de cena para raciocinar sobre o chão da sua cena.
Aceda à secção Outras Definições das Definições do Leitor da Loja Windows
Escolha o Windows Mixed Reality como o dispositivo, que pode ser listado como Windows Holographic em versões mais antigas do Unity
Selecione Realidade Virtual Suportada
Como o objeto da câmera principal é automaticamente marcado como a câmera, Unity alimenta todos os movimentos e translações.
Nota
Essas configurações precisam ser aplicadas à câmera em cada cena do seu aplicativo.
Por padrão, quando você cria uma nova cena no Unity, ela conterá um GameObject da câmera principal na hierarquia que inclui o componente Câmera, mas não tem as configurações abaixo aplicadas corretamente.
Espaço de nomes:UnityEngine.XR Tipo:XRDevice
Para uma experiência em escala de pé ou de sala, você precisará colocar o conteúdo em relação ao chão. Você raciocina sobre o piso do usuário usando o estágio espacial, que representa a origem definida do nível do piso do usuário e o limite opcional da sala, configurado durante a primeira execução.
Para garantir que o Unity esteja operando com seu sistema de coordenadas mundiais no nível do chão, você pode definir e testar se o Unity está usando o tipo de espaço de rastreamento RoomScale:
if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
// RoomScale mode was set successfully. App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
// RoomScale mode was not set successfully. App cannot make assumptions about where the floor plane is.
}
Se SetTrackingSpaceType retornar true, Unity mudou com sucesso seu sistema de coordenadas mundiais para rastrear o quadro de referência do estágio.
Se SetTrackingSpaceType retornar false, o Unity não pôde alternar para o quadro de referência do palco, provavelmente porque o usuário não configurou um piso em seu ambiente. Embora um valor de retorno falso não seja comum, isso pode acontecer se o palco for configurado em uma sala diferente e o dispositivo for movido para a sala atual sem que o usuário configure um novo estágio.
Depois que seu aplicativo definir com êxito o tipo de espaço de rastreamento RoomScale, o conteúdo colocado no plano y=0 aparecerá no chão. A origem em 0, 0, 0 será o local específico no chão onde o usuário ficou durante a configuração da sala, com -Z representando a direção para frente que eles estavam enfrentando durante a configuração.
Aceda à secção Outras Definições das Definições do Leitor da Loja Windows
Escolha o Windows Mixed Reality como o dispositivo, que pode ser listado como Windows Holographic em versões mais antigas do Unity
Selecione Realidade Virtual Suportada
Como o objeto da câmera principal é automaticamente marcado como a câmera, Unity alimenta todos os movimentos e translações.
Nota
Essas configurações precisam ser aplicadas à câmera em cada cena do seu aplicativo.
Por padrão, quando você cria uma nova cena no Unity, ela conterá um GameObject da câmera principal na hierarquia que inclui o componente Câmera, mas não tem as configurações abaixo aplicadas corretamente.
Espaço de nomes:UnityEngine.XR Tipo:XRDevice
Para criar uma experiência somente de orientação ou em escala sentada, você precisa definir Unity para o tipo de espaço de rastreamento estacionário. O espaço de rastreamento estacionário define o sistema de coordenadas mundiais de Unity para rastrear o quadro de referência estacionário. No modo de rastreamento estacionário, o conteúdo colocado no editor logo em frente ao local padrão da câmera (avançar é -Z) aparecerá na frente do usuário quando o aplicativo for iniciado.
Para uma experiência apenas de orientação pura, como um visualizador de vídeo de 360 graus (onde atualizações de cabeça posicional arruinariam a ilusão), você pode definir XR. InputTracking.disablePositionalTracking para true:
InputTracking.disablePositionalTracking = true;
Para uma experiência em escala sentada, para permitir que o usuário recentralize posteriormente a origem sentada, você pode chamar o XR. Método InputTracking.Recenter :
InputTracking.Recenter();
Se você estiver criando uma experiência em escala sentada, poderá recentrar a origem mundial do Unity na posição atual de cabeça do usuário chamando o XR. Método InputTracking.Recenter .
Configuração do fundo da câmara
Se você estiver usando MRTK, o plano de fundo da câmera será configurado e gerenciado automaticamente. Para projetos XR SDK ou Legacy WSA, recomendamos definir o fundo da câmera como preto sólido no HoloLens e manter a skybox para RV.
Usando várias câmeras
Quando há vários componentes de câmera na cena, Unity sabe qual câmera usar para renderização estereoscópica com base em qual GameObject tem a tag MainCamera. No XR herdado, ele também usa essa tag para sincronizar o rastreamento de cabeça. No XR SDK, o rastreamento de cabeça é conduzido por um script TrackedPoseDriver anexado à câmera.
Compartilhamento de buffers de profundidade
Compartilhar o buffer de profundidade do seu aplicativo com cada quadro do Windows dará ao seu aplicativo um dos dois impulsos na estabilidade do holograma, com base no tipo de fone de ouvido para o qual você está renderizando:
Os fones de ouvido imersivos VR podem cuidar da reprojeção posicional quando um buffer de profundidade é fornecido, ajustando seus hologramas para previsões incorretas tanto na posição quanto na orientação.
Os auriculares HoloLens têm alguns métodos diferentes. O HoloLens 1 selecionará automaticamente um ponto de foco quando um buffer de profundidade for fornecido, otimizando a estabilidade do holograma ao longo do plano que cruza mais conteúdo. O HoloLens 2 irá estabilizar o conteúdo usando Profundidade LSR (ver Observações).
A caixa de diálogo de configuração do MRTK tentará definir configurações de buffer de profundidade para XR SDK e WSA herdado, mas é bom verificar essas guias e verificar as configurações no Unity.
Para definir se seu aplicativo Unity fornecerá um buffer de profundidade para o Windows:
Vá para Editar>configurações>do projeto Gerenciamento de plug-in XR e verifique se o item de menu está expandido.
Clique no item de menu correspondente ao tempo de execução XR que você escolheu, Windows Mixed Reality ou OpenXR. Além disso, verifique se a plataforma de compilação correta está selecionada, pois as guias para Windows Standalone e Universal Windows Platform estão disponíveis.
Para habilitar e configurar:
Para OpenXR, selecione um formato de profundidade ou "Nenhum" no menu suspenso Modo de envio de profundidade.
Para Windows Mixed Reality, marque ou desmarque a caixa de seleção Shared Depth Buffer . Em seguida, selecione um formato na lista suspensa Formato do buffer de profundidade.
Nota
Geralmente, recomenda-se o uso de buffers de profundidade de 16 bits para melhorar o desempenho. No entanto, se estiver usando o formato de profundidade de 16 bits, os efeitos necessários do buffer de estêncil (como alguns painéis de rolagem da interface do usuário Unity) não funcionarão porque o Unity não cria um buffer de estêncil nessa configuração. A seleção do formato de profundidade de 24 bits, por outro lado, geralmente criará um buffer de estêncil de 8 bits, se aplicável na plataforma gráfica de ponto final.
Para definir se seu aplicativo Unity fornecerá um buffer de profundidade para o Windows:
Vá para Editar>Configurações do>Projeto Player,>guia>Plataforma Universal do Windows, Configurações XR.
Expanda o item Windows Mixed Reality SDK .
Marque ou desmarque a caixa de seleção Ativar compartilhamento de buffer de profundidade. Ativar Compartilhamento de Buffer de Profundidade é verificado por padrão em novos projetos, mas pode ter sido desmarcado por padrão em projetos mais antigos.
Um buffer de profundidade pode melhorar a qualidade visual, desde que o Windows possa mapear com precisão os valores normalizados de profundidade por pixel em seu buffer de profundidade de volta para distâncias em metros, usando os planos próximos e distantes que você definiu no Unity na câmera principal. Se suas passagens de renderização manipulam valores de profundidade de maneiras típicas, você geralmente deve estar bem aqui, embora as passagens de renderização translúcidas que gravam no buffer de profundidade enquanto mostram os pixels de cor existentes podem confundir a reprojeção. Se você sabe que seus passes de renderização deixarão muitos de seus pixels de profundidade finais com valores de profundidade imprecisos, é provável que obtenha melhor qualidade visual desmarcando "Ativar compartilhamento de buffer de profundidade".
Nota
Geralmente, recomenda-se o uso de buffers de profundidade de 16 bits para melhorar o desempenho. No entanto, se estiver usando o formato de profundidade de 16 bits, os efeitos necessários do buffer de estêncil (como alguns painéis de rolagem da interface do usuário Unity) não funcionarão porque o Unity não cria um buffer de estêncil nessa configuração. A seleção do formato de profundidade de 24 bits, por outro lado, geralmente criará um buffer de estêncil de 8 bits, se aplicável na plataforma gráfica de ponto final.
Usando planos de recorte
Tornar o conteúdo muito próximo do usuário pode ser desconfortável na realidade mista. Você pode ajustar os planos de clipe próximos e distantes no componente Câmera.
Selecione a câmera principal no painel Hierarquia
No painel Inspetor, localize o componente Planos de recorte do componente Câmera e altere a caixa de texto Próximo de 0,3 para 0,85. O conteúdo renderizado ainda mais perto pode causar desconforto ao usuário e deve ser evitado de acordo com as diretrizes de distância de renderização.
O MRTK fornece um sistema de teletransporte in-box que funciona automaticamente através de mãos articuladas e controladores.
Recomendamos o uso da implementação de teletransporte do MRTK.
Se você optar por não usar o MRTK, o Unity fornecerá uma implementação de teletransporte no XR Interaction Toolkit.
Se você optar por implementar o seu próprio, é bom ter em mente que você não pode mover a câmera diretamente. Devido ao controle da câmera por Unity para rastreamento de cabeça, você precisará dar à câmera um pai na hierarquia e mover esse GameObject em vez disso. Este é o equivalente ao Playspace do MRTK.
Recomendamos o uso da implementação de teletransporte do MRTK.
Se você optar por implementar o seu próprio, é bom ter em mente que você não pode mover a câmera diretamente. Devido ao controle da câmera por Unity para rastreamento de cabeça, você precisará dar à câmera um pai na hierarquia e mover esse GameObject em vez disso. Este é o equivalente ao Playspace do MRTK.
Modos de reprojeção
Tanto o HoloLens quanto os fones de ouvido imersivos reprojetarão cada quadro renderizado pelo aplicativo para ajustar qualquer erro de previsão da posição real da cabeça do usuário quando os fótons forem emitidos.
Por predefinição:
Os fones de ouvido imersivos de RV cuidarão da reprojeção posicional se o aplicativo fornecer um buffer de profundidade para um determinado quadro. Os auriculares imersivos também ajustarão os seus hologramas para erros de previsão, tanto na posição como na orientação. Se um buffer de profundidade não for fornecido, o sistema corrigirá apenas erros de previsão na orientação.
Fones de ouvido holográficos como o HoloLens 2 cuidarão da reprojeção posicional, quer o aplicativo forneça seu buffer de profundidade ou não. A reprojeção posicional é possível sem buffers de profundidade no HoloLens, pois a renderização é muitas vezes esparsa com um fundo estável fornecido pelo mundo real.
Por exemplo, se você estiver criando uma experiência somente de orientação com conteúdo rigidamente bloqueado pelo corpo (por exemplo, conteúdo de vídeo de 360 graus), poderá definir explicitamente o modo de reprojeção como orientação somente definindo-o como ReprojectionMode.OrientationOnly.
Por exemplo, se você estiver criando uma experiência somente de orientação com conteúdo rigidamente bloqueado pelo corpo (por exemplo, conteúdo de vídeo de 360 graus), poderá definir explicitamente o modo de reprojeção como orientação somente definindo-o como HolographicReprojectionMode.OrientationOnly.
Próximo ponto de verificação de desenvolvimento
Se você está seguindo a jornada de desenvolvimento Unity que estabelecemos, você está no meio da exploração dos blocos de construção principais do MRTK. A partir daqui, você pode continuar para o próximo bloco de construção: