2010-10-26 15 views
5

Ho lo stesso qustion come nel titolo:/ faccio qualcosa di simile:Come ruotare il modello non la videocamera in OpenGL?

glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(0.0f, 0, -zoom); 
    glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f); 
    glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f); 

    //Here model render :/ 

E nella mia macchina fotografica app è non ruota il modello:/

+6

come fai a sapere che è la tua macchina fotografica e non la tua modella? –

+1

Puoi inserire l'esempio di codice in una sezione di codice (seleziona il codice e fai clic sul pulsante "0101")? – LarsH

+0

@ SB, sei Steve Baker? Solo curioso.:-) – LarsH

risposta

0

Si utilizza GL_MODELVIEW quando si definisce la trasformazione per la vostra oggetti e GL_PROJECTION per trasformare il tuo punto di vista.

+0

Sta già utilizzando GL_MODELVIEW. Spero tu non stia dicendo di usare GL_PROJECTION per spostare la videocamera. Vedi http://sjbaker.org/steve/omniv/projection_abuse.html – LarsH

+0

Wow, ok. Facevo proiezioni parallele con la mia illuminazione, quindi non sarebbe stato un problema, ma sì, capisco perché questo sarebbe normalmente cattivo. – andrewmu

+0

FYI, il voto -1 non è mio. – LarsH

5

Presumibilmente, la ragione per cui ritieni che sia la fotocamera in movimento e non il tuo modello è perché tutti gli oggetti nella scena si stanno muovendo insieme?

Dopo il rendering del modello e prima del rendering di altri oggetti, si sta reimpostando la matrice MODELVIEW? In altre parole, stai facendo un altro glLoadIdentity() o glPopMatrix() dopo aver eseguito il rendering del modello di cui stai parlando e prima di eseguire il rendering di altri oggetti?

Perché in caso contrario, qualunque trasformazione applicata a quel modello si applicherà anche ad altri oggetti renderizzati, e sarà come se aveste ruotato il mondo intero (o la fotocamera).

Penso che ci può essere un altro problema con il codice però:

glTranslatef(0.0f, 0, -zoom); 
    glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f); 
    glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f); 
    //Here model render :/ 

Stai cercando di ruotare il modello attorno al punto (0, 0, -zoom)?

Normalmente, per ruotare attorno ad un certo punto (x, y, z), si fa:

  1. Traduci (x, y, z) all'origine (0,0,0) di traduzione dal vettore (-x, -y, -z)
  2. compiere rotazioni
  3. tradurre l'origine di nuovo a (x, y, z) traducendo dal vettore (x, y, z)
  4. Draw

Se stai provando a ruotare attorno al punto (0,0, zoom), non trovi il punto 3. Quindi provate ad aggiungere questo prima di rendere il vostro modello:

glTranslatef(0.0f, 0, zoom); // translate back from origin 

D'altra parte, se si sta cercando di ruotare il modello attorno al origine (0,0,0), e anche spostarlo lungo l'asse z, quindi vorrete che la vostra traduzione arrivi dopo la rotazione, come ha detto @nonVirtual.

E non dimenticare di reimpostare la matrice MODELVIEW prima di disegnare altri oggetti. Quindi l'intera sequenza dovrebbe essere qualcosa del tipo:

glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

#if you want to rotate around (0, 0, -zoom): 
    glTranslatef(0.0f, 0, -zoom); 
    glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f); 
    glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f); 
    glTranslatef(0.0f, 0, zoom); // translate back from origin 
#else if you want to rotate around (0, 0, 0): 
    glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f); 
    glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f); 
    glTranslatef(0.0f, 0, -zoom); 
#endif  
    //Here model render :/ 

    glLoadIdentity(); 
    // translate/rotate for other objects if necessary 
    // draw other objects 
+0

Ho luce sulla mia scena. il rendering è simile a: glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor (0.3,0.3,0.3,1); glMatrixMode (GL_MODELVIEW); glLoadIdentity(); glTranslatef (0.0f, 0, -zoom); glRotatef (yr * 20 + moveYr * 20, 0.0f, 1.0f, 0.0f); glRotatef (zr * 20 + moveZr * 20, 1.0f, 0.0f, 0.0f); render oggetti – openglNewbie

+0

OK ... ma stai facendo un altro glLoadIdentity() o glPopMatrix() dopo aver eseguito il rendering del modello di cui stai parlando e prima di eseguire il rendering di altri oggetti? Perché altrimenti, qualunque trasformazione applicata a quel modello si applicherà anche ad altri oggetti renderizzati, e sarà come se avessi ruotato il mondo intero (o la fotocamera). – LarsH

0

Credo che abbia a che fare con l'ordine in cui si applicano le proprie trasformazioni. Prova a cambiare l'ordine della chiamata a glRotate e glTranslate. Come ora lo stai spostando verso l'esterno dall'origine, quindi ruotandolo attorno all'origine, che darà l'aspetto dell'oggetto che orbita intorno alla telecamera. Se invece lo fai ruotare mentre è ancora all'origine, quindi spostalo, dovrebbe darti il ​​risultato desiderato. Spero possa aiutare.

+0

se si sta attualmente spostando verso l'esterno dall'origine o dall'origine dipende da dove sta iniziando. Ho pensato che il centro del modello fosse inizialmente a (0,0, zoom). Ma potresti avere ragione ... – LarsH

Problemi correlati