Come faccio a creare una matrice di proiezione per metà orto o per metà prospettiva


8

Ho cercato di creare una formula per la matrice di proiezione in cui l'asse verticale è proiettato ortogonalmente ma l'asse orizzontale avrà una prospettiva.

Quindi la vista frustum sarebbe simile a questa: Vedi frustrum

Ho studiato come le formule della proiezione ortografica e della proiezione prospettica e come sono state raggiunte. E ho provato a modificarli per provare a raggiungere la proiezione che volevo. Mi sembrava che non fosse possibile avere una scala di assi su Z e l'altra no (o avere una scala di un fattore diverso).

È possibile raggiungere la prospettiva che desidero? In caso affermativo, come sarebbe la matrice di proiezione?


3
Questo è un frustum dall'aspetto davvero strano ... Puoi condividere con noi perché hai bisogno di qualcosa del genere?
Alexandre Desbiens,

Mi piacerebbe usarlo per la fotocamera di un gioco a cui sto lavorando. È un gioco in 2D con vista laterale, ma mi piacerebbe che gli oggetti si spostassero su di loro, senza farli venire da terra / soffitto quando la telecamera si sposta in verticale.
Pepijn Willekens

È un grande progetto e una domanda allora. Spero che troverai una risposta per questo (anche se questo tipo di fotocamera non è ciò che vedi tutti i giorni).
Alexandre Desbiens,

Risposte:


2

Questa matrice di proiezione dovrebbe fare il trucco:

.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 = metà della larghezza del nearplane

t = metà dell'altezza del nearplane

f = distanza dal farplane

n = distanza dal piano vicino

Quindi, ad esempio, prova a scegliere:

r = 0.1 (la larghezza sarà 0.2)

t = 0,5 (l'altezza sarà 1.0)

f = 1000 (piano lontano alla distanza 1000)

n = 1 (nearplane alla distanza 1)


0

Sfortunatamente, non penso che ciò sia possibile semplicemente alterando la matrice di proiezione. Dopo la matrice di proiezione, le coordinate finali dello schermo vengono calcolate dividendo (x, y, z) per w. Per una matrice prospettica, w è impostato su z. Per una matrice ortografica, w è impostato su 1. Non è possibile avere valori w diversi per orizzontale rispetto a verticale. L'altra risposta a questa domanda è solo una matrice ortografica standard.

Se hai accesso allo shader stesso e desideri aggiungere un altro passaggio, puoi semplicemente utilizzare una proiezione ortografica ma eseguire manualmente la correzione della prospettiva orizzontale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.