Freeglut

Fra TermvaktWiki
Gå til: navigasjon, søk

Freeglut er et OSS-alternativ til OpenGL Utility Toolkit (GLUT), og lar programmereren jobbe med openGL uten å tenke på hvilken plattform (Windows, Linux, OSX) man jobber på. Det har også støtte for veldig grunnleggende behandling av input fra mus, tastatur og lignende.

Innhold

OpenGLUT eksempler

Disse eksemplene baserer seg på kode fra foilene til INF3320 - Metoder i grafisk databehandling og diskret geometri.

Før vi starter er det lurt å opprette en mappe på hjemmeområdet.

kabeern@kaldfront ~ $ mkdir glutwiki
kabeern@kaldfront ~ $ cd glutwiki/
./glutwiki/
kabeern@kaldfront ~/glutwiki $

og en C++ fil (test.cpp) vi kan skrive kode i:

kabeern@kaldfront ~/glutwiki $ touch test.cpp 
kabeern@kaldfront ~/glutwiki $ 

Opprette et vindu

Koden under oppretter et nytt vindu på 512x512 piksler med tittelen "Tittel" og hvit bakgrunn.

#include <GL/freeglut.h>
#include <iostream>

using namespace std;

void my_init() {
    // Hvilken farge du vil ha i vinduet til å starte med
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}

// Kalles hvert eneste gang vi har forandret på noe og vil at det skal vises på
// skjermen
void my_display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glutSwapBuffers();
}


int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
                 // bredde, høyde    
    glutInitWindowSize(512, 512);
    glutCreateWindow("Tittel");

    // Forteller GLUT hvilken metode som skal kalles for å vise ting i vinduet
    glutDisplayFunc(my_display);
    
    // Initialiserer verdier, structer o.l. vi skal bruke i programmet
    my_init();
    glutMainLoop();
    return 0;
}

Det er utrolig viktig å ha metodekall som glutDisplayFunc og my_init mellom glutCreateWindow og glutMainLoop. Hvis vi ikke gjør dette så vil ikke programmet skjønne verken hva det skal tegne i vinduet eller hvilke verdier vi initialiserer.

Vi skriver og lagrer dette i test.cpp også kompilerer og kjører det for å se om programmet virker som vi ønsker.

kabeern@kaldfront ~/glutwiki $ g++ -Wall -lglut test.cpp -o test 
kabeern@kaldfront ~/glutwiki $ ./test 

Tastaturinput

Hvis du vil at programmet skal reagere noe når du trykker rundt på tastaturet, f.eks. skifte bakgrunnsfargen til rød, grønn eller blå når du taster på 'r', 'g' eller 'b', så kan du bruke koden under til det.

void my_key(unsigned char key, int x, int y) {
    // Vi vil at det skal fylle vinduet med rødt, grønt og blått når noen
    // trykker på 'R', 'G', eller 'B' på tastaturet
    switch(key) {
        case 'r':
                glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
                break;
        case 'g':
                glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
                break;
        case 'b':
                glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
                break;
    }
    
    // Skriver ut verdiene my_key blir kalt med til terminalen
    cerr << "key: " << key << " x: " << x << " y: " << y << "\n";
    glutPostRedisplay();
}

glutPostRedisplay forteller GLUT at vi vil at den skal tegne vinduet om igjen. Vi kunne kalt på my_display får gjøre dette direkte, men den korrekte måten å gjøre dette på er ved å kalle på glutPostRedisplay som da vil kalle på my_display.

For å få GLUT til å bruke my_key så må vi ha med følgende i main-metoden:

    glutKeyboardFunc(my_key);

Museinput

For å behandle input fra musen så kan vi ha en metode som forandrer bakgrunnsfargen når vi trykker og slipper ned på venstre eller høyre museknapp.

void my_mpress(int b, int s, int x, int y) {

    // Rosa bakgrunnsfarge når vi trykker ned på venstre museknapp
    if(b == GLUT_LEFT_BUTTON && s == GLUT_DOWN)
        glClearColor(1.0f, 0.0f, 1.0f, 1.0f);

    // Gult bakgrunnsfarge når vi slipper venstre museknapp
    if(b == GLUT_LEFT_BUTTON && s == GLUT_UP)
        glClearColor(1.0f, 1.0f, 0.0f, 1.0f);

    // Turkis bakgrunnsfarge når vi trykker ned på høyre museknapp
    if(b == GLUT_RIGHT_BUTTON && s == GLUT_DOWN)
        glClearColor(0.0f, 1.0f, 1.0f, 1.0f);

    // Lysegrønt bakgrunnsfarge når vi slipper høyre museknapp
    if(b == GLUT_RIGHT_BUTTON && s == GLUT_UP)
        glClearColor(0.5f, 1.0f, 0.5f, 1.0f);

    // Skriver ut verdiene my_mpress blir kalt med til terminalen
    cerr << "b: " << b << " s: " << s << " x: " << x << " y: " << y << "\n";
    glutPostRedisplay();
}

Legg til denne kodesnutten i main-metoden for å fortelle GLUT at den skal bruke my_mpress når vi trykker på museknappene.

    glutMouseFunc(my_mpress);

Koden

#include <GL/freeglut.h>
#include <iostream>

using namespace std;

void my_init() {
    // Hvilken farge du vil ha i vinduet til å starte med
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}

// Kalles hvert eneste gang vi har forandret på noe og vil at det skal vises på
// skjermen
void my_display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glutSwapBuffers();
}

// Håndterer museinput
// b angir hvilken del av musen som blir brukt, s om vi trykker opp eller ned.
// x og y forteller hvor musepekeren befinner seg i vinduet
void my_mpress(int b, int s, int x, int y) {

    // Rosa bakgrunnsfarge når vi trykker ned på venstre museknapp
    if(b == GLUT_LEFT_BUTTON && s == GLUT_DOWN)
        glClearColor(1.0f, 0.0f, 1.0f, 1.0f);

    // Gult bakgrunnsfarge når vi slipper venstre museknapp
    if(b == GLUT_LEFT_BUTTON && s == GLUT_UP)
        glClearColor(1.0f, 1.0f, 0.0f, 1.0f);

    // Turkis bakgrunnsfarge når vi trykker ned på høyre museknapp
    if(b == GLUT_RIGHT_BUTTON && s == GLUT_DOWN)
        glClearColor(0.0f, 1.0f, 1.0f, 1.0f);

    // Lysegrønt bakgrunnsfarge når vi slipper høyre museknapp
    if(b == GLUT_RIGHT_BUTTON && s == GLUT_UP)
        glClearColor(0.5f, 1.0f, 0.5f, 1.0f);

    // Skriver ut verdiene my_mpress blir kalt med til terminalen
    cerr << "b: " << b << " s: " << s << " x: " << x << " y: " << y << "\n";
    glutPostRedisplay();
}

// Håndterer tastatur input.
// x og y er koordinatene til musepekeren når vi trykker på
// en tastaturknapp
void my_key(unsigned char key, int x, int y) {
    // Vi vil at det skal fylle vinduet med rødt, grønt og blått når noen
    // trykker på 'R', 'G', eller 'B' på tastaturet
    switch(key) {
        case 'r':
                glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
                break;
        case 'g':
                glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
                break;
        case 'b':
                glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
                break;
    }
    
    // Skriver ut verdiene my_key blir kalt med til terminalen
    cerr << "key: " << key << " x: " << x << " y: " << y << "\n";
    glutPostRedisplay();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
                 // bredde, høyde    
    glutInitWindowSize(512, 512);
    glutCreateWindow("Tittel");

    // Forteller GLUT hvilken metode som skal kalles for å vise ting i vinduet
    glutDisplayFunc(my_display);
    // Forteller GLUT hvilken metode vi bruker for å håndtere tastatur-input
    glutKeyboardFunc(my_key);
    // Forteller GLUT hvilken metode vi vil bruke til å håndtere museinput
    glutMouseFunc(my_mpress);

    // Initialiserer verdier, structer o.l. vi skal bruke i programmet
    my_init();
    
    glutMainLoop();
    return 0;
}

Eksterne lenker

Personlige verktøy
Navnerom
Varianter
Handlinger
Navigasjon
Kategorier
Programvare
Andre
Translate
Verktøy