Domanda

Ho provato a rendere un GL_QUAD (che ha la forma di un trapezio) con una trama quadrata. Mi piacerebbe provare a usare OpenGL solo per farlo. In questo momento la trama sta diventando pesantemente distorta ed è davvero fastidiosa.

Normalmente, caricarei la trama per calcolare un'omografia, ma ciò significa molto lavoro e una libreria di programmazione lineare aggiuntiva / funzione di trasformazione lineare diretta. Ho l'impressione che OpenGL possa semplificarmi questo processo.

Ho guardato in giro sul Web e ho visto "Prospettiva -Struttura corretta, coordinate Q e GLSL " e "Mappatura della trama inclinata / inclinata in OpenGL" .

Tutti sembrano presumere che farai qualche tipo di calcolo dell'omografia o utilizzerai alcune parti di OpenGL di cui non sono a conoscenza ... qualche consiglio?

<⇨Update:

Ho letto "Navigazione in ambienti statici utilizzando immagini- Space Simplification and Morphing " [ PDF ] - pagina 9 appendice A.

Sembra che disabilitino la correzione della prospettiva moltiplicando la coordinata della trama (s, t, r, q) con il vertice del componente z dello spazio del mondo di un modello.

quindi per una data coordinata di trama (s, r, t, q) per un quadrilatero a forma di trapezio, dove i 4 componenti sono:

(0.0f, 0.0f, 0.0f, 1.0f),
(0.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 0.0f, 0.0f, 1.0f) 

È facile come glTexCoord4f (s vert.z, r vert.z, t, q * vert.z)? O mi manca qualche passaggio? come scherzare con GL_TEXTURE glMatrixMode?

Aggiornamento n. 2:

Questo ha funzionato! Tenetelo a mente, gente, questo problema è ovunque sul Web e non c'erano risposte facili. La maggior parte implicava il ricalcolo diretto della texture con un'omografia tra la forma originale e la forma trasformata ... ovvero molta algebra lineare e una dipendenza da lib BLAS esterna.

È stato utile?

Soluzione

Ecco una buona spiegazione del problema e della soluzione.

http://www.xyzw.us/~cass/qcoord/

Parzialmente copiato e adattato dal link sopra, creato da Cass

Uno degli aspetti più interessanti della mappatura delle texture è lo spazio in cui vivono le coordinate delle texture. Alla maggior parte di noi piace pensare allo spazio delle texture come un semplice piano affine 2D. Nella maggior parte dei casi questo è perfettamente accettabile e molto intuitivo, ma a volte diventa problematico.

Ad esempio, supponiamo di avere un quadrilatero trapezoidale nelle coordinate spaziali ma quadrato nelle coordinate della trama.

OpenGL dividerà il quad in triangoli e calcolerà le pendenze delle coordinate della trama (ds / dx, ds / dy, dt / dx, dt / dy) e le utilizzerà per interpolare la coordinata della trama all'interno del poligono. Per il triangolo inferiore sinistro, dx= 1 e ds= 1, ma per il triangolo superiore destro, dx <1 mentre ds= 1. Questo rende ds / dx per il triangolo superiore destro maggiore di ds / dx per quello inferiore. Questo produce un'immagine sgradevole quando viene mappata la trama.

Lo spazio delle texture non è semplicemente un piano affine 2D anche se generalmente lasciamo da soli i valori predefiniti r= 0 e q= 1. È davvero uno spazio proiettivo pieno (P3)! Questo è positivo, perché invece di specificare le coordinate della trama per i vertici superiori come coordinate (s, t) di (0, 1) e (1, 1), possiamo specificarle come coordinate (s, t, r, q) di (0, larghezza, 0, larghezza) e (larghezza, larghezza, 0, larghezza)! Queste coordinate corrispondono alla stessa posizione nell'immagine della trama, ma GUARDA cosa è successo a ds / dx: ora è lo stesso per entrambi i triangoli !! Entrambi hanno lo stesso dq / dx e anche dq / dy.

Nota che è ancora nel piano z= 0. Può creare confusione quando si utilizza questa tecnica con una proiezione prospettica della telecamera a causa della "falsa percezione della profondità" che ciò produce. Tuttavia, potrebbe essere meglio che usare solo (s, t). Sta a te decidere.

Altri suggerimenti

Immagino che la maggior parte delle persone che desiderano adattare una trama rettangolare su un trapezio stia pensando a uno dei due risultati:

  1. proiezione prospettica: il trapezio sembra un rettangolo visto da un angolo obliquo.
  2. Trasformazione "elastica": il trapezio assomiglia a un pezzo di gomma rettangolare che è stato allungato / ridotto in forma.

La maggior parte delle soluzioni qui su SO rientrano nel primo gruppo, mentre recentemente mi sono trovato nel secondo.

Il modo più semplice che ho trovato per ottenere l'effetto 2. era dividere il trapezio in un rettangolo e un triangolo rettangolo.Nel mio caso il trapezio era regolare, quindi un quadrilatero e due triangoli hanno risolto il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top