Como criar uma matriz de projeção meio orto e meia perspectiva

8

Eu tenho tentado fazer uma fórmula para a matriz de projeção em que seu eixo vertical é projetado ortograficamente, mas seu eixo horizontal terá perspectiva.

Portanto, o view frustum ficaria assim: Ver frustrum

Estudei como as fórmulas de projeção ortográfica e projeção em perspectiva e como elas foram alcançadas. E tentei modificá-los para tentar alcançar a projeção que eu queria. Pareceu-me que não era possível escalar um eixo para Z e o outro não (ou escalá-los em um fator diferente).

É possível alcançar a perspectiva que eu quero? Se sim, como seria a matriz de projeção?

Pepijn Willekens
fonte
3
Esse é um frustum de aparência muito estranha ... Você pode compartilhar conosco porque precisa de algo assim?
Alexandre Desbiens 9/07/2015
Eu gostaria de usá-lo para a câmera de um jogo em que estou trabalhando. É um jogo lateral 2D, mas eu gostaria que objetos fossem paralaxados, sem que eles viessem do chão / teto quando a câmera se mover na vertical.
Pepijn Willekens
Esse é um ótimo projeto e pergunta então. Espero que você encontre uma resposta para isso (embora esse tipo de câmera não seja o que você vê todos os dias).
Alexandre Desbiens

Respostas:

2

Essa matriz de projeção deve fazer o truque:

.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
<table class="tg">
  <tr>
    <th class="tg-031e">1/r</th>
    <th class="tg-031e">0</th>
    <th class="tg-031e">0</th>
    <th class="tg-031e">0</th>
  </tr>
  <tr>
    <td class="tg-031e">0</td>
    <td class="tg-031e">1/t</td>
    <td class="tg-031e">0</td>
    <td class="tg-031e">0</td>
  </tr>
  <tr>
    <td class="tg-031e">0</td>
    <td class="tg-031e">0</td>
    <td class="tg-031e">-2/(f-n)</td>
    <td class="tg-031e">-(f+n)/(f-n)</td>
  </tr>
</table>

r = metade da largura do plano próximo

t = metade da altura do plano próximo

f = distância ao plano distante

n = distância até o plano próximo

Por exemplo, tente escolher:

r = 0,1 (a largura será 0,2)

t = 0,5 (a altura será 1,0)

f = 1000 (plano distante à distância 1000)

n = 1 (nearplane na distância 1)

walkingBird
fonte
0

Infelizmente, acho que isso não é possível apenas alterando a matriz de projeção. Após a matriz de projeção, as coordenadas finais da tela são calculadas dividindo (x, y, z) por w. Para uma matriz de perspectiva, w é definido como z. Para uma matriz ortográfica, w é definido como 1. Você não pode ter valores de w diferentes para horizontal e vertical. A outra resposta a esta pergunta é apenas uma matriz ortográfica padrão.

Se você tiver acesso ao próprio sombreador e quiser adicionar outra etapa, basta usar uma projeção ortográfica, mas faça a correção da perspectiva horizontal manualmente.

Mach Kobayashi
fonte