Domanda

Per il mio progetto avevo bisogno di ruotare un rettangolo. Ho pensato che sarebbe stato facile ma sto ottenendo un comportamento imprevedibile quando lo eseguo ..

Ecco il codice:

    glPushMatrix();
    glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBegin(GL_QUADS);

        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(0, 0);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(width_sprite_, 0);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(width_sprite_, height_sprite_);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(0, height_sprite_);

    glEnd();
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
    glPopMatrix();

Il problema è che il mio rettangolo sta facendo una traduzione da qualche parte nella finestra mentre ruota. In altre parole, il rettangolo non mantiene la posizione: vec_vehicle_position_.x e vec_vehicle_position_.y .

Qual è il problema?

Grazie

È stato utile?

Soluzione

Devi invertire l'ordine delle tue trasformazioni:

glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);

diventa

glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);

Altri suggerimenti

Per approfondire le risposte precedenti.

Le trasformazioni in OpenGL vengono eseguite tramite moltiplicazione di matrici. Nel tuo esempio hai:

M_r_ - la trasformazione di rotazione

M_t_ - la trasformazione della traduzione

v - un vertice

e li hai applicati nell'ordine:

M_r_ * M_t_ * v

Uso delle parentesi per chiarire:

(M_r_ * (M_t_ * v))

Vediamo che il vertice viene prima trasformato dalla matrice più vicina, che in questo caso è la traduzione. Può essere un po 'contro intuitivo perché ciò richiede che tu specifichi le trasformazioni nell'ordine opposto a quello in cui vuoi che vengano applicate. Ma se pensi a come vengono posizionate le trasformazioni nella pila di matrici, si spera che abbia un po' più senso (lo stack viene pre-moltiplicato insieme).

Ecco perché per ottenere il risultato desiderato è necessario specificare le trasformazioni nell'ordine opposto.

Inertiatic ha fornito un'ottima risposta. Dal punto di vista del codice, le tue trasformazioni avverranno nell'ordine inverso in cui appaiono. In altre parole, le trasformazioni più vicine al codice di disegno reale verranno applicate per prime.

Ad esempio:
glRotate ();
glTranslate ();
glScale ();
drawMyThing ();

Per prima cosa ridimensiona la tua cosa, quindi la traduce, quindi la ruota. Devi effettivamente " leggere il codice indietro " per capire quali trasformazioni vengono applicate in quale ordine. Inoltre, tieni presente quale è lo stato di queste trasformazioni quando fai push e pop lo stack di visualizzazione del modello.

Assicurati che la rotazione sia applicata prima della traduzione.

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