Usando easyar em motores 3d
Ao usar o easyar em um motor 3d, é necessário renderizar a imagem da câmera e objetos virtuais. Renderizar objetos virtuais requer alinhamento com a imagem da câmera. Ao renderizar a imagem da câmera, alguns parâmetros durante a geração e exibição da imagem podem não corresponder, como posição, orientação, formato, proporção de aspecto, etc., do físico da câmera, que podem ser diferentes da imagem exibida no monitor. Isso deve ser considerado durante a renderização. Se precisar conectar o easyar a um motor 3d sem suporte, preste atenção especial aos seguintes detalhes.
Recorte de preenchimento de borda de imagem de câmera
Recorte, transposição e codificação de imagem exigem grande poder computacional. Para reduzir cálculos e latência, geralmente são usados formatos mais brutos. Para facilitar a codificação de vídeo, imagens de câmeras físicas frequentemente são alinhadas a blocos como 8x8, 16x16, 32x32, 64x64. Por exemplo, em alguns smartphones com resolução selecionada de 1920x1080, a imagem de saída pode tornar-se 1920x1088, porque 1080 não é múltiplo de 64.

Isso exige que essas partes de preenchimento extras sejam removidas durante a renderização. Existem várias abordagens possíveis: uma é especificar a largura ao enviar a imagem para a memória de vídeo, como em OpenGL usando glPixelStorei(GL_PACK_ROW_LENGTH, ...); outra é calcular manualmente as coordenadas UV no fragment shader e truncar partes excedentes ao amostrar a imagem.
Renderização seguindo a orientação de rotação da tela
Em smartphones, imagens gravadas por câmeras físicas geralmente são fixas em relação ao corpo do dispositivo, não mudando com a orientação de exibição da tela. Porém, mudanças na orientação do corpo do telefone afetam nossa definição das direções superior, inferior, esquerda e direita da imagem. Durante a renderização, a orientação de exibição atual da tela também afeta a direção da imagem exibida.
Geralmente, durante a renderização, é necessário determinar um ângulo de rotação da imagem da câmera em relação à orientação de exibição da tela.
Se usarmos \(\theta_{tela}\) para representar a rotação em radianos no sentido horário da imagem da tela em relação à sua orientação natural, \(\theta_{câmerafis}\) para representar a rotação em radianos no sentido horário que a imagem da câmera física precisa para ser exibida corretamente em uma tela de orientação natural, e \(\theta\) para representar a rotação em radianos no sentido horário que a imagem da câmera física precisa para ser exibida na tela atual.
Para a câmera traseira, temos
Por exemplo, em um smartphone Android, ao usá-lo na orientação natural, \(\theta_{tela} = 0, \theta_{câmerafis} = \frac{\pi}{2}\), então \(\theta = \frac{\pi}{2}\).
Para a câmera frontal, se após a rotação for realizada uma inversão esquerda-direita, temos
Nota
Quando a imagem da tela gira, \(\theta\) deve ser recalculado imediatamente no primeiro quadro após a rotação ocorrer, caso contrário, pode ocorrer uma orientação anormal momentânea da imagem da tela.
Fundo da câmera e renderização de objetos virtuais
Para renderizar objetos virtuais em smartphones, é necessário alinhá-los com a imagem da câmera. Isso exige que coloquemos a câmera de renderização e os objetos em um espaço virtual totalmente correspondente ao espaço real, usando o mesmo campo de visão e proporção de aspecto da câmera física para renderização. A transformação de projeção perspectiva pela qual a imagem da câmera e os objetos virtuais passam é quase idêntica, com apenas uma diferença: a transformação de perspectiva da imagem da câmera ocorre principalmente na câmera física, enquanto a dos objetos virtuais é inteiramente um processo computacional.
O que segue adota a convenção OpenGL. Ao usar outras convenções, é necessário mapear os eixos de coordenadas adequadamente. Suponha que os eixos do sistema de coordenadas da câmera sejam definidos da seguinte forma: eixo x apontando para a direita, eixo y apontando para cima, eixo z apontando para fora da tela. Os eixos do sistema de coordenadas de recorte são definidos assim: eixo x apontando para a direita, eixo y apontando para cima, eixo z apontando para fora da tela, eixo w sendo virtual.
Neste caso, a matriz de transformação de projeção perspectiva necessária para renderizar a imagem da câmera é a seguinte:
Onde: flip indica se a imagem deve ser invertida esquerda-direita, sendo 1 para inverter e 0 para não inverter; \(\theta\) é o ângulo de rotação horária da imagem, em radianos; \(s_x\), \(s_y\) são fatores de escala, usados para escalonamento isotrópico ou preenchimento isotrópico, e variam com \(\theta\). Esta matriz de transformação primeiro escala a imagem da câmera, depois a rotaciona e, por fim, realiza a inversão. Para renderizar, deve-se usar um retângulo cobrindo toda a tela, por exemplo, em OpenGL, os vértices do retângulo podem ser colocados em \((-1, -1, 0)\), \((1, -1, 0)\), \((1, 1, 0)\), \((-1, 1, 0)\), com coordenadas UV definidas nos cantos correspondentes, e então usar esta matriz de projeção perspectiva para renderizar.
A matriz de projeção perspectiva necessária para renderizar objetos virtuais é a seguinte:
Onde: \(n\), \(f\) são os parâmetros de recorte próximo e distante usados na matriz de projeção perspectiva típica de renderização 3D; \(w\), \(h\) são a largura e altura em pixels da imagem da câmera; \(f_x\), \(f_y\), \(c_x\), \(c_y\) são os parâmetros intrínsecos comumente usados no modelo de câmera, sendo \(f_x\), \(f_y\) as distâncias focais em pixels, e \(c_x\), \(c_y\) as posições do ponto principal em pixels. Esta matriz de projeção realiza sequencialmente as seguintes transformações: transformação de perspectiva com os parâmetros intrínsecos da câmera (incluindo duas transformações de sistema de coordenadas devido à direção oposta dos eixos y e z no sistema de coordenadas de imagem OpenCV em relação ao sistema de coordenadas da câmera OpenGL), transformação do sistema de coordenadas de pixels de imagem para o sistema de coordenadas do retângulo de imagem, transformação de recorte próximo e distante, e a transformação de projeção perspectiva usada ao renderizar a imagem da câmera.
Após organização, obtemos:
Deste processo, vê-se que a renderização geralmente precisa ser feita em duas etapas: uma para renderizar a imagem da câmera e outra para renderizar os objetos virtuais, com os objetos virtuais sobrepostos à imagem da câmera.
Alguns motores 3D expressam a matriz de projeção perspectiva em termos de campo de visão horizontal, proporção de aspecto, etc. Se rotação e inversão forem desconsideradas, e o deslocamento do ponto principal for ignorado, é possível calcular, onde o campo de visão horizontal \(\alpha=2 \arctan{\frac{w}{2 f_x}}\), e a proporção de aspecto \(r=\frac{w}{h}\).
É importante notar que este processo não considera distorção da câmera, pois atualmente, a maioria das câmeras de smartphones tem distorção muito leve.