Προς το περιεχόμενο

γραφικά C++ με glut


sp_steve

Προτεινόμενες αναρτήσεις

Δημοσ.

ωραία, μια απο τις εντολές που εκτελούνται στην αρχή (υποθέτω στο main loop) είναι η reshape. στο παράδειγμα μου έχω την

 

void reshape (int w, int h)

{

glViewport (0, 0, (GLsizei) w, (GLsizei) h);

glMatrixMode (GL_PROJECTION);

glLoadIdentity ();

if (w <= h)

gluOrtho2D (0.0, 28, 0.0, 36*(GLfloat) h/(GLfloat) w);

else

gluOrtho2D (0.0, hh *(GLfloat) w/(GLfloat) h, 0.0, hh);

glMatrixMode(GL_MODELVIEW);

}

 

δημιουργεί ένα παράθυρο 2 διαστάσεων με 28 στοιχεία στον αξονα Χ και 36 στον άξονα Υ. επίσης αν αλλάξεις τις διαστάσεις του παραθύρου την ώρα που τρέχει απλώς μεγαλώνει τις εικόνες χωρίς να χαλάει τίποτα στο παιχνίδι. στο τέλος βάζει το matrixmode σε gl_modelview δηλαδή είμαστε έτοιμοι να φτιάξουμε τους στρατιώτες μας κτλπ......

 

η επόμενη συνάρτηση που χρειάζεται και χρησιμοποιείται, είναι η display, όπως είπαμε πριν τρέχει μια φορά απο το MainLoop, και μετά θα πρέπει να την ανανεώνουμε είτε όταν πατάμε κάποιο πλήκτρο είτε όταν περνάει κάποιος χρόνος (frames ουσιαστικά), με την χρήση της IdleFunc.

 

προσωπικά επειδή θέλω να πατάω ένα κουμπί π.χ αριστερά και να τρέχει ο pacman προς τα αριστερά, έχω κάνει το εξής:

 

void idleFunc(){

static int lastUpdate = 0;

static int frames = 0;

char buf[20];

 

glutPostRedisplay();

 

int currentTime = glutGet( GLUT_ELAPSED_TIME );

frames++;

 

if ( ( currentTime - lastUpdate ) >= 90 ){

lastpac = lastpac + 1;

if (lastkey == 1) { pleft(); }

else if (lastkey == 2) { pup(); }

else if (lastkey == 3) { pright(); }

else if (lastkey == 4) { pdown(); }

sprintf( buf, "FPS: %d", frames );

glutSetWindowTitle( buf );

frames = 0;

lastUpdate = currentTime;

}

Sleep(1);

}

με αυτο ουσιαστικά (το glutPostRedisplay(); ) το αναγκάζω να έχει ένα μικρό delay σε κάθε κίνηση, νομίζω οτι ουσιαστικά το αναγκάζω να κάνει περίπου 10 κινήσεις μέσα σε ένα δευτερόλεπτο, αλλα δεν είμαι και σίγουρος!! πάντως το αποτέλεσμα που θέλω το κάνω. π.χ αν ήθελα να κινείται πιο αργά ο pacman, απλά θα χρειαζόταν να ανεβάσω το 90 σε 160 η κάτι παρόμοιο.

 

και τώρα σε αυτό που θεωρώ το πιο σημαντικό κομάτι, είναι το θέμα οπου "εκτυπώνεις" τα γραφικά στην οθόνη.

 

αυτό γίνεται με την εντολή display που βάλαμε.

 

void display(void)

{

glClear (GL_COLOR_BUFFER_BIT);

glEnable(GL_TEXTURE_2D);

for (i=0;i<ww;i++)

for (j=0;j<hh;j++)

if (mymap[j] > 0) {

glPushMatrix();

glTranslatef(i,j,0.0);

glBindTexture(GL_TEXTURE_2D, texName[mymap[j]]);

glBegin(GL_QUADS);

glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 1.0);

glTexCoord2f(0.0, 1.0); glVertex2f(1.0, 1.0);

glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 0.0);

glTexCoord2f(1.0, 0.0); glVertex2f(0.0, 0.0);

glEnd();

glPopMatrix();

}

.................

 

στα παραπάνω μπορείς να καταλάβεις ακριβώς πως δουλεύει η glut. ουσιαστικά για να φτιάξει την πίστα, κάνει ενα pushmatrix (δηλαδή σκέψου οτι ετοιμάζεται να φτιάξει το ένα τετραγωνάκι στην οθόνη, και για να μην πειράξει ολα τα προηγούμενα τετράγωνα, δημιουργεί ένα ξεχωριστό χώρο που θα το κάνει αυτό. όπως δουλεύει η στοίβα.) στο τέλος κάνει PopMatrix για να συνεχίσει στο επόμενο τετραγωνάκι. με το glTranslatef βάζει τον κέρσορα στην θέση i,j. στην συνέχεια βάζει το texture που θέλουμε στο τετράγωνο π.χ ο pacman που είχα ποστάρει παραπάνω, η ένας στρατιώτης αντίστοιχα. και φτιάχνει ένα τετράγωνο (GL_QUADS) που αποτελείται απο τα παραπάνω vertexes.

με αυτον τον τρόπο μπορείς να σχεδιάσεις ΟΤΙ θέλεις στην οθόνη.

στο τέλος τελειώνει με αυτον τον τρόπο

 

glutSwapBuffers ();

}

δηλαδή αλλάζει την προηγούμενη εικόνα με την έτοιμη καινούρια. (αντι να σχεδιάσει 1-1 τα κομάτια τις εικόνας πράγμα που θα φαινόταν άσχημο και αργό.)

  • Απαντ. 39
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

Εμένα κατα την διάρκεια του παιχνιδιού το μόνο κουμπί που πατάω είναι το "1" για να πηγαίνει στον επόμενο γύρο..τεσπά αυτο δεν είναι πρόβλημα...στην συνέχεια?

Δημοσ.

επειδή όμως νομίζω οτι σε μπερδεύω παρά σε βοηθάω, πάρε και τον κώδικα μήπως σε βοηθήσει καλύτερα...

ξέρω οτι είναι κακογραμμένο και σε καμία περίπτωση υπόδειγμα κώδικα αλλα το έκανα μέσα σε 4 μέρες χωρίς να θυμάμαι πολλά πράγματα για την glut. και ούτε θέλω να το παίξω προγραματιστής είμαι άσχετος :P

 

ΕΔΩ

 

Εμένα κατα την διάρκεια του παιχνιδιού το μόνο κουμπί που πατάω είναι το "1" για να πηγαίνει στον επόμενο γύρο..τεσπά αυτο δεν είναι πρόβλημα...στην συνέχεια?

κοιτα η μόνη συνάρτηση που έμεινε που χρειάζεσαι είναι η loadmytex(δικιά μου συνάρτηση για να φορτώσει τα textures)

 

void loadmytex(int x, int y[])

{

glBindTexture(GL_TEXTURE_2D, texName[x]);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,

GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,

GL_NEAREST);

 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16,

16, 0, GL_RGBA, GL_UNSIGNED_BYTE,

y);

 

}

 

ουσιαστικά του δίνεις με το glBindTexture να δημιουργήσει το texture με όνομα texName (η οποιαδήποτε όνομα που θα δώσεις).

 

 

με την συνάρτηση αυτήν:

void makemytex(char *z[],GLubyte x[16][16][4],int y1,int y2,int y3)

{

for (i=0;i<16;i++)

for (j=0;j<16;j++)

if (z[j] == 'x') {

x[j][0] = y1;

x[j][1] = y2;

x[j][2] = y3;

x[j][3] = 255;

}

else {

x[j][0] = 0;

x[j][1] = 0;

x[j][2] = 0;

x[j][3] = 0;

}

}

 

δημιουργώ ένα δεδομένο glubyte 16χ16χ4 στοιχεία, για να βάλω μέσα τα χρώματα του κάθε στοιχείου, ουσιαστικά για να δημιουργήσω ένα σχήμα. όπως ο pacman πάνω είναι σχεδιασμένος απο Χ και τελείες, σε κάθε Χ θα βάλω το χρώμα που θέλω, ενώ σε κάθε τελεία θα το αντιστοιχήσω στο χρώμα 0.0.0, δηλαδή το μαύρο (background)

 

επίσης κάτι μου λέει οτι τα ορίσματα στις συναρτήσεις είναι λάθος, γιατι μου πετάει warnings, αλλα αφου δουλεύει δν ασχολήθηκα παραπάνω :P

Δημοσ.

Nομίζω ότι κάπου παρανοείτε τα πράγματα.

Προς αποφυγή παρεξηγήσεων θέλω να αναφέρω τα εξής.

 

Η glut είναι απλώς μια βιβλιοθήκη για να στήνεται cross-platform ένα βασικό παραθυρικό περιβάλλον στο OpenGL.

Είναι χρήσιμη κυρίως για διδακτικούς και επιδεικτικούς λόγους.

 

Για πλήρη παραθυρικό έλεγχο πρέπει να γίνει διασύνδεση του ΟpenGL με το ίδιο το λειτουργικό και να χρησιμοποιηθεί το API του

λειτουργικού. Ο τρόπος διασύνδεσης διαφέρει ανάλογα με το λειτουργικό (π.χ. για τα windows είναι η ομάδα εντολών wgl...)

και απαιτεί κάποιες προκαταρκτικές ρυθμίσεις (pixel format του παραθύρου κλπ) οι οποίες όμως είναι τετριμμένες.

Όμοια μπορεί να συνδεθεί με το openGL και κάποιο framework - εφόσον έχει την δυνατότητα. Π.χ. η Qt.

 

Τα παρελκόμενα (ποντίκι, πλήκτρα, βοηθητικά παράθυρα, κλπ) ελέγχονται από το API του λειτουργικού ή του framework.

Η glut (όπως και η αρκετά παλαιότερη glaux) δεν έχει τέτοια πράγματα ή τα έχει σε βασικό επίπεδο και είναι για να στηθεί

κάτι εύκολα και γρήγορα.

Δεν ξέρω αν αυτό έχει αλλάξει τώρα και την έχουν πλουτίσει αλλά όταν εγώ μελετούσα το openGL (μέχρι και την v. 2.1) έτσι ήταν.

Όποιος θέλει πλήρη έλεγχο χρησιμοποιεί το ΑPI του λειτουργικού όπως γίνεται και στο DirectX (βρόγχος μυνημάτων με την PeekMessage κλπ).

 

 

-

Δημοσ.

Βασικά η Glut δεν είναι μόνο για παράθυρα, αλλά κυρίως για δημιουργία γραφικών... και είναι όντως απλοποιημένη (κι εγκαταλελειμμένη... η FreeGlut είναι ο πιο καλοσυντηρημένος κλώνος της μέχρι σήμερα).

 

Η GLFW που ποστάρισε κάποιος φίλος παραπάνω ωστόσο δείχνει πολύ πιο ενδιαφέρουσα από την GLUT και τους κλώνους της.

Δημοσ.

Φίλε μου Luciddream ευχαριστώ πολύ για την βοήθειά σου και για το ενδιαφέρον σου... Θα προσπαθήσω και μόνος μου και άμα κολλήσω κάπου θα ξαναστείλω..

 

Ευχαριστώ και πάλι όλους σας...

Δημοσ.

Nομίζω ότι κάπου παρανοείτε τα πράγματα.

Προς αποφυγή παρεξηγήσεων θέλω να αναφέρω τα εξής.

Μα ειπαμε οτι συμφωνουμε σε ολα αυτα αλλα αφου σε glut επρεπε να γινει τι να κανουμε? Και σε πληροφορω στο τει αθηνας ακομα σε glut εξεταζονται στα γραφικα. Ενας λογος που "παρατησα" την σχολη ηταν οτι απογοητευτηκα απο το επιπεδο των μαθηματων..! Αλλα αυτη ειναι η ελληνικη πραγματικοτητα

 

android.png

Δημοσ.

Για την εκμάθηση του openGL η glut είναι μια χαρά και αυτό που ακριβώς πρέπει.

Με αυτήν στήνεται εύκολα ένα βασικό παραθυρικό περιβάλλον που είναι cross platform.

Αλλιώς θα έπρεπε να ξέρετε πώς να ανοίξετε παράθυρο os specific,

κάτι που απαιτεί αρκετά πράγματα (βρόγχος μυνημάτων κλπ) και δεν είναι το πρωταρχικό στην εκμάθηση του opengl.

Αυτό είναι απαραίτητο όταν γράφεται σοβαρός κώδικας (π.χ. μια μηχανή γραιφκών), οπότε και το αντίστοιχο τμήμα

διαφοροποιείται ανάλογα με το λειτουργικό (εκτός αν πρόκειται για cross platform framework σαν την Qt) .

 

Aνάφερα το παραπάνω επειδή ο τίτλος του νήματος είναι κάπως παραπλανητικός.

Το σωστό είναι "γραφικά με το opengl" κι'όχι με την glut.

Η glut είναι απλώς μια συλλογή από βοηθητικές ρουτίνες του opengl, το opengl κάνει τη δουλειά...

 

-

Δημοσ.

Μα ειπαμε οτι συμφωνουμε σε ολα αυτα αλλα αφου σε glut επρεπε να γινει τι να κανουμε? Και σε πληροφορω στο τει αθηνας ακομα σε glut εξεταζονται στα γραφικα. Ενας λογος που "παρατησα" την σχολη ηταν οτι απογοητευτηκα απο το επιπεδο των μαθηματων..! Αλλα αυτη ειναι η ελληνικη πραγματικοτητα

 

android.png

 

Καλύτερα ας μην ανοίξουμε αυτή την συζήτηση γιατί θα βγούμε εκτός θέματος...Το μόνο που μπορώ να σου πώ είναι ότι σε μας έχουν ζητηθεί γραφικά χωρίς καν να τα έχουμε διδαχθεί...απο κει πάρε και κατάλαβε την ελληνική παιδεία...

Δημοσ.

Καλύτερα ας μην ανοίξουμε αυτή την συζήτηση γιατί θα βγούμε εκτός θέματος...Το μόνο που μπορώ να σου πώ είναι ότι σε μας έχουν ζητηθεί γραφικά χωρίς καν να τα έχουμε διδαχθεί...απο κει πάρε και κατάλαβε την ελληνική παιδεία...

Κομπλέ. Παρόμοια πράγματα και σε εμάς που σε μάθημα δευτέρου εξαμήνου εργασία ολοκληρωμένη δεν παρέδωσε κανείς. Ελπίζω να περάσεις το μάθημα φίλε μου, όπως το πέρασα κι εγώ, γιατί δεν είναι να μπλέκεις με άτομα που βαριούνται να διδάξουν...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...