Πώς να φτιάξετε έναν κύβο στο OpenGL

Συγγραφέας: Gregory Harris
Ημερομηνία Δημιουργίας: 12 Απρίλιος 2021
Ημερομηνία Ενημέρωσης: 1 Ιούλιος 2024
Anonim
Πώς να σπάσετε ένα αυγό σωστά
Βίντεο: Πώς να σπάσετε ένα αυγό σωστά

Περιεχόμενο

Το OpenGL είναι ένα εργαλείο προγραμματισμού 3D που σας επιτρέπει να δημιουργήσετε πολύπλοκες τρισδιάστατες εικόνες από απλά σχήματα. Σε αυτό το άρθρο, θα μάθετε πώς να σχεδιάζετε με τη βοήθειά του έναν απλό κύβο που μπορεί να περιστραφεί σε τρεις διαστάσεις!

Βήματα

Μέρος 1 από 3: Αρχική εγκατάσταση

  1. 1 Εγκαταστήστε το OpenGL. Ξεκινήστε με ένα σεμινάριο για το πώς να εγκαταστήσετε το OpenGL στον υπολογιστή σας. Εάν έχετε ήδη OpenGL και έναν μεταγλωττιστή C, μπορείτε να παραλείψετε αυτό το βήμα και να προχωρήσετε στο επόμενο.
  2. 2 Δημιουργήστε ένα έγγραφο. Δημιουργήστε ένα νέο αρχείο στον αγαπημένο σας επεξεργαστή κώδικα και αποθηκεύστε το ως mycube.c
  3. 3 Προσθήκη #περιλαμβάνει. Ακολουθούν οι βασικές οδηγίες #include που θα χρειαστείτε. Είναι σημαντικό να θυμάστε ότι οι οδηγίες για διαφορετικά λειτουργικά συστήματα είναι διαφορετικές και επομένως πρέπει να επιλέξετε τα πάντα, ώστε το πρόγραμμα να είναι καθολικό και να μπορεί να εκτελεστεί σε οποιοδήποτε σύστημα.

      // Περιλαμβάνει #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 Προσθέστε λειτουργικά πρωτότυπα και σφαιρικά. Το επόμενο βήμα είναι να δηλώσουμε λειτουργικά πρωτότυπα.

      // Λειτουργικά πρωτότυπα void display (); void specialKeys (); // Καθολικές μεταβλητές double rotate_y = 0; διπλό rotate_x = 0;

  5. 5 Ορίστε την κύρια συνάρτηση ().

      int main (int argc, char * argv []) // Αρχικοποίηση GLUT και επεξεργασία προσαρμοσμένων παραμέτρων glutInit (& argc, argv); // Ζητήστε ένα παράθυρο με υποστήριξη για διπλό buffer, Z-Buffering And True Color glutInitDisplayMode (GLUT_DOUBLE

Μέρος 2 από 3: Λειτουργία οθόνης ()

  1. 1 Κατανοήστε τον σκοπό της συνάρτησης οθόνης (). Όλες οι εργασίες για την απόδοση του κύβου θα πέσουν στις εύθραυστες γραμμές αυτής της συνάρτησης. Η γενική ιδέα είναι η εξής: θα σχεδιάσετε έξι ξεχωριστές όψεις του κύβου και θα τις τοποθετήσετε στις αντίστοιχες θέσεις τους.
    • Για κάθε πρόσωπο, θα ορίσετε τέσσερις γωνίες και το OpenGL θα τις συνδέσει με γραμμές και θα τις γεμίσει με το χρώμα που έχετε επιλέξει. Πώς να το κάνετε αυτό θα εξηγηθεί παρακάτω.
  2. 2 Προσθέστε τη συνάρτηση glClear (). Πρώτα απ 'όλα, όταν δουλεύουμε με αυτήν τη λειτουργία, χρειαζόμαστε καθαρό χρώμα και z-buffer... Χωρίς αυτό, το παλιό θα είναι ορατό κάτω από τη νέα εικόνα και τα αντικείμενα που σχεδιάζονται από το πρόγραμμα θα τοποθετηθούν λανθασμένα.

      void display () // Clear The Screen And Z Buffer glClear (GL_COLOR_BUFFER_BIT

    • Δώστε προσοχή στις δύο τελευταίες γραμμές. Αυτές είναι οι συναρτήσεις glFlush (); και glutSwapBuffers ();, δίνοντας το αποτέλεσμα του διπλού ρυθμιστικού διαλύματος, το οποίο περιγράφηκε παραπάνω.

Μέρος 3 από 3: Διαδραστικότητα προγράμματος

  1. 1 Προσθέστε τη συνάρτηση specialKeys (). Κατ 'αρχήν, όλα είναι σχεδόν έτοιμα, αλλά ο κύβος τραβιέται μόνο και δεν περιστρέφεται. Για να γίνει αυτό, πρέπει να δημιουργήσετε τη συνάρτηση specialKeys (), το οποίο θα σας επιτρέψει να περιστρέψετε τον κύβο πατώντας τα πλήκτρα βέλους!
    • Για αυτήν τη συνάρτηση δηλώθηκαν οι καθολικές μεταβλητές rotate_x και rotate_y. Όταν πατάτε το αριστερό και το δεξί βέλος, η τιμή rotate_y θα αυξηθεί ή μειωθεί κατά πέντε μοίρες. Η τιμή του rotate_x θα αλλάξει με τον ίδιο τρόπο, αλλά αυτή τη φορά πατώντας τα πάνω και κάτω βέλη.
    • void specialKeys (int key, int x, int y) {// Δεξί βέλος - αυξήστε την περιστροφή κατά 5 μοίρες εάν (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Αριστερό βέλος - Μείωση περιστροφής κατά 5 βαθμούς αλλού εάν (κλειδί == GLUT_KEY_LEFT) rotate_y - = 5; αλλιώς εάν (κλειδί == GLUT_KEY_UP) rotate_x + = 5; αλλιώς εάν (κλειδί == GLUT_KEY_DOWN) περιστρέψτε_x - = 5; // Αίτημα Ανανέωσης οθόνης glutPostRedisplay (); }

  2. 2 Προσθήκη glRotate (). Το τελευταίο πράγμα που θα κάνουμε είναι να προσθέσουμε μια γραμμή που θα μας επιτρέψει να περιστρέψουμε το αντικείμενο. Επιστροφή στη λειτουργία απεικόνιση () και πριν από την περιγραφή της μπροστινής πλευράς προσθέστε:

      // Επαναφορά μετασχηματισμού glLoadIdentity (); // Περιστροφή όταν αλλάζει ο χρήστης Οι τιμές rotate_x και rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Πολύχρωμη πλευρά - ΕΜΠΡΟΣ ....

    • Λάβετε υπόψη ότι η σύνταξη glRotatef ()που είναι παρόμοια με τη σύνταξη των glColor3f () και glVertex3f (), αλλά απαιτεί πάντα τέσσερις παραμέτρους. Το πρώτο είναι η γωνία περιστροφής σε μοίρες. Οι επόμενοι τρεις είναι οι άξονες κατά τους οποίους πραγματοποιείται η περιστροφή, με τη σειρά x, y, z. Προς το παρόν, πρέπει να περιστρέψουμε τον κύβο κατά μήκος δύο αξόνων, x και y.
    • Όλοι οι μετασχηματισμοί που ορίζουμε στο πρόγραμμα απαιτούν παρόμοιες γραμμές. Βασικά, αναπαριστούμε την περιστροφή ενός αντικειμένου κατά μήκος του άξονα x ως αλλαγή στην τιμή του rotate_x και την περιστροφή κατά μήκος του άξονα y ως αλλαγή στην τιμή του rotate_y. Ωστόσο, το OpenGL θα ομαδοποιήσει τα πάντα σε έναν πίνακα μετασχηματισμού. Κάθε φορά που καλείτε την οθόνη, θα δημιουργείτε έναν πίνακα μετασχηματισμού και glLoadIdentity () θα σας επιτρέψει να ξεκινήσετε με μια νέα μήτρα κάθε φορά.
    • Άλλες συναρτήσεις μετασχηματισμού που μπορεί να έχετε χρησιμοποιήσει είναι το glTranslatef () και το glScalef (). Είναι παρόμοια με το glRotatef (), εκτός από το ότι απαιτούν μόνο τρεις παραμέτρους: τις τιμές x, y και z για να αλλάξουν το μέγεθος και να κλιμακώσουν το αντικείμενο.
    • Για να εμφανίζονται όλα σωστά όταν εφαρμόζονται και οι τρεις μετασχηματισμοί σε ένα αντικείμενο, πρέπει να ορίσετε μετασχηματισμούς με την κατάλληλη σειρά, συγκεκριμένα glTranslate, glRotate, glScale - και ποτέ αλλιώς. Το OpenGL μετατρέπει το αντικείμενο διαβάζοντας το πρόγραμμα από κάτω προς τα πάνω. Για να το καταλάβετε καλύτερα, φανταστείτε πώς θα φαινόταν ο κύβος 1x1x1 μετά από όλους τους μετασχηματισμούς εάν το OpenGL τους εφάρμοζε με τη σειρά που εμφανίζεται (από πάνω προς τα κάτω) και, στη συνέχεια, σκεφτείτε πώς το OpenGL θα επεξεργαζόταν τον κύβο διαβάζοντας τις οδηγίες από κάτω προς τα πάνω.
  3. 3 Προσθέστε τις ακόλουθες εντολές για να κλιμακώσετε τον κύβο δύο φορές στις κατευθύνσεις x και y, να περιστρέψετε τον κύβο κατά 180 μοίρες στον άξονα y και να μετακινήσετε τον κύβο 0,1 στον άξονα x. Βεβαιωθείτε ότι όλες οι σχετικές εντολές, συμπεριλαμβανομένων των προηγούμενων εντολών glRotate (), είναι στη σωστή σειρά. Αν φοβάστε να κάνετε λάθος, δείτε την τελική έκδοση του προγράμματος στο τέλος του άρθρου.

      // Περισσότεροι μετασχηματισμοί glTranslatef (0.1, 0.0, 0.0); glRotatef (180, 0.0, 1.0, 0.0); glScalef (2.0, 2.0, 0.0);

  4. 4 Μεταγλωττίστε και εκτελέστε τον κώδικα. Ας υποθέσουμε ότι χρησιμοποιείτε το gcc ως μεταγλωττιστή σας, οπότε εισαγάγετε τις ακόλουθες εντολές στο τερματικό σας:

      Σε Linux: gcc cube.c -o cube -lglut -lGL ./ mycube Σε Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL ./ mycube Στα Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32 ./ mycube

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

      // // Αρχείο: mycube.c // Συντάκτης: Matt Daisley // Δημιουργήθηκε: 4/25/2012 // Έργο: Πηγαίος κώδικας για το Make a Cube στο OpenGL // Περιγραφή: Δημιουργεί ένα παράθυρο OpenGL και σχεδιάζει έναν κύβο 3D/ / Ότι ο χρήστης μπορεί να περιστρέφεται χρησιμοποιώντας τα πλήκτρα βέλους // // Στοιχεία ελέγχου: Αριστερό βέλος -Περιστροφή Αριστερά // Δεξί βέλος -Περιστροφή δεξιά // Πάνω βέλος -Περιστροφή επάνω // Κάτω βέλος -Περιστροφή κάτω // ------ ------------------------------------------------------ -// Περιλαμβάνει // ------------------------------------------------ -------------- #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif // -------------------------------------------- ------------------ // Πρωτότυπα συνάρτησης // -------------------------- -------------------------------- ακύρωση οθόνης (); void specialKeys (); // ---------------------------------------------------- ---------- // Παγκόσμιες μεταβλητές // -------------------------------------- ------------------------ διπλό rotate_y = 0; διπλό rotate_x = 0; // ---------------------------------------------------- ---------- // οθόνη () Λειτουργία επανάκλησης // ---------------------------------- --------------------------- void display () // Clear screen and Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ ------------------------------------------------------ -// specialKeys () Λειτουργία επανάκλησης // -------------------------------------------- ------------------ void specialKeys (int key, int x, int y) {// Δεξί βέλος-αυξήστε την περιστροφή κατά 5 μοίρες εάν (key == GLUT_KEY_RIGHT) rotate_y + 5, 5; // Αίτημα ενημέρωσης οθόνης glutPostRedisplay ();} // ---------------------------------------- ---------------------- // συνάρτηση main () // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB