OpenGL Μετασχηματισμοί Κατερίνα Παπαδοπούλου / pakate@unipi.gr Μάθημα: Γραφικά Υπολογιστών και Εικονική Πραγματικότητα
Τύποι μετασχηματισμών Μετασχηματισμοί μοντέλου (modeling transformations) με glmatrixmode (GL_MODELVIEW); Μετασχηματισμοί θέασης (viewing transformations) με glmatrixmode (GL_MODELVIEW); Μετασχηματισμοί προβολής (projection transformations) με glmatrixmode (GL_PROJECTION);
Αναλογία με κάμερα (opengl Programming Guide, σελ.127)
Σειρά εκτέλεσης μετασχηματισμών Στάδια μετασχηματισμών vertex (opengl Programming Guide, σελ.128)
Σύστημα συντεταγμένων Το σύστημα συντεταγμένων στην OpenGL είναι δεξιόστροφο positive x rotation positive y rotation positive z rotation
Βασικοί Γεωμετρικοί Μετασχηματισμοί της OpenGL gltranslate*(tx,ty,tz); - μετασχηματισμός μετατόπισης όπου * : f ή d μπορεί να πάρει οποιεσδήποτε πραγματικές τιμές
Βασικοί Γεωμετρικοί Μετασχηματισμοί της OpenGL glrotate* (angle, vx,vy,vz); - μετασχηματισμός περιστροφής γύρω από άξονα v={vx,vy,vz} μοναδιαίο διάνυσμα που ορίζει τον προσανατολισμό του άξονα περιστροφής Αν δεν είναι μοναδιαίο κανονικοποιείται Αν θέλουμε περιστροφή 45 γύρω από τον άξονα x: glrotatef (45.0, 1.0,0.0,0.0);
Βασικοί Γεωμετρικοί Μετασχηματισμοί της OpenGL glscale* (sx,sy,sz); - μετασχηματισμός κλιμάκωσης - μπορεί να πάρει οποιεσδήποτε πραγματικές τιμές - αν δοθούν αρνητικές τιμές παράγει αντανακλάσεις
Σειρά εκτέλεσης μετασχηματισμών Διαδοχικοί μετασχηματισμοί-> πολλαπλασιασμός πινάκων μετασχηματισμού Στον πολλαπλασιασμό πινάκων δεν ισχύει η αντιμεταθετική ιδιότητα -> Η σειρά με την οποία εκτελούνται οι μετασχηματισμοί έχει σημασία. Οι ίδιοι μετασχηματισμοί αν εφαρμοστούν με διαφορετική σειρά θα παράγουν διαφορετικό αποτέλεσμα!!! 1. Πρώτα περιστροφή μετά μετατόπιση 2. Πρώτα μετατόπιση μετά περιστροφή
Αποτέλεσμα μετασχηματισμών Για να υπολογίσουμε τι μετασχηματισμούς πρέπει να κάνουμε ανάλογα με το αποτέλεσμα που θέλουμε, μπορούμε να σκεφτούμε με 2 τρόπους: Αν θεωρήσουμε ότι οι μετασχηματισμοί του αντικειμένου γίνονται με σημείο αναφοράς το παγκόσμιο σύστημα συντεταγμένων: Σκεφτόμαστε τους μετασχηματισμούς με σειρά αντίθετη από αυτήν που γράφονται στον κώδικα Αν θεωρήσουμε ότι οι μετασχηματισμοί του αντικειμένου γίνονται με σημείο αναφοράς το τοπικό σύστημα συντεταγμένων του αντικειμένου: Σκεφτόμαστε τους μετασχηματισμούς με σειρά ίδια με αυτήν που γράφονται στον κώδικα
Αποτέλεσμα μετασχηματισμών Οι μετασχηματισμοί γίνονται λαμβάνοντας υπόψη το τοπικό σύστημα συντεταγμένων 3. Μετακίνηση ως προς άξονα x κατά 100.0 μονάδες 1. Αρχική θέση (0,0,0) Κώδικας: glrotate*(); gltranslate*(); 2. Περιστροφή ως προς άξονα z κατά 30 Ο
Αποτέλεσμα μετασχηματισμών Οι μετασχηματισμοί γίνονται λαμβάνοντας υπόψη το παγκόσμιο σύστημα συντεταγμένων 3. Περιστροφή ως προς άξονα z κατά 30 Ο 1. Αρχική θέση (0,0,0) Κώδικας: glrotate*(); gltranslate*(); 2. Μετακίνηση ως προς άξονα x κατά 100.0 μονάδες
Κατάσταση MODELVIEW Για να εφαρμόσουμε μετασχηματισμούς μοντέλου και θέασης, πρέπει να ορίσουμε ως τρέχουσα κατάσταση την GL_MODELVIEW glmatrixmode(gl_modelview); Οι υπόλοιπες πιθανές καταστάσεις είναι GL_PROJECTION,GL_TEXTURE
Μοναδιαίος Πίνακας (identity matrix) void glloadidentity(void); Θέτει ως τρέχοντα πίνακα τον 4 4 μοναδιαίο πίνακα (identity matrix) Είναι σύνηθες να καλείται πριν από τους μετασχηματισμούς προβολής και θέασης. Φυσικά μπορεί να κληθεί και πριν από μετασχηματισμούς μοντέλου
Στοίβες πινάκων Κάθε κατάσταση διατηρεί μια στοίβα πινάκων glpushmatrix(); Αντιγράφει τον τρέχοντα πίνακα στην κορυφή της ενεργής στοίβας και αποθηκεύει το αντίγραφο στη 2 η θέση της στοίβας. Άρα έχουμε 2 ίδιους πίνακες στις 2 πρώτες θέσεις της στοίβας glpopmatrix(); Διαγράφει τον πίνακα της κορυφής της στοίβας και ο προηγουμένως 2 ος πίνακας γίνεται ο τρέχον πίνακας, όντας πια στην κορυφή της στοίβας
Viewing Transformation - glulookat void glulookat (GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz); Δημιουργεί έναν πίνακα θέασης για την προοπτική προβολή και τον πολλαπλασιάζει με τον τρέχοντα (συνήθως τον identity matrix) eyex, eyey, eyez: συντεταγμένες σημείου θέασης (ματιού) centerx, centery, centerz: οποιοδήποτε σημείο πάνω στη γραμμή θέασης upx, upy, upz: μοναδιαίο διάνυσμα που δείχνει την κατεύθυνση προς τα πάνω του άξονα y http://andrewharvey4.wordpress.com/2009/12/02/computer-graphics-notes/
Projection Transformation - glortho Καθορίζει τον μετασχηματισμό προβολής που θα χρησιμοποιηθεί - πολλαπλασιασμός του τρέχοντος πίνακα με τον ορθογραφικό πίνακα Η θέση και ο προσανατολισμός του σημείου θέασης (view point) ορίζονται είτε με την glulookat( ) είτε με άλλους μετασχηματισμούς μοντέλου-θέασης (modelview transfomations) void glortho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval); left, right: Συντεταγμένες για το δεξί και το αριστερό κάθετο clipping plane bottom, top: Συντεταγμένες για το κάτω και το άνω οριζόντιο clipping plane nearval, farval: η απόσταση του κοντινού και μακρινού επιπέδου αποκοπής από το σημείο θέασης. Αν το επίπεδο είναι πίσω από τον θεατή, οι τιμές είναι αρνητικές http://andrewharvey4.wordpress.com/2009/12/02/computer-graphics-notes/
Projection Transformation - gluperspective Δημιουργεί έναν συμμετρικό όγκο θέασης(κόλουρος κώνος) με σημείο αναφοράς προβολής την αρχή των συντεταγμένων θέασης. Δημιουργεί έναν πίνακα για την προοπτική προβολή και τον πολλαπλασιάζει με τον τρέχοντα (συνήθως Identity matrix) void gluperspective (GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far); fovy: field of view- γωνία οπτικού επιπέδου (0 ο -180 ο μοίρες) aspect: λόγος πλάτος/ύψος παρ. αποκοπής near: απόσταση του κοντινού επιπέδου αποκοπής από το σημείο θέασης (πάντα >0.0) far: απόσταση του μακρινού επιπέδου αποκοπής από το σημείο θέασης (πάντα >0.0) http://andrewharvey4.wordpress.com/2009/12/02/computer-graphics-notes/
Projection Transformation - glfrustum Δημιουργεί έναν πίνακα για την προοπτική προβολή (είτε συμμετρική είτε πλάγια) σημείο αναφοράς προβολής την αρχή των συντεταγμένων θέασης και τον πολλαπλασιάζει με τον τρέχοντα (συνήθως Identity matrix) void glfrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, Gldouble near, GLdouble far); left, bottom: Κάτω αριστερή γωνία κοντινού clipping plane right, top: άνω δεξιά γωνία κοντινού clipping plane near: απόσταση του κοντινού clipping plane από το σημείο θέασης (πάντα >0.0) far: απόσταση του μακρινού clipping plane από το σημείο θέασης (πάντα >0.0) http://andrewharvey4.wordpress.com/2009/12/02/computer-graphics-notes/
Βιβλιογραφία Γραφικά Υπολογιστών με OpenGL, Hearn Baker, Εκδόσεις Τζιόλα, 3 η έκδοση, Αθήνα, 2004 OpenGL RedBook OpenGL SuperBible