Εισαγωγή στην OpenGL: μέρος 2ο

Σχετικά έγγραφα
OpenGL. Μετασχηματισμοί. Μάθημα: Γραφικά Υπολογιστών και Εικονική Πραγματικότητα. Κατερίνα Παπαδοπούλου /

Εισαγωγή στην OpenGL: μέρος 1ο

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΓΡΑΦΙΚΑ ΥΠΟΛΟΓΙΣΤΩΝ Διδάσκων: Ν. ΝΙΚΟΛΑΙΔΗΣ

Συναφείς µετασχηµατισµοί:

Περιεχόµενα ενότητας

Μετασχηµατισµοί συντεταγµένων

1 ο Εργαστήριο Συντεταγμένες, Χρώματα, Σχήματα

21. ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ 4 - ΔΗΜΙΟΥΡΓΩΝΤΑΣ ΜΕ ΤΟ BYOB BYOB. Αλγόριθμος Διαδικασία Παράμετροι

Οδηγίες σχεδίασης στο περιβάλλον Blender

Προγραμματισμός γραφικών

1. Ανοίξτε το 3D Studio MAX ή επιλέξτε File Reset. ηµιουργήστε µια σφαίρα µε κέντρο την αρχή των αξόνων και ακτίνα 20 µονάδων και χρώµα πράσινο.

Εμφανίζονται 3 επιλογές με 3 εικονίδια, η «ζωγραφική», η «εισαγωγή» και η «κάμερα».

Θεωρία μετασχηματισμών

Λίγα λόγια από το συγγραφέα Κεφάλαιο 1: PowerPoint Κεφάλαιο 2: Εκκίνηση του PowerPoint... 13

Vodafone Business Connect

Συστήματα συντεταγμένων

Σύντομος οδηγός αναφοράς Για Windows Έκδοση 4.0

Γραφικά υπολογιστών Εργαστήριο 10 Εισαγωγή στα Sprites

Γραφιστική Πληροφορίας σε 3D

Κλασσική παρατήρηση & παρατήρηση με υπολογιστή

Δημιουργώντας 3D μοντέλα από ακμές με χρήση λογικών τελεστών

KTurtle. KTurtle του KDE. KTurtle (καμβάς), Επεξεργαστής Κώδικα και Επιθεωρητής (Εικόνα 2.1). Στην Κονσόλα (Εκτελεστής) Επιφάνεια Εργασίας (καμβάς)

1. Ανοίξτε το 3D Studio MAX ή επιλέξτε File Reset. ηµιουργήστε µια σφαίρα µε κέντρο την αρχή των αξόνων και ακτίνα 20 µονάδων.

ΣΗΜΕΙΩΣΕΙΣ. στη γλώσσα προγραμματισμού. Γκέτσιος Βασίλειος

7 ο Εργαστήριο Θόρυβος 2Δ, Μετακίνηση, Περιστροφή

Εισαγωγή στο 3DS Max 2009

Απαραίτητες αφού 3Δ αντικείμενα απεικονίζονται σε 2Δ συσκευές. Θέση παρατηρητή. 3Δ Μετασχ/σμός Παρατήρησης

3 ο εργαστήριο Scratch for NinjaCoders

Δημιουργώντας 3D μοντέλα από ακμές

Δημιουργία και επεξεργασία διανυσματικών επιπέδων στο QGIS

Επεξεργασία Κειμένου Open Office. Κείμενο: Δραστηριότητα Ανοίξτε τον κειμενογράφο OpenOffice.writer ακολουθώντας την διαδρομή:

Λεπτομέριες τοιχοποιίας Σχεδίαση κάτοψης

Τι θα απαντούσατε αλήθεια στην ίδια ερώτηση για την περίπτωση της επόμενης εικόνας;

Δημιουργώντας 3D μοντέλα από εικόνες

3 ο Εργαστήριο Μεταβλητές, Τελεστές

Stellarium Εγχειρίδιο Οδηγιών

Φύλλο 2. Δράσεις με το λογισμικό Cabri-geometry 3D

Αγώνες αυτοκινήτου Παιχνίδι για 2 παίκτες

Μετασχηματισμοί Μοντελοποίησης (modeling transformations)

Προγραμματισμός. Το περιβάλλον του scratch

Οι θέσεις ενός σημείου στο επίπεδο και στο χώρο Φύλλο εργασίας 1

Η εντολή «επανέλαβε Χ»

Γραφικά με υπολογιστές. Διδάσκων: Φοίβος Μυλωνάς. Διαλέξεις #11-#12

ισδιάστατοι μετασχηματισμοί ΚΕΦΑΛΑΙΟ 4: ισδιάστατοι γεωμετρικοί μετασχηματισμοί

Διάλεξη #10. Διδάσκων: Φοίβος Μυλωνάς. Γραφικά με υπολογιστές. Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Χειμερινό εξάμηνο.

Ενδυμασίες. Μετονομάζουμε την νέα ενδυμασία του αντικείμενου μας και έχουμε ολοκληρώσει τη δημιουργία της.

Μαθηματικό υπόβαθρο. Κεφάλαιο 3. Μαθησιακοί στόχοι. 3.1 Εισαγωγή. 3.2 Σημεία και διανύσματα

5.1.1 Περιγραφή των συστατικών τμημάτων ενός γραφήματος

App Inventor 8ο Μάθημα (Ζωγραφική με τα δάχτυλα)

Δώστε χρώμα και σύσταση στις διαφάνειες

Γ ΓΥΜΝΑΣΙΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ ΤΗ ΓΛΩΣΣΑ MicroWorlds Pro

Κεφάλαιο 1: Κίνηση και γεωμετρικά σχήματα

Περιοχή εργασίας. Τμ. Γραφιστικής (Γραφιστική με Η/Υ - In Design) 2

Προγραμματισμός με Logo στο MicroWorlds Pro

Φύλλα εργασίας. MicroWorlds Pro. Πολυμεσικές Εφαρμογές με την χρήση της γλώσσας LOGO Στο Γυμνάσιο. Β. Χ. Χρυσοχοΐδης

Δημιουργώντας γραφικά στο περιβάλλον 3Ds Max χρησιμοποιώντας βασικά εργαλεία

Σχετική κίνηση αντικειμένων

Γραφικά Υπολογιστών: Θέαση στις 3D

Το σκηνικό μας είναι πλέον έτοιμο για εισάγουμε τα υπόλοιπα αντικείμενα του έργου μας.

Εφαρμογή δημιουργίας σεναρίων Sctatch

Σχεδίαση και ανάπτυξη δραστηριοτήτων στο προγραμματιστικό περιβάλλον MicroWorlds Pro

Εισαγωγή στην OpenGL

ΕΡΩΤΗΣΕΙΣ στην επεξεργασία κειμένου (Word)

Τα στοιχεία του παιχνιδιού : Σκηνικό

OpenGL. Εισαγωγή. Εξάμηνο: 2014Β. Διδάσκουσα: Κανελλοπούλου Χριστίνα_ΠΕ19 Πληροφορικής Ηλεκτρονική Τάξη:

ΜΟΝΤΕΛΟΠΟΙΗΣΗ ΕΞΟΧΙΚΗΣ ΚΑΤΟΙΚΙΑΣ ΜΕ ΧΡΗΣΗ OpenGL Περιστερίδου Καλλιόπη

Κεφάλαιο 1 Χρήση προτύπου 2. Κεφάλαιο 2 Τροποποίηση μιας παρουσίασης 9. Κεφάλαιο 4 Προσθήκη αντικειμένων 26. Κεφάλαιο 5 Ειδικά εφέ 35

A7.2 Δημιουργία Απλής Γραφικής Εφαρμογής σε Περιβάλλον Scratch

Ενότητα 5: ΜΕΤΑΒΛΗΤΕΣ

Εργαστήριο Γραφικών. Βοηθητικό Υλικό για την εκπόνηση των εργασιών Αφορά την 1 η Εργαστηριακή Άσκηση

Μορφοποίηση εικόνων. Εισαγωγή. Στόχος κεφαλαίου

Οδηγίες για το CABRI - GEOMETRY II Μωυσιάδης Πολυχρόνης - Δόρτσιος Κώστας

Εντολές της LOGO (MicroWorlds Pro)

ΕΡΓΑΣΤΗΡΙΟ ΠΟΛΥΜΕΣΩΝ ΚΑΙ ΓΡΑΦΙΚΩΝ

Οδηγίες για την Άσκηση 1

Η εργασία που επέλεξες θα σου δώσει τη δυνατότητα να συνεργαστείς με συμμαθητές σου και να σχεδιάσετε μια εικονική εκδρομή με το Google Earth.

Μαθήματα Scratch -Δραστηριότητα 1 Παλέτα Κίνηση

ΟΔΗΓΙΕΣ ΓΙΑ ΕΓΚΑΤΑΣΤΑΣΗ ΚΑΙ ΧΡΗΣΗ ΤΟΥ GOOGLE EARTH [ΠΛΟΗΓΗΣΗ ΚΑΙ ΕΚΤΥΠΩΣΗ ΑΕΡΟΦΩΤΟΓΡΑΦΙΩΝ]

Ζωγραφική έναντι Κατασκευής

Εγχειρίδιο Χρήσης του «Μαθη.Συ.»

( Απάντηση: Ο τόνος βρίσκεται δεξιά από το γράμμα Λ. ) ( Απάντηση: Κρατάμε πατημένο το πλήκτρο Shift και πατάμε το πλήκτρο 8. )

Ενσωμάτωση εικόνας BMP σε σχέδιο

Η διαδικασία Παραγωγής Συνθετικής Εικόνας (Rendering)

Γρήγορη Εκκίνηση. Όταν ξεκινήσετε το GeoGebra, εμφανίζεται το παρακάτω παράθυρο:

Καροτοκυνηγός. Αντικείμενα

Περιεχόμενα ΓΕΩΠΥΛΗ ΟΔΗΓΙΕΣ ΧΡΗΣΗΣ ΚΕΝΤΡΙΚΟ SITE. ΧΑΡΤΗΣ... 2 Είσοδος στην εφαρμογή «Χάρτης»... 2 Λειτουργίες εφαρμογής «Χάρτης»...

ΣΧΗΜΑΤΑ-ΕΙΚΟΝΕΣ-ΕΞΙΣΩΣΕΙΣ

Άσκηση 1η Λειτουργία του προγράμματος NEC4WIN95VM

Παιχνιδάκια με τη LOGO

Stroke.

Άσκηση 13 η Ειδικά Εφέ. Στόχος της άσκησης

ΑΝΤΙΓΡΑΦΗ ΑΡΧΕΙΟΥ ΣΕ ΔΙΣΚΕΤΑ ΑΝΤΙΓΡΑΦΗ ΑΡΧΕΙΟΥ ΑΠΟ ΔΙΣΚΕΤΑ. Από τον κατάλογο που εμφανίζεται επιλέγω: Αποστολή προς Δισκέτα (3,5)

Δημιουργία ανάγλυφου στο QGIS

Περιεχόμενα. Λίγα λόγια από το συγγραφέα Windows Vista Επιφάνεια εργασίας Γραμμή εργασιών... 31

Εργαστήριο 4. Εαρινό Εξάμηνο ΠΡΟΣΟΧΗ: Αρχίστε νωρίς το Εργαστήριο 4. Οι ασκήσεις είναι πιο απαιτητικές από τα προηγούμενα εργαστήρια.

Τροποποίηση συνδυασμών κίνησης

Παλέτα Κίνηση. Καλό είναι πριν ξεκινήσετε το παρακάτω φυλλάδιο να έχετε παρακολουθήσει τα παρακάτω δύο videos: a) Εισαγωγή στο περιβάλλον του Scratch

ΜΑΘΗΜΑ 7: ΠΕΡΙΣΤΡΟΦΗ (συνέχεια)

Προγραμματιστικό Περιβάλλον

Movie Maker (Δημιουργία βίντεο)

Transcript:

Εισαγωγή στην OpenGL: μέρος 2ο Μετασχηματισμοί στην OpenGL Η OpenGL υποστηρίζει μια σειρά μετασχηματισμών τους οποίους μπορούμε να χρησιμοποιήσουμε για να τοποθετήσουμε τα αντικείμενα μας στην οθόνη, να τα περιστρέψουμε, να τα μεγεθύνουμε ή να τα μικρύνουμε. Αναφέραμε στο προηγούμενο εργαστήριο ότι η OpenGL χρησιμοποιεί ένα δεξιόστροφο σύστημα συντεταγμένων κάμερας (view space ή camera space) : Αυτό σημαίνει ότι αν φανταστούμε την οθόνη του υπολογιστή, ο θετικός άξονας Υ δείχνει προς τα πάνω, ο θετικός άξονας Χ προς τα δεξιά και ο αρνητικός άξονας Ζ προς τα μέσα της οθόνης. Ο μετασχηματισμός που τοποθετεί την κάμερα στην κατάλληλη θέση ώστε να «φωτογραφήσουμε» την σκηνή λέγεται μετασχηματισμός κάμερας (viewing transformation). Οι μετασχηματισμοί που τοποθετούν τα αντικείμενα της σκηνής στην επιθυμητή τους θέση, τα μεγεθύνουνε/σμικρύνουνε και τα περιστρέφουνε ονομάζονται μετασχηματισμοί μοντέλου (modeling transformations). Στην ορολογία της OpenGL, ο μετασχηματισμός μοντέλου είναι ο μετασχηματισμός που τοποθετεί ένα αντικείμενο στο σύστημα συντεταγμένων της σκηνής (κόσμου). Στην γενική ορολογία γραφικών αυτό το μετασχηματισμό το ονομάζουμε μετασχηματισμό κόσμου. Ο μετασχηματισμός που καθορίζει τι είναι ορατό στο σύστημα συντεταγμένων κάμερας (view space) και τι είδους προβολή επιθυμούμε (με προοπτική ή όχι) ονομάζεται μετασχηματισμός προβολής (projection transformation) Η OpenGL συνδυάζει του πίνακες μετασχηματισμού μοντέλου και μετασχηματισμού κάμερας σε έναν μόνο πίνακα, τον μετασχηματισμό Μοντέλου-Κάμερας (ModelView matrix). Με αυτό το μετασχηματισμό μπορούμε να τοποθετήσουμε ένα αντικείμενο κατευθείαν στο χώρο της κάμερας (χωρίς να περάσουμε από το σύστημα συντεταγμένων κόσμου).

Μπορούμε να κατασκευάσουμε τον μετασχηματισμό Μοντέλου-Κάμερας με τέτοιο τρόπο ώστε να περιέχει κάθε περιστροφή, μετακίνηση και κλίμακα του αντικειμένου. Μετακίνηση Η μετακίνηση (translation) ενός αντικειμένου γίνεται με την εντολή gltranslatef(glfloat X, GLfloat Y, GLfloat Z); H εντολή αυτή παίρνει ως παραμέτρους την μετακίνηση που επιθυμούμε κατά άξονα, κατασκευάζει ένα μετασχηματισμό μετακίνησης Τ (όπως είδαμε στην θεωρία) και τον εφαρμόζει (πολ/ζει) με τον μετασχηματισμό Μοντέλου-Κάμερας. Περιστροφή Η περιστροφή (rotation) ενός αντικειμένου γίνεται με την εντολή glrotatef(glfloat angle, GLfloat x, GLfloat y, GLfloat z); Η εντολή αυτή κατασκευάζει ένα μετασχηματισμό περιστροφής γύρω από το διάνυσμα που ορίζεται από την τριάδα [ x, y, z ], κατά γωνία angle (μετριέται σε μοίρες 0-360) με φορά αντίθετη των δεικτών του ρολογιού. Αν μας ενδιαφέρει απλά να περιστρέψουμε το αντικείμενο γύρω από ένα άξονα (Χ, Υ ή Z) μπορούμε να ορίσουμε το διάνυσμα ως [ 1, 0, 0] για το περιστροφή γύρω από τον Χ, ως [ 0, 1, 0] για το περιστροφή γύρω από τον Υ και ως [ 0, 0, 1] για το περιστροφή γύρω από τον Ζ. Κλίμακα Η μεγέθυνση/σμίκρυνση (scaling) ενός αντικειμένου γίνεται με την εντολή glscalef(glfloat x, GLfloat y, GLfloat z); όπου x, y, z η κλίμακα του αντικειμένου ανά άξονα. Τοποθέτηση κάμερας Η OpenGL μας δίνει την δυνατότητα να τοποθετήσουμε την κάμερα στην σκηνή και να θέσουμε κατεύθυνση της με την χρήση μόνο μιας εντολής: glulookat(gldouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz); Η εντολή αυτή παίρνει ως παραμέτρους 3 διανύσματα το [eyex, eyey, eyez] που ορίζει την θέση της κάμερας στην σκηνή, το [centerx, centery, centery] το οποίο καθορίζει την κατεύθυνση της κάμερας (το σημείο στο οποίο δείχνει δηλαδή) και το

διάνυσμα [upx, upy, upz] που καθορίζει ποια είναι η «πάνω» κατεύθυνση της κάμερας. Για παράδειγμα αν θέλω να ορίσω μια κάμερα που βρίσκεται στο σημείο [10,10,10], «δείχνει/βλέπει» στην αρχή των αξόνων [0,0,0] και η πάνω κατεύθυνση της είναι ο Y άξονας [0 1 0] θα καλέσω την εντολή ως glulookat(10,10,10, 0,1,0); 0,0,0 Εφαρμογή των μετασχηματισμών στην OpenGL Αναφέραμε ότι η OpenGL χρησιμοποιεί μόνο ένα πίνακα, τον ModelView, για να εφαρμόσει όλους τους μετασχηματισμούς μετακίνησης, περιστροφής και κλίμακας που είδαμε. Ο πίνακας αυτός αποθηκεύεται στην μνήμη της OpenGL και παραμένει ο ίδιος μέχρι να τον αλλάξουμε με μια άλλη εντολή. Το σύνολο όλων των μεταβλητών/παραμέτρων που διατηρεί η OpenGL για την λειτουργία της ονομάζεται μηχανή καταστάσεων (state machine). Με αυτό τον τρόπο λειτουργίας μια τιμή που θέτουμε σε μια μεταβλητή παραμένει σε ισχύ μέχρι να την αλλάξουμε ξανά. Επειδή η OpenGL χρησιμοποιεί πάνω από ένα πίνακες για να ορίσει μετασχηματισμούς πριν αρχίσουμε να κατασκευάσουμε το ModelView μετασχηματισμό πρέπει να τον ενεργοποιήσουμε. Αυτό γίνεται με την εντολή glmatrixmode(gl_modelview); H παράμετρος GL_MODELVIEW ορίζει ότι θέλουμε να ενεργοποιήσουμε τον πίνακα ModelView (μια άλλη παράμετρος που θα χρησιμοποιήσουμε είναι η GL_PROJECTION που ορίζει ως ενεργό τον πίνακα προβολής) Από την στιγμή που ενεργοποιήσουμε τον ModelView πίνακα, κάθε μετασχηματισμός που κατασκευάζουμε με τις εντολές gltranslation, glrotation και glscale εφαρμόζονται, με πολλαπλασιασμό, με τον πίνακα που έχει κάθε στιγμή ο ModelView. Για να αρχικοποιήσουμε τον ModelView πίνακα χρησιμοποιούμε την εντολή glloadidentity(); η οποία του φορτώνει τον μοναδιαίο πίνακα.

Εξορισμού (αν δεν έχουμε εφαρμόσει κάποιο άλλο μετασχηματισμό) η κάμερα είναι τοποθετημένη στην αρχή των αξόνων και βλέπει προς τον άξονα -Z Παράδειγμα: glmatrixmode(gl_modelview); glloadidentity(); glulookat(10,10,10, 0,0,0, 0,1,0); gltranslate(0, 0, -6); glrotatef(45, 0, 1, 0); DrawOurModel(); Αρχικά ενεργοποιούμε τον πίνακα ModelView, τον αρχικοποιούμε με τον μοναδιαίο πίνακα Ι, κατασκευάζουμε και εφαρμόζουμε τον μετασχηματισμό κάμερας View (glulookat), κατασκευάζουμε και εφαρμόζουμε μια μετακίνηση T κατά -6 κατά μήκος του άξονα Ζ και μια περιστροφή R, 45 μοίρες γύρω από τον άξονα Y. O τελικός μετασχηματισμός ModelView θα είναι : ModelView = R * T * View Σημαντική παρατήρηση : Η OpenGL εφαρμόζει τους μετασχηματισμούς στο αντικείμενο με αντίστροφη σειρά από ότι τους δηλώνουμε στο πρόγραμμα. Στο παραπάνω παράδειγμα το αντικείμενο πρώτα θα περιστραφεί, μετά θα μετακινηθεί και μετά θα μεταφερθεί στο χώρο της κάμερας. Αν θεωρήσουμε ένα σημείο P του αντικειμένου, τότε ο μετασχηματισμός αυτός θα εφαρμοστεί ως Στοίβα πινάκων P = P * ModelView = P * R * T * View Είπαμε ότι ό,τι μετασχηματισμό κατασκευάζουμε με τις εντολές gltranslation, glrotation και glscale συσσωρεύεται (με πολλ/μό) στο πίνακα ModelView, o οποίος με την σειρά του μετασχηματίζει όλα τα αντικείμενα της σκηνής. Υπάρχουν περιπτώσεις που πριν «προσθέσουμε» ένα νέο μετασχηματισμό στο ModelView (μια περιστροφή που ίσως αφορά ένα μόνο αντικείμενο και όχι όλη τη σκηνή) θέλουμε να τον αποθηκεύσουμε κάπου προσωρινά ώστε μετά να τον ανακτήσουμε αναλλοίωτο από τον νέο μετασχηματισμό. Η OpenGL προσφέρει ένα τέτοιο μηχανισμό και ονομάζεται στοίβα πινάκων (matrix stack). Η στοίβα είναι μια δομή δεδομένων που μας επιτρέπει μέσω εντολών

Push και Pop να προσθέσουμε και να αφαιρέσουμε ένα στοιχείο από την κορυφή της στοίβας (και μόνο). Στην OpenGL οι εντολές που αποθηκεύουν και ανακτούν τον ModelView στην κορυφή της στοίβας είναι οι Σχηματικά αυτό φαίνεται ως εξής: glpushmatrix(); glpopmatrix(); Παράδειγμα, αν θέλουμε να ζωγραφίσουμε 2 αντικείμενα αφού πρώτα τα μετακινήσουμε το πρώτο κατά -6 κατά μήκος του άξονα Ζ και το δεύτερο κατά 10 κατά τον άξονα Υ τότε glmatrixmode(gl_modelview); glloadidentity(); glulookat(10,10,10, 0,0,0, 0,1,0); glpushmatrix(); gltranslate(0, 0, -6); DrawModel_1(); glpopmatrix(); gltranslate(0, 10, 0); DrawModel_2();

Στο παράδειγμα αφού ορίσουμε τον μετασχηματισμό κάμερας με την εντολή glulookat() αποθηκεύουμε τον ModelView στην στοίβα με την εντολή glpushmatrix(). Έπειτα μετακινούμε το πρώτο αντικείμενο κατά -6 κατά μήκος του άξονα Ζ και το ζωγραφίζουμε. Στην συνέχεια ανακτούμε από την στοίβα τον ModelView (που δεν περιέχει την μετακίνηση κατά -6) με την εντολή glpopmatrix(). Τέλος μετακινούμε το δεύτερο αντικείμενο κατά 10 κατά τον άξονα Υ και το ζωγραφίζουμε. Αν υποθέσουμε ότι δεν χρησιμοποιούμε την στοίβα για να αποθηκεύσουμε τον ModelView: glmatrixmode(gl_modelview); glloadidentity(); glulookat(10,10,10, 0,0,0, 0,1,0); gltranslate(0, 0, -6); DrawModel_1(); gltranslate(0, 10, 0); DrawModel_2(); τότε το πρώτο αντικείμενο θα μετακινούνταν σωστά κατά -6 κατά μήκος του άξονα Ζ όμως το δεύτερο αντικείμενο θα μετακινούταν πρώτα κατά -6 κατά μήκος του άξονα Ζ και έπειτα κατά 10 κατά τον άξονα Υ. Θα εφαρμόζαμε δηλαδή και τις 2 μετακινήσεις στο δεύτερο αντικείμενο αφού όπως είπαμε όλοι οι μετασχηματισμοί που κατασκευάζουμε συσσωρεύονται στο πίνακα ModelView. H χρήση της στοίβας είναι βασική λοιπόν για την σωστή τοποθέτηση των αντικειμένων στην σκηνή. Μετασχηματισμός προβολής Με τον μετασχηματισμό προβολής (projection transform) η OpenGL προβάλλει τα 3διάστατα αντικείμενα στις 2 διαστάσεις ώστε να δημιουργήσει την τελική διδιάστατη εικόνα. Η OpenGL υποστηρίζει 2 ειδών μετασχηματισμούς προβολών την ορθογραφική προβολή (orthographic projection) και την προβολή με προοπτική (perspective projection). Μια ορθογραφική προβολή δημιουργείται με την χρήση της εντολής glortho(gldouble left, GLdouble right, GLdouble bottom,

GLdouble top, GLdouble near, GLdouble far ); Η εντολή αυτή ορίζει ένα κύβο αποκοπής παρέχοντας τις συντεταγμένες 2 διαγώνιων κορυφών. Μια προβολή με προοπτική δημιουργείται με την χρήση της εντολής gluperspective(gldouble fovy, GLdouble aspect, GLdouble znear, GLdouble zfar); Η παράμετρος fovy ορίζει την γωνία οπτικού πεδίου στην κάθετη κατεύθυνση, η aspect καθορίζει τον αναλογία μήκους/πλάτους του κοντινού πεδίου αποκοπής και οι znear και zfar την απόσταση του κοντινού (near) και μακρινού (far) πεδίου αποκοπής κατά τον άξονα Ζ. Σχηματικά η προβολή με προοπτική ορίζεται ως Η OpenGL αποθηκεύει τον πίνακα προβολής στον πίνακα GL_PROJECTION. Για να τον ενεργοποιήσουμε χρησιμοποιούμε και πάλι την εντολή glmatrixmode() Παράδειγμα: glmatrixmode(gl_projection); glloadidentity(); gluperspective(45, 4/3, 1, 400); Εφαρμογή μετασχηματισμών στην OpenGL: Ένα Ηλιακό Σύστημα Στην σημερινή εργαστηριακή άσκηση θα εφαρμόσουμε τους μετασχηματισμούς της OpenGL για να κατασκευάσουμε ένα (μίνι) ηλιακό σύστημα. Φορτώστε το project lab2.dev στο περιβάλλον ανάπτυξης εφαρμογών DevC++.

Ο κώδικας της εφαρμογής βρίσκεται στο αρχείο main.cpp. Ο κώδικας περιέχει σχόλια για όλα τα σημεία του προγράμματος που μας ενδιαφέρουν. Κομμάτια του κώδικα που έχουν να κάνουν με φωτισμό σκηνής και άλλες παραμετροποιήσεις δεν μας αφορούν σε αυτή την άσκηση και μένουν ασχολίαστα. Η εφαρμογή ακολουθεί το format της πρώτης εργαστηριακής άσκησης το οποίο είναι εν συντομία: main() Η «συνάρτηση-εισόδου» στο πρόγραμμα είναι η main(). Εκεί αρχικοποιούμε το GLUT, δημιουργούμε το παράθυρο στο οποίο θα δείξουμε την τελική εικόνα, ορίζουμε τις συναρτήσεις που θα χρησιμοποιεί το GLUT για να ζωγραφίζει την σκηνή (renderscene) και θα εξυπηρετεί είσοδο από το πληκτρολόγιο (keypress), αρχικοποιούμε την εφαρμογή (init) και μπαίνουμε στο κυρίως loop του GLUT (glutmainloop). keypress() H συνάρτηση keypress καλείται όταν πατηθεί κάποιο πλήκτρο. Ελέγχει αν αυτό είναι q ή ESC και αν ναι, τερματίζει η εφαρμογή. init() Στην init() καλούμε συναρτήσεις και κάνουμε αρχικοποιήσεις που πρέπει να γίνουν μόνο μια φορά. Στην συγκεκριμένη εφαρμογή την χρησιμοποιούμε για να ορίσουμε τον μετασχηματισμό προβολής GL_PROJECTION και να δημιουργήσουμε τα αστέρια του φόντου. Οι θέσεις των αστεριών είναι τυχαίες, όπως και το μέγεθος τους. renderscene() Αυτή είναι η συνάρτηση που ζωγραφίζει όλα τα αντικείμενα της σκηνής μας. Καλώντας την συνάρτηση glutget(glut_elapsed_time); παίρνουμε το χρόνο που έχει περάσει από την αρχή εκτέλεσης του προγράμματος. Έτσι μπορούμε να υπολογίσουμε την γωνία περιστροφής των πλανητών a η οποία θα μεταβάλλεται με τον χρόνο. Η συνάρτηση renderscene() ενεργοποιεί τον ModelView πίνακα, τον αρχικοποιεί, και καθορίζει την θέση και φορά της κάμερας: glmatrixmode(gl_modelview); glloadidentity(); glulookat(0,6,13, 0,0,0, 0,1,0);

Στην συνέχεια ζωγραφίζει τα αστέρια του φόντου ως σημεία στο χώρο διαβάζοντας τις θέσεις και τα μεγέθη τους από τον πίνακα Stars. Σ αυτό το σημείο βλέπουμε πως μπορούμε να σχεδιάσουμε στην OpenGL χωρίς να χρησιμοποιήσουμε τις έτοιμες συναρτήσεις του GLUT όπως glutsolidsphere(), glutsolidcube(); Ο τρόπος που γίνεται αυτό είναι στέλνοντας στην OpenGL τα σημεία της γεωμετρίας μας με την εντολή glvertex3f(glfloat x, GLfloat y, GLfloat z); Για να ζωγραφίσει τα σημεία αυτά η OpenGL χρειάζεται ακόμα μια πληροφορία: πως θα τα ενώσει μεταξύ τους ώστε να σχηματιστεί το αντικείμενο. Υπάρχουν πολλές επιλογές: GL_POINTS για σημεία, GL_LINES για ευθύγραμμα τμήματα, GL_TRIANGLES για τρίγωνα και άλλες. Την παράμετρο αυτή την περνάμε στο ζεύγος glbegin()/glend() που οριοθετεί την περιοχή που προσδιορίζουμε τα σημεία της γεωμετρίας. glbegin(gl_points); glvertex3f(stars[i].x,stars[i].y, -20.0f); glend(); Στην συνέχεια ζωγραφίζουμε τους πλανήτες ξεκινώντας με τον ήλιο που βρίσκεται στο κέντρο του συστήματος //σώσε τον πίνακα ModelView στην στοίβα glpushmatrix(); //κλιμάκωσε τον ModelView (άλλαξε μέγεθος του ήλιου) glscalef(1,1,1); //ζωγράφισε μια σφαίρα (ήλιος) glutsolidsphere(1,64,64); //φόρτωσε τον πίνακα ModelView από την στοίβα glpopmatrix(); Ο λόγος που αποθηκεύουμε τον ModelView στην στοίβα είναι γιατί θέλουμε να εφαρμόσουμε ένα μετασχηματισμό κλίμακας στον ήλιο. Αν δεν αποθηκεύαμε τον πίνακα η κλίμακα θα επιδρούσε σε όλα τα αντικείμενα που θα σχεδιάζαμε μετέπειτα. Αφού ζωγραφίσουμε τον ήλιο με την glutsolidsphere επαναφέρουμε τον ModelView από την στοίβα για να αναιρέσουμε την κλίμακα.

Με παρόμοιο τρόπο ζωγραφίζουμε την γη αφού την μετακινήσουμε σε σχέση με τον ήλιο κατά -6 και την περιστρέψουμε γύρω από αυτόν κατά γωνία a. glrotatef(a,0,1,0); //μετακίνησε την γη κατά -6 κατά μήκος του άξονα Ζ gltranslatef(0,0,-6); //σώσε τον πίνακα ModelView στην στοίβα glpushmatrix(); //κλιμάκωσε την γη glscalef(0.5,0.5,0.5); //ζωγράφισε την γη σαν σφαίρα glutsolidsphere(1, 16, 16); //φόρτωσε τον πίνακα ModelView από την στοίβα glpopmatrix(); Ξανά, πριν εφαρμόσουμε τον μετασχηματισμό κλίμακας με την glscale() σώνουμε τον πίνακα ModelView στην στοίβα και αφού ζωγραφίσουμε την γη τον ανακτούμε από αυτήν. Mε ακριβώς όμοιο τρόπο ζωγραφίζουμε και την σελήνη να περιστρέφεται γύρω από την γη. Πράγματα να δοκιμάσετε Α) Αλλάξτε το χρώμα των ουράνιων αντικειμένων αλλάζοντας τις παραμέτρους της εντολής glcolor3f( GLfloat red, GLfloat green, GLfloat blue) Θυμίζουμε ότι οι παράμετροι red, green, blue παίρνουν τιμές από 0 μέχρι 1 και ορίζουν το ποσοστό του κάθε χρώματος στο τελικό χρώμα (δηλαδή πόσο κόκκινο, πράσινο και μπλε θα περιέχει το χρώμα); Πχ η εντολή glcolor3f(1,1,0) θα θέσει το χρώμα σε κίτρινο, ενώ η εντολή glcolor3f(0.5,0.5,0.5) σε γκρι. Β) Μεγαλώστε τον ήλιο σε μέγεθος κλιμακώνοντας τον κατά 2 σε κάθε διάσταση Γ) Μετακινήστε το φεγγάρι σε διπλάσια απόσταση από τη γη από ότι είναι τώρα

Δ) Κάντε την γη να γυρίζει 2 φορές πιο γρήγορα γύρω από τον ήλιο Ε) Δοκιμάστε να μετακινήσετε την κάμερα, αλλάζοντας τις παραμέτρους της εντολής glulookat(gldouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz); Υπενθυμίζουμε ότι η τριάδα [eyex, eyey, eyez] ορίζει την θέση της κάμερας στην σκηνή, το [centerx, centery, centery] καθορίζει την κατεύθυνση της κάμερας (το σημείο στο οποίο δείχνει δηλαδή) και το διάνυσμα [upx, upy, upz] καθορίζει ποια είναι η «πάνω» κατεύθυνση της κάμερας. Ζ) Προσθέστε ακόμα ένα πλανήτη στο ηλιακό μας σύστημα. Αυτό γίνεται ακριβώς όπως προσθέσαμε την γη με μια διαφορά: πριν από το τμήμα που προσθέτει την γη στη σκηνή πρέπει να αποθηκεύσουμε τον ModelView στην στοίβα και να τον ανακτήσουμε αμέσως μόλις ζωγραφίσουμε και το φεγγάρι. Ο λόγος που πρέπει να γίνει αυτό είναι γιατί όταν έρθει η ώρα να προσθέσουμε τον νέο πλανήτη δεν θέλουμε o ModelView να περιέχει τους μετασχηματισμούς (μετακινήσεις, περιστροφές και κλίμακες) που προσθέσαμε για τη γη και το φεγγάρι. 1. Τραβήξτε την κάμερα πιο πίσω ώστε να έχετε μεγαλύτερο οπτικό πεδίο πχ glulookat(5,8,20, 0,0,0, 0,1,0); 1. βάψτε τον πλανήτη ότι χρώμα θέλετε, 1. μετακινήστε το νέο πλανήτη κατά -9 στον άξονα Ζ, 1. κλιμακώστε τον κατά 0.8, 2. κάντε τον να περιστρέφετε γύρω από τον άξονα Υ κατά αντίθετη φορά από ότι η Γη. Κώδικας παραδείγματος Για να τρέξετε το κώδικα του παραδείγματος πρέπει να εγκαταστήσετε το περιβάλλον ανάπτυξης Dev-C++ 5.0 beta 9.2 (4.9.9.2) (9.0 MB) with Mingw/GCC 3.4.2 και στην συνέχεια να το παραμετροποίησετε ώς εξής: 1. Τρέξτε το Dev-Cpp που μόλις εγκαταστήσατε και μόλις ξεκινήσει, από το μενού Tools, επιλέξτε Check for Updates/Packages. 2. Στο Select devpack server επιλέξτε devpack.org και πατήστε το Check for Updates κάτω αριστερά 3. Σαν Group επιλέξτε OpenGL 4. Από την λίστα που θα εμφανιστεί επιλέξτε να εγκαταστήσετε το πακέτο freeglut Στην συνέχεια αποσυμπιέστε να αρχεία lab2.zip και shared.zip σε αντίστοιχα folder (με ονόματα dev-cpp/lab2 και dev-cpp/shared δηλαδή), και ανοίξτε το αρχείο

lab1.dev του καταλόγου lab1. Αν όλα πήγαν καλά, με F9 ο κώδικας πρέπει να εκτελεστεί και να δείτε το παράθυρο της εφαρμογής. Με μικρές αλλαγές ο κώδικας μπορεί να τρέξει σε οποιοδήποτε περιβάλλον προγραμματισμού C/C++ διαθετετε. Πηγή Εισαγωγή στην OpenGL: μέρος 2ο