Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [C++] Aiuto animazione in OpenGL

    Ciao a tutti,
    sto usando per la prima volta la libreria opengl con visualStudio 2015. Per la mia tesi devo disegnare una griglia di esagoni deformati in maniera non regolare. Questa l'ho realizzata importando le coordinate dei vertici su un file txt e richiamando questi dati in glBegin(GL_POLYGON). Adesso dovrei fare in modo che questi esagoni si accendono di bianco o di nero, secondo una certa sequenza (salvata anch'essa su un file txt). Ovvero ad ogni frame ogni esagono deve avere un colore nero o bianco (ma non tutti bianchi o tutti neri), ogni esagono è indipendente dall'altro. Ad esempio se ho 5 esagoni, avrò una matrice del genere per il colore di sfondo di ciascuno:
    codice:
    1 0 0 1 1 0 0 0
    1 1 1 0 0 1 0 1
    0 1 0 1 1 1 1 0
    0 0 0 0 1 1 0 0
    1 0 1 1 0 0 1 0
    Ovvero al primo frame leggerò la prima colonna, quindi il primo esagono sarà bianco (1), il secondo bianco (1), il terzo nero (0), il quarto nero (0), il quinto bianco (1). Così via per gli altri frame.


    Questo è il codice che ho scritto:
    codice:
    #define MAXR 1236
    #define MAXC 103*32676
    #include <freeglut.h>
    #include <iostream>
    #include <fstream>
    
    
    float mat[MAXR];
    int seq[MAXC];
    int sfondo[32676];
    using namespace std;
    GLfloat t = 4;
    int c = 0;
    
    
    void init(void)
    {
        glClearColor(0.7, 0.7, 0.7, 0.0); // colore sfondo, il quarto parametro indica la trasparenza
        glShadeModel(GL_FLAT);
        glEnable(GL_DEPTH_TEST);
    }
    
    void draw(void)
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glColor3i(seq[c], seq[c], seq[c]);
        //glPolygonMode(GL_FRONT, GL_LINE);
        for (int j = 0; j < 728; j=j+12) {
            for (int i = 1*j; i < 1*j+12; i = i + 2) {
                glBegin(GL_POLYGON);     // Inizio poligono
                
                glVertex2f(1.7*mat[i],1.7*mat[i + 1]);            
            }
               glEnd();   //fine poligono
            
        }
            glutSwapBuffers();
    }
    
    
    void display(void) {
        c = c + 1;
        if (c = 32676) {
            seq[c] = 0.7;
        }
        glutPostRedisplay(); // la finestra corrente deve essere nuovamente visualizzata
        }
    
    void mouse(int button, int state, int x, int y)
    {
        switch (button) {
        case GLUT_LEFT_BUTTON:
            if (state == GLUT_DOWN)  //clic del muose
                glutIdleFunc(display);
            break;
        case GLUT_RIGHT_BUTTON:
            if (state == GLUT_DOWN)
                glutIdleFunc(NULL);
            break;
        default:
            break;
        }
    }
    
    
    void Resize(int iWidth, int iHeight)
    {
        glViewport(0, 0, (GLsizei)iWidth, (GLsizei)iHeight);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-683.0, 683.0, -384.0, 384.0, -1.0, 1.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
    
    int main(int argc, char** argv)
    {
        // legge dati punti esagoni
        
        ifstream dati("puntook.txt");
        int r = 0;
        while (!dati.eof())
        {
            dati >> mat[r];
            r++;
        }
        dati.close();
    
        // legge dati sequenza
    
        ifstream datidue("dec_pol15.txt");
    
        while (!datidue.eof())
        {
            datidue >> seq[c];
            c++;
        }
        dati.close();
    
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize(350, 350);
        glutInitWindowPosition(100, 100);
        glutCreateWindow("Pattern 103 esagoni");
        init();
        
        glutDisplayFunc(draw);
        glutReshapeFunc(Resize);
        glutMouseFunc(mouse);
        glutMainLoop();
    
    
    }
    Qualcuno saprebbe aiutarmi?
    Ultima modifica di MItaly; 13-12-2015 a 20:14 Motivo: Tag CODE, linguaggio nel titolo

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Il problema sembra abbastanza interessante.
    Potresti psotare anche il file txt che stai usando?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Quote Originariamente inviata da XWolverineX Visualizza il messaggio
    Il problema sembra abbastanza interessante.
    Potresti psotare anche il file txt che stai usando?
    L'altro file non me lo fa aggiungere, perchè è troppo grande (calcola è una matrice 32676x128), ma è sostanzialmente una matrice di 1 e 0.
    File allegati File allegati

  4. #4
    Ancora non sono riuscita a risolvere il problema. C'è qualcuno che potrebbe aiutarmi o darmi qualche consiglio semplicemente?

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Vorrei aiutarti ma non hai fornito tutti i files necessari, e inoltre freeglut non è disponibile sul mio sistema (MacOsX)
    Si lo so, sono molto pigro.

    Freeglut posso installarlo, ma almeno provvedi tutto il necessario per eseguire la cosa.
    Ultima modifica di XWolverineX; 16-12-2015 a 19:45
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  6. #6
    Quote Originariamente inviata da XWolverineX Visualizza il messaggio
    Vorrei aiutarti ma non hai fornito tutti i files necessari, e inoltre freeglut non è disponibile sul mio sistema (MacOsX)
    Si lo so, sono molto pigro.

    Freeglut posso installarlo, ma almeno provvedi tutto il necessario per eseguire la cosa.

    Inserito anche l'altro
    File allegati File allegati

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Vediamo cosa riesco a fare.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Potresti spiegare l'algoritmo con il quale stai costruendo i poligoni? Non capisco perchè moltiplicare per 1.7 e come hai impostato il ciclo for.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  9. #9
    Quote Originariamente inviata da XWolverineX Visualizza il messaggio
    Potresti spiegare l'algoritmo con il quale stai costruendo i poligoni? Non capisco perchè moltiplicare per 1.7 e come hai impostato il ciclo for.

    La moltiplicazione per 1.7 è solo un ingrandimento del 70%. Puoi anche toglierlo ti verrà una figura più piccola. Il ciclo for invece mi legge semplicemente la matrice che sta nel file allegato. Ogni poligono ha sei vertici, quindi sei ascisse e sei ordinate, in totale 12. Quindi ad ogni passo devo incrementare di 12 per avere un nuovo poligono.

  10. #10
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Ok adesso che è tutto chiaro sono riuscito a dare un sguardo al tuo codice.
    In effetti c'eri quasi vicina, ma hai fatto alcuni errori.

    Questo è il codice corretto
    codice:
    #define MAXR 1236#define MAXC 103*32676
    
    
    #include <OpenGL/gl.h>
    #include <OpenGL/glu.h>
    #include <GLUT/glut.h>
    #include <iostream>
    #include <fstream>
    
    
    
    
    float mat[MAXR];
    int seq[MAXC];
    int sfondo[32676];
    using namespace std;
    GLfloat t = 4;
    int c = 0;
    
    
    static uint frameCount = 0;
    
    
    void init(void)
    {
        glClearColor(0.7, 0.7, 0.7, 0.0); // colore sfondo, il quarto parametro indica la trasparenza
        glShadeModel(GL_FLAT);
        glEnable(GL_DEPTH_TEST);
    }
    
    
    void draw(void)
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        
        for (int j = 0; j < 728; j=j+12) {
            glBegin(GL_POLYGON);
            uint colorIndex = (frameCount * j) % c;
            int colorValue = seq[colorIndex];
            glColor3f(colorValue, colorValue, colorValue);
            
            for (int i = 1*j; i < 1*j+12; i = i + 2) {
                glVertex2f(mat[i],mat[i + 1]);
            }
            
            glEnd();   //fine poligono
        }
        glutSwapBuffers();
        frameCount++;
    }
    
    
    
    
    void display(void) {
        glutPostRedisplay(); // la finestra corrente deve essere nuovamente visualizzata
    }
    
    
    void mouse(int button, int state, int x, int y)
    {
        switch (button) {
            case GLUT_LEFT_BUTTON:
                if (state == GLUT_DOWN)  //clic del muose
                    glutIdleFunc(display);
                break;
            case GLUT_RIGHT_BUTTON:
                if (state == GLUT_DOWN)
                    glutIdleFunc(NULL);
                break;
            default:
                break;
        }
    }
    
    
    
    
    void Resize(int iWidth, int iHeight)
    {
        glViewport(0, 0, (GLsizei)iWidth, (GLsizei)iHeight);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-683.0, 683.0, -384.0, 384.0, -1.0, 1.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
    
    
    int main(int argc, char** argv)
    {
        
        ifstream exagonData("puntook.txt");
        int r = 0;
        while (!exagonData.eof())
        {
            exagonData >> mat[r];
            r++;
        }
        exagonData.close();
        
        // legge dati sequenza
        
        ifstream blackWhite("dec_pol15.txt");
        
        while (!blackWhite.eof())
        {
            blackWhite >> seq[c];
            c++;
        }
        blackWhite.close();
        
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
        glutInitWindowSize(1024, 768);
        glutInitWindowPosition(100, 100);
        glutCreateWindow("Pattern 103 esagoni");
        init();
        
        glutDisplayFunc(draw);
        glutReshapeFunc(Resize);
        glutMouseFunc(mouse);
        glutMainLoop();
        
        
    }
    In primis, attenzione quando apri e chiudi i file sul disco, hai fatto confusione con le variabili (chiudi due volte la variabile dati ma in realtà la seconda volta dovrebbe essere datidue. In generale, usa dei nomi più chiari.

    glBegin deve essere usato all'inizio di ogni poligono e non di ogni vertice (per cui va messo fuori dal for in cui l'hai piazzato tu).

    L'algoritmo con cui scegli il colore dell'esagono corrispondente è errato. Rivedi il mio per capire come ho fatto.


    Ed il risultato finale è questo (molto più veloce sul mio MacBook)



    Un saluto!
    Ultima modifica di XWolverineX; 19-12-2015 a 17:03
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

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 © 2025 vBulletin Solutions, Inc. All rights reserved.