¿Cómo creo una matriz de proyección de media perspectiva y media perspectiva?

8

He estado tratando de hacer una fórmula para la matriz de proyección donde su eje vertical se proyecta ortográficamente pero su eje horizontal tendrá perspectiva.

Entonces la vista frustum se vería así: Ver frustrum

Estudié cómo las fórmulas de proyección ortográfica y de perspectiva y cómo se lograron. Y traté de modificarlos para intentar alcanzar la proyección que quería. Me pareció que no era posible tener una escala de eje a Z y la otra no (o hacer que escalen en un factor diferente).

¿Es posible alcanzar la perspectiva que quiero? Si es así, ¿cómo sería la matriz de proyección?

Pepijn Willekens
fuente
3
Ese es un asunto muy extraño ... ¿Puedes compartir con nosotros por qué necesitas algo así?
Alexandre Desbiens
Me gustaría usarlo para la cámara de un juego en el que estoy trabajando. Es un juego de vista lateral en 2D, pero me gustaría que los objetos se muevan paralax sobre otros, sin que vengan del suelo / techo cuando la cámara se mueve verticalmente.
Pepijn Willekens
Ese es un gran proyecto y una pregunta entonces. Espero que encuentres una respuesta para eso (aunque este tipo de cámara no es lo que ves todos los días).
Alexandre Desbiens

Respuestas:

2

Esta matriz de proyección debería hacer el truco:

.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 = la mitad del ancho del plano cercano

t = la mitad de la altura del plano cercano

f = distancia al plano lejano

n = distancia al plano cercano

Entonces, por ejemplo, intente elegir:

r = 0.1 (el ancho será 0.2)

t = 0.5 (la altura será 1.0)

f = 1000 (plano lejano a la distancia 1000)

n = 1 (plano cercano a la distancia 1)

walkingBird
fuente
0

Desafortunadamente, no creo que esto sea posible simplemente alterando la matriz de proyección. Después de la matriz de proyección, las coordenadas finales de la pantalla se calculan dividiendo (x, y, z) por w. Para una matriz de perspectiva, w se establece en z. Para una matriz ortográfica, w está establecido en 1. No puede tener valores de w diferentes para horizontal versus vertical. La otra respuesta a esta pregunta es solo una matriz ortográfica estándar.

Si tiene acceso al sombreador en sí y está dispuesto a agregar otro paso, puede usar una proyección ortográfica pero realizar la corrección de la perspectiva horizontal manualmente.

Mach Kobayashi
fuente