Wie erstelle ich eine halb ortho halb perspektivische Projektionsmatrix?

8

Ich habe versucht, eine Formel für die Projektionsmatrix zu erstellen, bei der Ihre vertikale Achse orthographisch projiziert wird, Ihre horizontale Achse jedoch eine Perspektive hat.

Der View Frustum würde also so aussehen: Frustrum anzeigen

Ich habe untersucht, wie die Formeln der orthografischen Projektion und der perspektivischen Projektion erreicht wurden und wie sie erreicht wurden. Und versuchte, diese zu modifizieren, um die von mir gewünschte Projektion zu erreichen. Es schien mir nicht möglich zu sein, eine Achse auf Z zu skalieren und die andere nicht (oder sie auf einen anderen Faktor skalieren zu lassen).

Ist es möglich, die gewünschte Perspektive zu erreichen? Wenn ja, wie würde die Projektionsmatrix aussehen?

Pepijn Willekens
quelle
3
Das ist ein ernsthaft seltsam aussehender Kegelstumpf ... Können Sie uns mitteilen, warum Sie so etwas brauchen?
Alexandre Desbiens
Ich möchte es für die Kamera eines Spiels verwenden, an dem ich arbeite. Es ist ein 2D-Sideview-Spiel, aber ich möchte, dass Objekte Paralax übereinander bewegen, ohne dass sie vom Boden / der Decke kommen, wenn sich die Kamera vertikal bewegt.
Pepijn Willekens
Das ist dann ein tolles Projekt und eine tolle Frage. Ich hoffe, Sie finden eine Antwort darauf (obwohl diese Art von Kamera nicht das ist, was Sie jeden Tag sehen).
Alexandre Desbiens

Antworten:

2

Diese Projektionsmatrix sollte den Trick machen:

.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 = halbe Breite der Nearplane

t = halbe Höhe der Nearplane

f = Entfernung zur Farplane

n = Abstand zur Nearplane

Versuchen Sie zum Beispiel Folgendes:

r = 0,1 (Breite beträgt 0,2)

t = 0,5 (Höhe wird 1,0 sein)

f = 1000 (ferne Ebene im Abstand 1000)

n = 1 (in der Nähe der Ebene in Entfernung 1)

WalkingBird
quelle
0

Leider glaube ich nicht, dass dies durch einfaches Ändern der Projektionsmatrix möglich ist. Nach der Projektionsmatrix werden die endgültigen Bildschirmkoordinaten durch Teilen von (x, y, z) durch w berechnet. Für eine perspektivische Matrix wird w auf z gesetzt. Für eine orthografische Matrix wird w auf 1 gesetzt. Sie können keine unterschiedlichen w-Werte für horizontal oder vertikal haben. Die andere Antwort auf diese Frage ist nur eine orthografische Standardmatrix.

Wenn Sie Zugriff auf den Shader selbst haben und bereit sind, einen weiteren Schritt hinzuzufügen, können Sie einfach eine orthografische Projektion verwenden, aber die Korrektur der horizontalen Perspektive manuell durchführen.

Mach Kobayashi
quelle