Problema di coordinate OpenGL [chiuso]
Domanda
Sto creando una semplice applicazione OpenGL 2D ma mi sembra di riscontrare alcuni problemi con la fotocamera. Quando disegno un rettangolo a (20,20), viene disegnato a (25,20) o giù di lì. Quando lo disegno a (100, 20) viene disegnato a 125 o giù di lì. Per alcuni motivi, tutto viene spostato a destra di un po 'del%.
Ho incollato una versione ridotta qui http://pastebin.com/m56491c4c
C'è qualcosa di sbagliato nel modo in cui sto impostando GLUT? So che non sono i miei oggetti a fare qualcosa di strano poiché la stessa cosa accade quando li disabilito.
Grazie in anticipo.
Soluzione
Devi impostare la matrice di proiezione all'interno della funzione di risagoma ( resize ()
), che risolve anche automaticamente il problema dell'utente che ridimensiona la finestra:
void resize(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, w, h, 0);
}
E quindi nella tua funzione di disegno, assicurati che la modalità matrice sia vista modello:
void draw()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
...
}
Altri problemi con il tuo codice:
- Probabilmente non dovresti chiamare
glutPostRedisplay ()
alla fine didraw ()
. Questo farà funzionare la tua CPU al 100%. Puoi invece usareglutTimerFunc ()
per avere ancora aggiornamenti ogni qualche numero di millisecondi. - In
processMouse ()
, stai usandowsprintf ()
su un array dichar
s:wsprintf ()
accetta una matrice di caratteri grandi (wchar_t
), quindi dovresti creare la variabile locales
di tipowchar_t []
, oppure utilizzaresprintf ()
eMessageBoxA ()
anzichéwsprintf ()
eMessageBoxW ()
(a cuiMessageBox ()
si espande come macro durante la compilazione di un'applicazione Unicode, che presumo tu stia facendo). Sei anche vulnerabile a un buffer overflow: dovresti usare un buffer di almeno 12 caratteri, anche se realisticamente non ti verrà mai passato un valorex
molto grande. Infine, dovresti anche usaresnprintf () / wsnprintf ()
invece disprintf () / wsprintf ()
per proteggerti dall'overflow del buffer.
Altri suggerimenti
Sembra che tu stia chiamando il tuo glOrtho2D sulla tua matrice ModelView. Dubito che sia questo il problema (poiché in questo caso suppongo che la tua proiezione dovrebbe essere l'identità), ma dovresti comunque chiamarla sulla tua matrice di proiezione.
Dovresti anche stampare w eh nella tua chiamata di ridimensionamento, solo per assicurarti che la dimensione della tua finestra sia effettivamente quella che pensi (non so come funziona glut, ma glutInitWindowSize () può includere bordi, che rovinerebbe le cose).
Dipende dal sistema su cui stai lavorando, ma di solito la maggior parte dei sistemi di coordinate di Windows inizia nell'angolo in basso a sinistra e conta fino in cima e a destra. In questo caso la tua chiamata gluOrth02D sarebbe errata.
Hai:
gluOrtho2D(0, appWidth, appHeight, 0);
Che ha la parte superiore della finestra in basso, viceversa.
Il più delle volte è:
gluOrtho2D(0, appWidth, 0, appHeight);
Come ho detto, dipende dal sistema, dalla piattaforma con cui lavori. Posso parlare solo per la maggior parte delle implementazioni di Linux.
Solo qualcos'altro da verificare nel caso in cui riguardi il tuo bug.