Μετασχηµατισµοί συντεταγµένων Περιεχόµενα ενότητας: Έννοια και χρησιµότητα του µετασχηµατισµού συντεταγµένων Μητρώα µετασχηµατισµού Συντεταγµένες µοντέλου Μετασχηµατισµός µοντέλου Στοιχειώδεις µετασχηµατισµοί συντεταγµένων (µετατόπιση περιστροή κλπ) Σύνθετοι µετασχηµατισµοί Αλλαγή συστήµατος συντεταγµένων
Ηέννοιατουµετασχηµατισµού συντεταγµένων Μετασχηµατισµός συντεταγµένων Κανόνας αντιστοίχισης (,,) (,, ) ηλώνοντας ένα σηµείο µε συντεταγµένες (,, ) ορίζουµε στη σκηνή ένα σηµείο µε συντεταγµένες (,, ). Σε µορή µητρώων: M: µητρώο µετασχηµατισµού M
Ποια η χρησιµότητα των µετασχηµατισµών συντεταγµένων; Υπάρχουν περιπτώσεις στις οποίες ένας µετασχηµατισµός συντεταγµένων αποδεικνύεται αναγκαίος. Παράδειγµα: Πολλαπλές κλήσεις µιας displa list γιατησχεδίασηπολλαπλών σχηµάτων. Το εύρος των συντεταγµένων στο οποίο εκτείνεται το σχήµα µιας displa list είναι προκαθορισµένο, επιλέγεται αυθαίρετα και µπορεί να διαέρει από τις επιθυµητές διαστάσεις. Χωρίς µετασχηµατισµό συντεταγµένων, κάθε εκτέλεση της λίστας απεικόνισης θα σχεδίαζε το σχήµαστηνίδια (αρχικά καθορισµένη) θέση της σκηνής και µε τις ίδιες διαστάσεις που έχουν οριστεί µέσα στη λίστα.
Συντεταγµένες µοντέλου Μετασχηµατισµός µοντέλου Συντεταγµένες µοντέλου: οι συντεταγµένες µε τις οποίες δηλώνεται ένα πρότυπο σχήµα (συνήθως µέσα σε µια displa list) Μετασχηµατισµός µοντέλου: αντιστοίχιση συντεταγµένων µοντέλου σε συντεταγµένες σκηνής mod M elview
Μητρώα µετασχηµατισµού Μητρώο µετασχηµατισµού µοντέλου (modelview matri): Μετασχηµατίζει τις συντεταγµένες µοντέλου σε συντεταγµένες σκηνής. Μητρώο προβολής (projection matri): Μετασχηµατίζει τις συντεταγµένες σκηνής ανάλογα µετοντύπο προβολής που επιλέγουµε (περισσότερα στο Κεάλαιο 4). Τα µητρώα µετασχηµατισµού µοντέλου και προβολής έχουν διαστάσεις 44. Οι µετασχηµατισµοί µεντέλου και προβολής εκτελούνται αλυσιδωτά.
Επεξεργασία µητρώων µετασχηµατισµού Σε κάθε χρονική στιγµή µπορούµεναεπεξεργαστούµε µόνο ένα από τα µητρώα µετασχηµατισµού µοντέλου ή προβολής Η επιλογή του µητρώου που επεξεργαζόµαστε γίνεται µετην εντολή glmatrimode void glmatrimode(glenum matri); GL_MODELVIEW: µετάβαση στην κατάσταση επεξεργασίας µητρώου µετασχηµατισµού µοντέλου GL_PROJECTION: µετάβαση στην κατάσταση επεξεργασίας µητρώου προβολής
Τα µητρώα µετασχηµατισµών ως µεταβλητές κατάστασης Τα µητρώα µετασχηµατισµών, διατηρούν τις τιµές που τους έχουν ανατεθεί την τελευταία ορά. Αν απαιτηθεί η αρχικοποίησή τους, αυτή θα πρέπει να δηλωθεί ρητά από τον προγραµµατιστή µε τηνεντολήglloadidentit. void glloadidentit(); Aρχικοποιεί το τρέχον µητρώο µετασχηµατισµού στην τιµή I 4 I Τα µητρώα µετασχηµατισµού µοντέλου και προβολής έχουν ως αρχική τιµή τον πίνακα Ι4. Εποµένως, µε τις αρχικές τους ρυθµίσεις, δεν προκαλούν µεταβολή στις συντεταγµένες µοντέλου.
Προσοχή στην αρχικοποίηση των µητρώων! Ο προγραµµατιστής, πριν δώσει εντολή αρχικοποιήσης µητρώου, θα πρέπει να βεβαιωθεί ότι η εντολή θα αρχικοποιήσει το επιθυµητό µητρώο µετασχηµατισµού. Παράδειγµα : Αρχικοποίηση µητρώου µετασχηµατισµού µοντέλου glmatrimode(gl_modelview); glloadidentit( ); // Αρχικοποίηση του µητρώου µετασχηµατισµού µοντέλου Παράδειγµα 2: Αρχικοποίηση µητρώου προβολής glmatrimode(gl_projection); glloadidentit( );
Στοιχειώδεις µετασχηµατισµοί Κατηγορίες στοιχειωδών µετασχηµατισµών: Μετατόπιση Κλιµάκωση Κλίση Περιστροή
Μετατόπιση Μετατόπιση σηµείου στο χώρο κατά ( tr, tr, tr ) ως προς τις διευθύνσεις,,. tr tr tr + + + tr tr tr Μητρώο µετατόπισης
Εντολή µετατόπισης Ο ορισµός µητρώου µετατόπισης κατά ( tr, tr, tr ) γίνεται µε τιςεντολές gltranslate*. gltranslatef ( GLfloat tr,glfloat tr, GLfloat tr ); gltranslated ( GLdouble tr, GLdouble tr, GLdouble tr ); tr tr tr οι µετατοπίσεις κατά τους άξονες, και.
Κλιµάκωση Οι συντεταγµένες πολλαπλασιάζονται µε ένα σταθερό συντελεστή ανά διεύθυνση s, s, s: συντελεστές κλιµάκωσης ως προς τις διευθύνεις και αντίστοιχα s s s s s s Μητρώο µετασχηµατισµού κλιµάκωσης
Κλιµάκωση Στην OpenGL, η κλιµάκωση εκτελείται µε τιςεντολέςglscale*: void glscalef(glfloat s, Glfloat s, Glfloat s); void glscaled(gldouble s, Gldouble s Gldouble s); s, s, s οι συντελεστές κλιµάκωσης κατά τις διευθύνσεις,, αντίστοιχα.
Ανάκλαση Ειδική περίπτωση κλιµάκωσης s- ή s- ή s- Η ανάκλαση εξάγει το συµµετρικό ενός σηµείου ως προς το επίπεδο, ή αντίστοιχα S REFX S REFY S REFZ
Κλίση η τιµή µίαςαπότιςσυντεταγµένες,, των σηµείων µεταβάλλεται γραµµικά ως προς µία ή περισσότερες εκ των άλλων δύο συντεταγµένων Πχ γραµµική µεταβολή της συντεταγµένης ως προς α : συντελεστής κλίσης Στο παραπάνω παράδειγµαησυντεταγµένη µεταβάλλεται γραµµικά ως προς την απόστασή του σηµείου,, από το επίπεδο (που είναι ίση µε ) a + a
Κλίσηωςπροςδύοεπίπεδα η τιµή µίαςαπότιςσυντεταγµένες,, των σηµείων µεταβάλλεται γραµµικής µεταβολής ως προς δύο συντεταγµένες δύο συντεταγµένων Πχ γραµµική µεταβολή της συντεταγµένης ως προς και α,β : συντελεστές κλίσης Στο παραπάνω παράδειγµαησυντεταγµένη µεταβάλλεται γραµµικά ως προς την απόστασh του σηµείου,, από τα επίπεδα και b a + + b a
Κλίση ως προς τυχαία επίπεδα αναοράς Μετασχηµατισµοί κλίσης µε αναορά τυχαία επίπεδα Πχ γραµµική µεταβολή της συντεταγµένης ως προς και Για τον ορισµό µετασχηµατισµών κλίσης δεν υπάρχει συγκεκριµένη εντολή στην OpenGL. Ο ορισµός µητρώων κλίσης γίνεται µε τηνάµεση ανάθεσης τιµών στα στοιχεία του µητρώου µετασχηµατισµού µοντέλου. ( ) ( ) b a + + ( ) + b a b a
Περιστροή Η περιστροή ενός σηµείου κατά γωνία (επιπέδου XY) Άξονας περιστροής στην αρχή των αξόνων του συστήµατος συντεταγµένων σκηνής + cos sin sin cos cos sin sin cos Περιγραή περιστροής στις 3 διαστάσεις Θεωρούµε την πρόσθετη συνθήκη Περιστροή ως προς τον άξονα O Μητρώο περιστροής ως προς τον άξονα O
Περιστροή ως προς O ΟΙ περιστροές ως προς τους άλλους άξονες του καρτεσιανού συστήµατος συντεταγµένων σκηνής Οι εξισώσεις προκύπτουν µε κυκλική εναλλαγή µεταβλητών: Πρώτη εναλλαγή µεταβλητών: περιστροή σηµείου στο χώρο κατά γωνία µε άξονα περιστροής τον O + cos sin sin cos cos sin sin cos
Περιστροή ως προς O εύτερη εναλλαγή µεταβλητών: περιστροή σηµείου στο χώρο κατά γωνία µε άξονα περιστροής τον O + + cos sin sin cos cos sin sin cos
Εντολές περιστροής στην OpenGL Μπορούµε να εκτελέσουµε µετασχηµατισµούς περιστροής ως προς οποιαδήποτε άξονα περιστροής. Ορίζουµεέναδιανύσµα που η διεύθυνσή του ταυτίζεται µε τηδιεύθυνση του άξονα περιστροής. Ο άξονας περιστροής διέρχεται από την αρχή των αξόνων. Οι µετασχηµατισµοί περιστροής εκτελούνται µε τιςεντολέςglrotate* glrotatef (Glfloat angle, GLfloat v, GLfloat v, GLfloat v ); glrotated (GLdouble angle, GLdouble v, GLdouble v, GLdouble v ); angle: η γωνία περιστροής σε µοίρες v,v,v : οι συνιστώσες διανύσµατος που εκράζει τη διεύθυνση του άξονα περιστροής Η ορά περιστροής καθορίζεται από τη ορά του διανύσµατος (v,v,v) και σύµωνα µε τον κανόνα του δεξιού χεριού.
Σύνθετοι µετασχηµατισµοί Σύνθετος µετασχηµατισµός: Μία αλυσιδωτή εαρµογή στοιχειωδών µετασχηµατισµών Ένας σύνθετος µετασχηµατισµός δηµιουργείται από τους επιµέρους στοιχειώδεις µετασχηµατισµούς που αναλύθηκαν. Σύµβαση: Το µητρώο ενός σύνθετου µετασχηµατισµού αναπαρίσται µετη µορή γινοµένου µητρώων στοιχειωδών µετασχηµατισµών Σε 3 σύνθετους µετασχηµατισµούς, για να είναι εικτή η αναπαράσταση τους σε µορή γινοµένου, τα µητρώα θα πρέπει να έχουν διαστάσεις 44.
Οµογενείς συντεταγµένες Εάν: - ένας 3 σύνθετος µετασχηµατισµός περιέχει έναν µετασχηµατισµό µετατόπισης - χρησιµοποιούµε µητρώα διαστάσεων 33, δεν υπάρχει τρόπος τα µητρώα να ενοποιηθούν σε µορή γινοµένου. Λύση: Eπεκτείνουµε κατά τη διάσταση των µητρώων µετασχηµατισµού Αναπαριστούµετασηµεία µε τηµορή τετραδιάστατων διανυσµάτων (µε τη µορή οµογενών συντεταγµένων (,,,h). Η παράµετρος h παίρνει την τιµή Επεκτείνοντας τη διάσταση των µητρώων κατά επιτρέπουµετο συνδυασµόόλωντωνστοιχειωδώνσεένασύνθετοµητρώο µε σχέσεις γινοµένου.
Παράδειγµα: σύνθετος µετασχηµατισµός περιστροής και µετατόπισης 44 µητρώο περιστροής cos sin sin cos θ θ θ θ R Τ tr tr tr 44 µητρώο µετατόπισης O σύνθετος µετασχηµατισµός προκύπτει από το γινόµενο των µητρώων στοιχειωδών µετασχηµατισµών
Πολλαπλασιασµός στοιχειωδών µητρώων µετασχηµατισµού Εντολές έµµεσης δήλωσης στοιχειωδών µετασχηµατισµών (gltranslate, gltrotate κλπ ) δεν αντικαθιστούν το τρέχον µητρώο µετασχηµατισµού αλλά πολλαπλασιάζονται µεαυτό Κάθε στοιχειώδες µητρώο Μ που δηλώνουµεέµµεσα πολλαπλασιάζεται µε τοτρέχονµητρώο µετασχηµατισµού C από δεξιά. C C M Στον πολλαπλασιασµό µητρώων δεν ισχύει η αντιµεταθετική ιδιότητα CM MC Έχει µεγάλη σηµασία η διαδοχή µε την οποία επιβάλλονται οι στοιχειώδεις µετασχηµατισµοί.
Σειρά δήλωσης µετασχηµατισµών Στην OpenGL, οι συντεταγµένες των σηµείων εκράζονται µετηµορή διανυσµάτων στηλών. M 2 M M Τα µητρώα στοιχειωδών µετασχηµατισµών δηλώνονται από αριστερά προς τα δεξιά. Εποµένως το µητρώο που επιδρά πρώτο (Μ2) πρέπει να δηλωθεί τελευταίο. Τα µητρώα µετασχηµατισµού πολλαπλασιάζονται µεταδιανύσµατα στήλες των συντεταγµένων µόνο από αριστερά. Έστω ο σύνθετος µετασχηµατισµός
Παράδειγµα: σύνθετος µετασχηµατισµός περιστροής και µετατόπισης cos sin sin cos R T tr tr tr θ θ θ θ Προγραµµατιστική υλοποίηση µετασχηµατισµού: glmatrimode(gl_modelview); //Μετάβαση στην κατάσταση Επεγεργασίας του µητρώου µετασχηµατισµού µοντέλου glloadidentit( ); // αρχικοποίηση µητρώου µετασχηµατισµού µοντέλου (εάν αυτή είναι απαραίτητη) gltranslate{fd}(tr,tr,tr); // Ορισµός µητρώου µετατόπισης glrotate{fd}(θ,,,); //Ορισµός µητρώου περιστροής
Άµεσος ορισµός µητρώου µετασχηµατισµού Στην OpenGL o προγραµµατιστής έχει την ευχέρεια να παρακάµψει τις παραπάνω συναρτήσεις δήλωσης µετασχηµατισµών και να τροποποιήσει απευθείας τις τιµές του τρέχοντος µητρώου µετασχηµατισµού (άµεσος ορισµός) δυνατότητα ορισµού µετασχηµατισµών που δε µπορούν να δηλωθούν µε εντολές έµµεσου σχηµατισµού (πχ µετασχηµατισµοί κλίσης) ύο κατηγορίες: α) Αντικατάσταση του τρέχοντος µητρώου µετασχηµατισµού β) Πολλαπλασιασµός τρέχοντος µητρώου µετασχηµατισµού µε αυθαίρετο µητρώο
Αντικατάσταση του τρέχοντος µητρώου µετασχηµατισµού void glloadmatrif(glfloat *elem6); void glloadmatrid(gldouble *elem6 ); elem6: µητρώο που περιέχει τις προς ανάθεση τιµές elem6 elem[] elem[] elem[2] elem[3] elem[4] elem[5] elem[6] elem[7] elem[8] elem[9] elem[] elem[] elem[2] elem[3] elem[4] elem[5]
Πολλαπλασιασµός του τρέχοντος µητρώου µετασχηµατισµού void glmultmatrif (GLfloat *elem6); void glmultmatrid (GLdouble *elem6); elem6: µητρώο µετασχηµατισµού δοσµένο υπό τη µορή οµογενών συντεταγµένων H εντολή glmultmatri* πολλαπλασιάζει το µητρώο elem6 µε τοτρέχον µητρώο µετασχηµατισµού C από δεξιά. C C elem6
Στοίβες µητρώων µετασχηµατισµού Για κάθε κατηγορία µητρώου µετασχηµατισµού (µοντέλου και προβολής) η µηχανή της OpenGL προβλέπει την ύπαρξη µιας στοίβας Oι στοίβεςµητρώων προσέρουν τη δυνατότητα αποθήκευσης πολλαπλών προίλ για κάθε µητρώο Το ενεργό µητρώο µετασχηµατισµού βρίσκεται στην κορυή της κάθε στοίβας.
Προσθήκη µητρώου στη στοίβα Τακτική αποθήκευσης µητρώων στη στοίβα Τροποποιούµετοενεργόµητρώο µετασχηµατισµού και το προωθούµε κατά ένα επίπεδο στη στοίβα. void glpushmatri(); Μεταέρει το ενεργό µητρώο και όσα βρίσκονται χαµηλότερα από αυτό κατά ένα επίπεδο προς τα κάτω στη στοίβα.
Ανάκληση µητρώου από στη στοίβα Η ανάκληση των µητρώων από τη στοίβα γίνεται βάσει της λογικής last in-first out. void glpopmatri(); Η εκτέλεση της glpopmatri µεταθέτει κάθε µητρώο κατά µία θέση προς τα πάνω στη στοίβα. Το ενεργό µητρώο αντικαθίσταται από το αµέσως επόµενό του στη στοίβα.
Αλλαγή συστήµατος συντεταγµένων. Οι δηλώσεις µετασχηµατισµών που αναλύσαµεπροηγουµένως, µπορούν να χρησιµοποιηθούν και για την αλλαγή συστήµατος συντεταγµένων Ανάγουν την περιγραή της σκηνής σε σύστηµα συντεταγµένων που προκύπτει από το αρχικά καθορισµένο σύστηµα µε διαδικασίες στοιχειωδών µετασχηµατισµών (χρήσιµη γιατην παρατήρηση µιας σκηνής από διαορετικές οπτικές γώνίες) Μετατόπιση συστήµατος συντεταγµένων Περιστροή συστήµατος συντεταγµένων
Μετατόπιση συστήµατος συντεταγµένων Ηπεριγραήτηςσκηνήςωςπροςτοµετατοπισµένο σύστηµα συντεταγµένων µεαρχήστοσηµείο tr,tr,re ισοδυναµεί µε µετατόπιση όλων των σηµείων της. σκηνής κατά ( tr, -tr, -tr) T Εντολή ορισµού: tr tr tr gltranslate{fd}(-tr,-tr,-tr);
Περιστροή συστήµατος συντεταγµένων. H περιγραή της σκηνής ως προς το περιστραµµένο σύστηµα συντεταγµένων κατά γωνία θ ισοδυναµεί µε την περιστροή όλων των σηµείων της σκηνής κατά γωνία θ. Εντολή ορισµού glrotate{fd}(-θ,,,); ( ) ( ) ( ) ( ) cos sin sin cos θ θ θ θ Περιστροή ΣΣ ως προς τον άξονα O κατά γωνία θ
. Τέλος ενότητας!