Comment créer une matrice de projection mi-ortho mi-perspective


8

J'ai essayé de faire une formule pour la matrice de projection où votre axe vertical est projeté orthographiquement mais votre axe horizontal aura une perspective.

Le point de vue ressemblerait donc à ceci: Voir frustrum

J'ai étudié comment les formules de projection orthographique et de projection en perspective et comment elles étaient réalisées. Et j'ai essayé de les modifier pour essayer d'atteindre la projection que je voulais. Il me semblait qu'il n'était pas possible d'avoir une échelle d'axe à Z et l'autre pas (ou de les faire évoluer à un facteur différent).

Est-il possible d'atteindre la perspective que je veux? Si oui, à quoi ressemblerait la matrice de projection?


3
C'est un truc qui a l'air vraiment bizarre ... Pouvez-vous partager avec nous pourquoi vous avez besoin de quelque chose comme ça?
Alexandre Desbiens

Je voudrais l'utiliser pour la caméra d'un jeu sur lequel je travaille. C'est un jeu de vision latérale 2D, mais j'aimerais que les objets se déplacent en parallèle les uns par rapport aux autres, sans les faire venir du sol / plafond lorsque la caméra se déplace verticalement.
Pepijn Willekens du

C'est un excellent projet et une question alors. J'espère que vous trouverez une réponse à cela (bien que ce type d'appareil photo ne soit pas ce que vous voyez tous les jours).
Alexandre Desbiens

Réponses:


2

Cette matrice de projection devrait faire l'affaire:

.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 moitié de la largeur du plan proche

t = la moitié de la hauteur du plan proche

f = distance au plan éloigné

n = distance jusqu'au plan proche

Par exemple, essayez de choisir:

r = 0,1 (la largeur sera de 0,2)

t = 0,5 (la hauteur sera de 1,0)

f = 1000 (plan éloigné à une distance de 1000)

n = 1 (près du plan à la distance 1)


0

Malheureusement, je ne pense pas que cela soit possible en modifiant simplement la matrice de projection. Après la matrice de projection, les coordonnées finales de l'écran sont calculées en divisant (x, y, z) par w. Pour une matrice de perspective, w est défini sur z. Pour une matrice orthographique, w est défini sur 1. Vous ne pouvez pas avoir de valeurs w différentes pour horizontal par rapport à vertical. L'autre réponse à cette question est juste une matrice orthographique standard.

Si vous avez accès au shader lui-même et souhaitez ajouter une autre étape, vous pouvez simplement utiliser une projection orthographique mais effectuer la correction de perspective horizontale manuellement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.