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.

È stato utile?

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 di draw () . Questo farà funzionare la tua CPU al 100%. Puoi invece usare glutTimerFunc () per avere ancora aggiornamenti ogni qualche numero di millisecondi.
  • In processMouse () , stai usando wsprintf () su un array di char s: wsprintf () accetta una matrice di caratteri grandi ( wchar_t ), quindi dovresti creare la variabile locale s di tipo wchar_t [] , oppure utilizzare sprintf () e MessageBoxA () anziché wsprintf () e MessageBoxW () (a cui MessageBox () 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 valore x molto grande. Infine, dovresti anche usare snprintf () / wsnprintf () invece di sprintf () / 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.

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