Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di pcg4m3s
    Registrato dal
    Aug 2007
    Messaggi
    244

    [OPENGL] Cubo che ruota su se stesso sospeso in aria

    Ho il seguente problema.
    Devo disegnare un cubo sospeso in aria che ruota su se stesso.
    Se lo disegno in questo modo, inserendo le seguenti righe nella mia funzione di disegno:
    codice:
    ...
    rotazione+=0.05;
            glPushMatrix();
    	glColor3f(0.0f, 0.0f, 1.0f);
    	glTranslatef(posizioneCuboRotante[X], posizioneCuboRotante[Y], posizioneCuboRotante[Z]);
    	glRotatef(rotazione, 0, 1, 1);
    	glutSolidCube(0.5);
            glPopMatrix();
    ...
    va tutto bene.

    Mentre se lo disegno in quest'altro modo:
    codice:
    ...
    rotazione+=0.05;
    disegnaCuboRotante(posizioneCuboRotante[X], posizioneCuboRotante[Y], posizioneCuboRotante[Z]);
    ...
    dove la funzione disegnaCuboRotante è la seguente:
    codice:
    void disegnaCuboRotante(GLfloat x, GLfloat y, GLfloat z)
    {
    	GLfloat dim=pavimento.cell_size/2;
    	GLfloat x1=x-dim;
    	GLfloat y1=y+dim;
    	GLfloat x2=x+dim;
    	GLfloat y2=y+dim;
    	GLfloat x3=x+dim;
    	GLfloat y3=y-dim;
    	GLfloat x4=x-dim;
    	GLfloat y4=y-dim;
    
    	
    	glPushMatrix();
    		
    		glRotatef(rotazione, 0.0f, 0.0f, 1.0f);
    		
    		glColor3f(1,0,0);
    		glNormal3f(0.0, 0.0, 1.0);
    		//SOTTO
    		glBegin(GL_QUADS);
    		glVertex3f(x1, y1, z);
    		glVertex3f(x2, y2, z);
    		glVertex3f(x3, y3, z);
    		glVertex3f(x4, y4, z);
    		glEnd();
    
    		//DI FRONTE
    		glBegin(GL_QUADS);
    		glVertex3f(x1, y1, z);
    		glVertex3f(x1, y1, z+1);
    		glVertex3f(x2, y2, z+1);
    		glVertex3f(x2, y2, z);
    		glEnd();
    		
    		//DIETRO
    		glBegin(GL_QUADS);
    		glVertex3f(x4, y4, z);
    		glVertex3f(x4, y4, z+1);
    		glVertex3f(x3, y3, z+1);
    		glVertex3f(x3, y3, z);
    		glEnd();
    
    		//SINISTRA
    		glBegin(GL_QUADS);
    		glVertex3f(x1, y1, z);
    		glVertex3f(x1, y1, z+1);
    		glVertex3f(x4, y4, z+1);
    		glVertex3f(x4, y4, z);
    		glEnd();
    
    		//DESTRA
    		glBegin(GL_QUADS);
    		glVertex3f(x2, y2, z);
    		glVertex3f(x2, y2, z+1);
    		glVertex3f(x3, y3, z+1);
    		glVertex3f(x3, y3, z);
    		glEnd();
    
    		//SOPRA
    		glBegin(GL_QUADS);
    		glVertex3f(x1, y1, z+1);
    		glVertex3f(x2, y2, z+1);
    		glVertex3f(x3, y3, z+1);
    		glVertex3f(x4, y4, z+1);
    		glEnd();
    
    	glPopMatrix();
    }
    mi succede che il cubo si sposta e se ne va.
    Come potrei risolvere questo problema?

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    A me funziona. evidentemente la tua matrice cambia da qualche altra parte.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it L'avatar di pcg4m3s
    Registrato dal
    Aug 2007
    Messaggi
    244
    Originariamente inviato da linoma
    A me funziona. evidentemente la tua matrice cambia da qualche altra parte.
    a quale matrice ti riferisci?
    potresti postare il codice del programma completo che dici che ti funziona?

  4. #4
    Utente di HTML.it L'avatar di pcg4m3s
    Registrato dal
    Aug 2007
    Messaggi
    244
    se ti riferisci alla mia funzione di reshape, è la seguente:
    codice:
    void ChangeSize(int w, int h)
    {
        GLfloat fAspect;
    	
        // Prevent a divide by zero
        if(h == 0)
            h = 1;
    
        // Set Viewport to window dimensions
        glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    
        fAspect = (GLfloat)w/(GLfloat)h;
    
        // Reset coordinate system
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
    
        // Produce the perspective projection
        gluPerspective(60.0f, fAspect, 0.1, 50.0);
    	
    	glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();	
    }

  5. #5
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Forse nel loop della tua applicazione, disegnando + oggetti, ometti qualche glPush. Ho copiato ed incollato il tuo codice.
    Cm riferimento alla matrice dai per buona la matrice modelview
    Per gli Spartani e Sparta usa spartan Il mio github

  6. #6
    Utente di HTML.it L'avatar di pcg4m3s
    Registrato dal
    Aug 2007
    Messaggi
    244
    Originariamente inviato da linoma
    Forse nel loop della tua applicazione, disegnando + oggetti, ometti qualche glPush. Ho copiato ed incollato il tuo codice.
    Cm riferimento alla matrice dai per buona la matrice modelview
    ma pur omettendo qualche glpush non dovrebbe andar bene nemmeno il disegno con glsolidcube o no?
    qui o non ho capito bene il push e pop sulle matrici o no so...
    mi potresti dire in parole povere a che serve il glpushmatrix e glpopmatrix e che differenza c'è tra la matrice modelview e quella projection?
    grazie!

  7. #7
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Intanto cosidera questo che ad ogni glRotate e ogni glTranslate la tua matrice modelview viene moltiplicata per le rispettive matrici, quindi cambiando l'ordine di glRotate e glTranslate ti ritrovi cn 2 matrici diverse.
    glPush e glPop, salva e ricaricano le matrici da uno stack.
    la matrice projection serve a trasformare le tue coordinate in clip coordinate, qui viense spiegato meglio.
    La modelview ti evita di dover cambiare ad ogni rotazione i vertici del tuo cubo, lo fa la pipeline per te.
    Per gli Spartani e Sparta usa spartan Il mio github

  8. #8
    Utente di HTML.it L'avatar di pcg4m3s
    Registrato dal
    Aug 2007
    Messaggi
    244
    Originariamente inviato da linoma
    Intanto cosidera questo che ad ogni glRotate e ogni glTranslate la tua matrice modelview viene moltiplicata per le rispettive matrici, quindi cambiando l'ordine di glRotate e glTranslate ti ritrovi cn 2 matrici diverse.
    glPush e glPop, salva e ricaricano le matrici da uno stack.
    la matrice projection serve a trasformare le tue coordinate in clip coordinate, qui viense spiegato meglio.
    La modelview ti evita di dover cambiare ad ogni rotazione i vertici del tuo cubo, lo fa la pipeline per te.
    no ma io intendo spiegato in poche parole... non mi interessano i dettagli, per questo ti chiedevo il favore (se puoi se no non fa niente).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.