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

Σχετικά έγγραφα
Εισαγωγή στην OpenGL

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

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

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

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

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

OpenGL. Εισαγωγή στην OpenGL Βασικά Γεωμετρικά Σχήματα Παράλληλη (ορθογραφική) προβολή. Μάθημα: Γραφικά Υπολογιστών και Εικονική Πραγματικότητα

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

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

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

Γραφικά Υπολογιστών: OpenGL

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

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

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

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

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

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

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

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

Αρχιτεκτονική σχεδίαση με ηλεκτρονικό υπολογιστή

Γραφικά Υπολογιστών. Τμήμα Μηχανικών Πληροφορικής ΤΕΙ Ανατολικής Μακεδονίας και Θράκης. Γραφικά Υπολογιστών ΣΤ Εξάμηνο. Δρ Κωνσταντίνος Δεμερτζής

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

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

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

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

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

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Εισαγωγή στην Πληροφορική

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

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

Προγραμματισμός ΙI (Θ)

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

Πώς μπορούμε να δημιουργούμε γεωμετρικά σχέδια με τη Logo;

Απόδοση 3D σκηνών - Κινούµενα γραφικά

4 ο Εργαστήριο Τυχαίοι Αριθμοί, Μεταβλητές Συστήματος

Κεφάλαιο 2.3: Ρυθμίσεις των Windows

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

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

Απεικόνιση Υφής. Μέρος Α Υφή σε Πολύγωνα

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

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

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

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

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

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

αντίστοιχο γεγονός. Όταν όντως το κουμπί

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

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

Βασικές αρχές σχεδίασης (Α)

Διαδικασιακός Προγραμματισμός

Κεφάλαιο 8. Οπτικοποίηση Απαλοιφή

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

Ενότητα 2. Ζωγραφίζοντας με το ΒΥΟΒ

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

Διαδικασιακός Προγραμματισμός

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

Εισαγωγή στην επανάληψη

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

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

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Τμήμα Μηχανικών Σχεδίασης Προϊόντων & Συστημάτων ΓΡΑΦΙΚΑ (6151) ΕΝΔΕΙΚΤΙΚΕΣ ΠΡΟΑΙΡΕΤΙΚΕΣ ΑΣΚΗΣΕΙΣ

Θέση και Προσανατολισμός

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

Παράδειγμα «Ημίτονο και ζωγραφική!»: Έχει δει στα μαθηματικά τη γραφική παράσταση της συνάρτησης του ημιτόνου; Σας θυμίζει κάτι η παρακάτω εικόνα;

QS-LIS

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

> μεγαλύτερο <= μικρότερο ή ίσο < μικρότερο == ισότητα >= μεγαλύτερο ή ίσο!= διαφορετικό

Scratch 2.0 Προκλήσεις

Άσκηση 6 η Ανύψωση Σχημάτων. Στόχος της άσκησης

2ο Μάθημα Μετασχηματισμοί 2Δ/3Δ και Συστήματα Συντεταγμένων

Microsoft Excel Κεφάλαιο 1. Εισαγωγή. Βιβλίο εργασίας

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

ΟΔΗΓΙΕΣ ΧΡΗΣΗΣ ΠΡΟΓΡΑΜΜΑΤΟΣ Dcad 1.0

Γραφικά Υπολογιστών: Μέθοδοι Ανίχνευσης Επιφανειών (Surface Detection Methods)

Συσκευές εισόδου. Φυσικές συσκευές εισόδου Λογικές συσκευές εισόδου

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα CAD / CAM. Ενότητα # 6: Γραφικά

ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΕΝΤΡΙΚΗΣ ΜΑΚΕΔΟΝΙΑΣ ΣΧΟΛΗ ΤΜΗΜΑ. Μαθηματικά 1. Σταύρος Παπαϊωάννου

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

ΣΧΕΔΙΑΣΗ ΜΗΧΑΝΟΛΟΓΙΚΩΝ ΚΑΤΑΣΚΕΥΩΝ ΜΕ Η/Υ (Computer Aided Design)

Γεωργάκης Αριστείδης ΠΕ20

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Γραφικά µε Υπολογιστές. Μετασχηµατισµοί Σύνθετη Γεωµετρία

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Εισαγωγή στην Αριθμητική Ανάλυση

ΚΕΦΑΛΑΙΟ 5. Κύκλος Ζωής Εφαρμογών ΕΝΟΤΗΤΑ 2. Εφαρμογές Πληροφορικής. Διδακτικές ενότητες 5.1 Πρόβλημα και υπολογιστής 5.2 Ανάπτυξη εφαρμογών

Vodafone Business Connect

Τυπικές χρήσεις της Matlab

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΑΣΚΗΣΗ 2 ΒΑΣΙΚΑ ΚΑΙ ΣΥΝΘΕΤΑ ΣΗΜΑΤΑ ΔΥΟ ΔΙΑΣΤΑΣΕΩΝ - ΕΙΚΟΝΑΣ

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

2.0 ΒΑΣΙΚΕΣ ΓΝΩΣΕΙΣ-ΟΡΟΛΟΓΙΕΣ

Τα Windows Πολύ Απλά και Πολύ Σύντομα

Ας μετονομάσουμε τη γάτα που εμφανίζεται μόλις ανοίγουμε το Scratch. Επιλέγουμε το εικονίδιο Μορφή1 που βρίσκεται στη λίστα αντικειμένων.

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

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

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

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

Transcript:

ΤΕΙ ΚΑΒΑΛΑΣ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΠΛΗΡΟΦΟΡΙΩΝ ΜΟΝΤΕΛΟΠΟΙΗΣΗ ΕΞΟΧΙΚΗΣ ΚΑΤΟΙΚΙΑΣ ΜΕ ΧΡΗΣΗ OpenGL Περιστερίδου Καλλιόπη ΣΕΠΤΕΜΒΡΙΟΣ 2010 ΕΠΟΠΤΗΣ ΚΑΘΗΓΗΤΗΣ Παπαδημητρίου Στέργιος Εκπονηθείσα πτυχιακή εργασία απαραίτητη για την κτήση του βασικού πτυχίου

Πρόλογος Η πτυχιακή εργασία είναι σχεδιασμένη με την χρήση της ΟρβηΘΙ η οποία είναι μία βιβλιοθήκη γραφικών. Στην συγκεκριμένη εργασία θα δούμε μία ξύλινη εξοχική κατοικία η οποία είναι στο δάσος. Αρχίσει με νυχτερινό τοπίο και σιγά σιγά καθώς ξημερώνει θα βλέπουμε και το εσωτερικό της κατοικίας. Καθ όλη τη διάρκεια της αναπαραγωγής της εφαρμογής ακούγεται και μουσική καθώς και πέφτει χιόνι. Αφού ολοκληρωθεί η περιήγηση στον εσωτερικό χώρο του σπιτιού θα ανοίξει η πόρτα για θα δούμε και τον εξωτερικό χώρο και το εξωτερικό τοπίο. Για αρχή για γίνει επεξήγηση της ΟρβηΘΙ με λίγα λόγια σαν θεωρητικό κομμάτι καθώς και για τις εντολές, τις συναρτήσεις, τα αντικείμενα και άλλες χρήσιμες πληροφορίες οι οποίες χρειάστηκαν για την υλοποιήσει αυτής της εργασίας. Στο τέλος θα δοθεί το πρόγραμμα ακριβώς όπως γράφτηκε μαζί με λίγα λόγια για να γίνει η λεπτομερή περιγραφή κάθε ενότητας του προγράμματος. Η πτυχιακή αυτή έγινε για να κατανοηθεί η ΟρβηΘΙ, να δούμε που την χρησιμοποιούμε και για να δημιουργήσουμε ένα όμορφο περιβάλλον με την χρήση της. Σελίδα 2 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης Πίνακας περιεχομένων Πρόλογος...2 ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ... 2 Ευχαριστίες...7 Εισαγωγή...8 Κεφάλαιο 1 Εισαγωγή στην OpenGL... 9 1.1 Τι είναι η OpenGL; (Open Source Graphics Library)... 9 Τι είναι ένα API συσκευή;...11 Τι είδους API είναι η OpenGL;... 12 Ποια είναι μερικά οφέλη για η OpenGL;... 12 Τι άλλες πληροφορίες που χρειάζεται να ξέρω;...12 Τι είναι ένα παράδειγμα για την OpenGL;... 12 Τι είναι το Direct3D; Είναι OpenGL;... 12 1.2 Τ ύποι δεδομένων OpenGL... 13 1.3 Βιβλιοθήκες...14 1.4 OpenGL graphics pipeline... 15 1.5 Εντολές και συναρτήσεις... 16 1.6 Πρωταρχικά Αντικείμενα Γραφικών (Graphics Primitives)... 18 1.6.1 Στοιχειώδη αντικείμενα γραφικών...20 1.6.2 Σύνθετοι τύποι γραμμών...21 1.6.3 Πολύγωνα... 21 1.6.4 Συνεχόμενη σχεδίαση (strips and fans)... 21 Κεφάλαιο 2 Μετασχηματισμοί Αντικειμένων...32 2.1 Γεωμετρικοί Μετασχηματισμοί Αντικειμένων...32 2.2 Αφινικοί Μετασχηματισμοί (Affine Transformations)... 33 2.3 Ορθογώνιοι Μετασχηματισμοί... 34 2.4 Ομοιογενής Φορμαλισμός (homogeneous coordinates)... 35 Σύνθεση Μετασχηματισμών (Concatenation)...37 Αντίστροφοι Αφινικοί Μετασχηματισμοί...38 Ειδικές περιπτώσεις Περιστροφής... 38 Κεφάλαιο 3 Μετασχηματισμοί στην OpenGL...40 3.1 Μετακίνηση...41 3.2 Περιστροφή... 41 3.3 Κλίμακα... 42 3.4 Τοποθέτηση κάμερας... 42 3.5 Εφαρμογή των μετασχηματισμών στην OpenGL... 42 Σελίδα 3 από 342

3.6 Στοίβα πινάκων... 44 3.7 Μετασχηματισμός προβολής... 46 Κεφάλαιο 4 Υφές(textures)... 48 4.1 Απεικόνιση Υφής και Ανάγλυφου...48 4.2 Απεικόνιση Χάρτη Υφής (Image Mapping)...49 4.3 Συναρτήσεις Απεικόνισης... 50 4.3.1 Planar Mapping... 50 4.3.2 Cylindrical Mapping... 51 4.3.3 Spherical Mapping... 52 4.3.4 Shrink Mapping (προσανατολισμένη απεικόνιση)... 53 4.3.5 Box Mapping (απεικόνιση κύβου):... 54 4.4 Δημιουργώντας την υφή... 56 4.5 Παραμετροποίηση μιας υφής... 57 4.6 Mipmapping...59 4.7 Μη ισοτροπικό φιλτράρισμα υφών (Anisotropic Filtering)... 61 4.8 Συνδυασμός χρώματος υφής και χρώματος αντικειμένου... 63 4.9 Μετασχηματισμοί συντεταγμένων υφής...63 Κεφάλαιο 5 Σκιές και Ανακλάσεις... 65 5.1 Ανακλάσεις στην OpenGL... 65 5.2 Σκιές με προβολή... 66 5.3 O stencil buffer... 66 Κεφάλαιο 6 Το εκτελέσιμο πρόγραμμα... 69 Christmas Tree.cpp αρχείο... 69 CScene.cpp...86 GdBase.cpp...111 GdBlendedObject.cpp...115 GdCamera.cpp...118 GdCube.cpp...127 GdCylinder.cpp...131 GdFace.cpp...138 GdFrame.cpp...153 GdLensFlare.h.cpp...160 GdLight.cpp...164 GdMotion.cpp...170 Σελίδα 4 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης ΟόΜοίΙοπΒ8ρίΙπθ.ορρ...176 ΟάΜονθ8όίθ.ορρ...182 ΟάΟ^θοί.ορρ...203 ΟάΡ8ΓίΙοίθ.ορρ...206 ΘάΡοΙπΙορρ...218 ΟάΡπβη.ορρ...222 ΟάΡγΓ8ηΙάθ..ορρ...227 ΟάΟϋ8ά.ορρ...231 Θά8ή8ρθ.ορρ...234 Οά8ί8ΓΟοπθ.ορρ...261 ΟάΤθχΙ.ορρ...268 ΟάΤΓϋΠθ8ίθάΟοπθ.ορρ... 273 ΟάΤΓϋΠθ8ίθάΡΓΙ8η.ορρ... 281 9ίοό8ί.ορρ...286 Ο8οθπθ.Ιί...293 0άΒ8βθ.ή...298 ΟόΒίθπάθάΟ^θοί.ή...300 Θάθ8ΠθΓ8.ή...302 ΘάΟοπθ.ή...303 ΘάΟϋόθ.ή...305 ΟάΟγΙΙπάθΓ.ή...306 ΟάΡ8θθ.Ιι...308 ΘάΡΓ8Πθ.ή...312 ϋάιθπβρ^γθ.ή...313 Οάϋςήί.ή...314 ΘάΜοίΙοπ.ή...316 ΟόΜΟίΙοπΒ8ρίΙπθ.ή...318 ΘάΜονθ8όίθ_ή...319 ΟάΟ^θοί.ή...322 ΟάΡ8ΓίΙοίθ.ή...323 ΘάΡοΙπί.ή...325 ΘάΡΓΙβη.ή...326 Σελίδα 5 από 342

GdPyramide.h...327 GdQuad.li...328 GdShape.h...329 GdStarcone.h...332 GdText.li...334 GdTruncatedCone.h...335 GdTruncatedPrism.h...337 Global.h...338 Σελίδα 6 από 342

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

Εισαγωγή Σ αυτή την πτυχιακή θα δούμε πως μπορούμε να σχεδιάσουμε μια εξοχική κατοικία καθώς το εσωτερικό και εξωτερικό της περιβάλλον. Για αρχή στο πρώτο μας κεφάλαιο θα γνωρίσουμε την OpenGL, τους τύπους δεδομένων της, τις βιβλιοθήκες της και άλλα τα οποία είναι χρήσιμα στο να την κατανοήσουμε και να μπορέσουμε να την χρησιμοποιήσουμε. Στη συνέχεια καθώς πηγαίνουμε στο δεύτερο κεφάλαιο θα δούμε τους μετασχηματισμούς των αντικειμένων και στο τρίτο κεφάλαιο θα γνωρίσουμε τους μετασχηματισμούς στην OpenGL, συγκεκριμένα την μετακίνηση, την περιστροφή ακόμη και την τοποθέτηση της κάμερας, την στοίβα των πινάκων και άλλα πολλά. Στο τέταρτο κεφάλαιο θα μας απασχολήσουν οι υφές, από την δημιουργία τους, την απεικόνιση τους, την παραμετροποίηση τους κ.α. Σκιές και ανακλάσεις θα δούμε καθώς προχωράμε παρακάτω, στο πέμπτο κεφάλαιο της εργασίας. Θα γίνει μια λεπτομερή ανάλυση στις ανακλάσεις και στις σκιές ακόμη και στο stencil buffer. Έτσι κάπως τελειώνει και το θεωρικό μέρος της πτυχιακής εργασίας και έρχεται το έκτο κεφάλαιο, θα δούμε το πρόγραμμα που γράφτηκε ώστε να γίνει ο σχεδιασμός του περιβάλλοντος με την κατοικία. Σε κάποιες εντολές δίνονται κ εξηγήσεις ώστε να γίνει ποιο κατανοητό κ πρόγραμμα. Σελίδα 8 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης Κεφάλαιο 1 Εισαγωγή στην OpenGL Για αρχή θα γίνει μία λεπτομερής αναφορά για το τι ακριβώς είναι η OpenGL, που είναι χρήσιμη, τα χαρακτηριστικά της, τις βιβλιοθήκες, τις εντολές και πολλά άλλα μαζί με ένα παράδειγμα για το πώς είναι ένα τυπικό πρόγραμμα. 1.1 Τι είναι η OpenGL; (Open Source Graphics Library) Η OpenGL είναι βιβλιοθήκη γραφικών ανεξάρτητη από την πλατφόρμα (vs Direct3D - windows only). Με τον όρο OpenGL δεν αναφερόμαστε σε μια συγκεκριμένη βιβλιοθήκη αλλά σε ένα πρότυπο υλοποίησης βιβλιοθηκών σχεδίασης γραφικών. Εμπεριέχει δηλαδή το σύνολο των συναρτήσεων που πρέπει να υλοποιεί μία βιβλιοθήκη γραφικών προκειμένου να είναι συμβατή με αυτό. Το πρότυπο αυτό λοιπόν καθορίζει μια προγραμματιστική διεπιφάνεια (application programming interface ή API). Είναι Open Source και χρησιμοποιείται για τη δημιουργία 3D γραφικών. Επίσης είναι πολύ διαδεδομένη για παραγωγή 3Δ γραφικών όπως σε video games, ταινίες, κτλ. Είναι προφανές ότι δεν υπάρχει περιορισμός ως προς τη γλώσσα προγραμματισμού στην οποία θα υλοποιηθεί το πρότυπο της OpenGL. Ενδεικτικά αναφέρουμε την ύπαρξη βιβλιοθηκών σε γλώσσες προγραμματισμού Fortran και C. Εφόσον με το όρο OpenGL δεν αναφερόμαστε σε μια συγκεκριμένη βιβλιοθήκη αλλά σε ένα πρότυπο που ορίζει τη λειτουργικότητα μιας βιβλιοθήκης σχεδίασης, μπορούμε να ακολουθήσουμε τις ίδιες συμβάσεις σε όλες τις υλοποιήσεις του προτύπου (τις ίδιες εντολές). Αυτό σημαίνει ότι, εάν βασιστούμε στο πρότυπο της OpenGL, ο κώδικας που συντάσσουμε είναι ανεξάρτητος πλατφόρμας (platform independent) και μπορεί να εκτελεστεί σε ευρεία γκάμα περιβαλλόντων προγραμματισμού χωρίς ριζική τροποποίηση της δομής του. Σελίδα 9 από 342

Οι βιβλιοθήκες των περισσότερων νέων μεταγλωττιστών εμπεριέχουν (ή υπάρχει η δυνατότητα να ενσωματωθεί σε αυτούς) μια υλοποίηση της OpenGL. Η OpenGL στην ουσία είναι ένα σύνολο εντολών (API) που μας επιτρέπει την δημιουργία τριδιάστατων γραφικών. Δεν είναι γλώσσα προγραμματισμού αλλά μπορεί να χρησιμοποιηθεί με μια πληθώρα γλωσσών προγραμματισμού (C, C++, Java, Visual Basic, Delphi και άλλες) και σε μια πληθώρα λειτουργικών συστημάτων (Windows, Unix, Linux, Mac OS). Είναι σχεδιασμένη ώστε να είναι ανεξάρτητο από το υλικό (hardware) και από λειτουργικό σύστημα - παραθυρικό περιβάλλον. Δηλαδή μας παρέχει ένα σύνολο εντολών για την επικοινωνία με το υλικό και υποστηρίζεται από όλες τις εταιρείες κατασκευής καρτών γραφικών. Είναι το τρέχον standard παρά τις προσπάθειες της Microsoft με το DirectX. Για αυτό το λόγο χρησιμοποιείται ευρέως σε πολλές εφαρμογές και παιχνίδια. Προσφέρει πάνω από 300 εντολές για δημιουργία γραφικών και δρα σαν ένα ενδιάμεσο στρώμα ανάμεσα στην εφαρμογή και στη κάρτα γραφικών που θα αναλάβει τα απεικονίσει τα γραφικά στην οθόνη, κρύβοντας λεπτομέρειες υλοποίησης του υλικού και των οδηγών του. [28] Εικόνα 1.1: Οδηγοί γραφικών [28] Σελίδα 10 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης Προγράμματα που χρησιμοποιούν OpenGL μπορούν να τρέξουν και χωρίς επιταχυντή γραφικών (3D graphics card), θα είναι όμως πολύ πιο αργά και πιθανώς να μην υποστηρίζουν όλες τις λειτουργίες της OpenGL. Είναι το πρώτο ευρέως διαδεδομένο API για γραφικά. Η OpenGL αναπτύχθηκε απο την εταιρία Silicon Graphics το 1992. Το OpenGL είναι μια μηχανή καταστάσεων (state machine) με την έννοια ότι είμαστε διαρκώς σε μια κατάσταση μέχρι με μια εντολή να μεταβούμε σε κάποια άλλη. Για παράδειγμα, όταν χρωματίζουμε αντικείμενα, μπορούμε να θέσουμε το χρώμα σε κόκκινο, κίτρινο κ.α. και θα χρησιμοποιούμε το ίδιο χρώμα συνέχεια, μέχρι να ορίσουμε ένα καινούριο χρώμα. Η OpenGL αντιπροσωπεύει την Open Graphics Βιβλιοθήκη και αποτελείται από περίπου 150 διαφορετικές εντολές. Η OpenGL είναι ένα API που χρησιμοποιείται συνήθως για ένα πλήθος εφαρμογών και συσκευών σε έναν υπολογιστή. Κυριότερα χαρακτηριστικά της είναι: Μόνο για τον σχεδιασμό δεν κάνει αυτόματους υπολογισμούς φυσικής/μαθηματικών κτλ Δημιουργία ενός νέου παραθύρου και σχεδιασμός σε αυτό Στοχεύει στον σχεδιασμό εικόνας σε πραγματικό χρόνο Εκμεταλλεύεται τις δυνατότητες του υλικού (hardware) όπου είναι δυνατόν (Graphics Card Acceleration). Δουλεύει με States - καταστάσεις Συμφωνήθηκε και χρησιμοποιείται από τις μεγαλύτερες εταιρείες. Τι είναι ένα API συσκευή; Μια συσκευή API είναι ένας τρόπος για να δημιουργήσει το λογισμικό που χρησιμοποιεί εφαρμογές. Είναι μια καθορισμένη μέθοδο που μπορεί να κάνει την έξοδό της δημιουργίας λογισμικού πολύ ευκολότερη και επιτρέπει την καλύτερη ποιότητα των γραφικών, τόσο δισδιάστατο και τρισδιάστατο. Σελίδα 11 από 342

Τι είδους API είναι η OpenGL; Η OpenGL είναι ένα API που ειδικεύεται στην προσέγγιση των γραφικών, κυρίως τρισδιάστατα γραφικά, στη ζωή. Ένας τεράστιος αριθμός των αιτήσεων που εξαρτώνται από την χρήση και το OpenGL. Είναι ένας αποτελεσματικός τρόπος για την εξοικονόμηση χρημάτων και χρόνου κατά τη δημιουργία λογισμικού. Ποια είναι μερικά οφέλη για η OpenGL; Επειδή η OpenGL χρησιμοποιείται ευρέως από πολλούς διαφορετικούς φορείς ανάπτυξης λογισμικού, είναι πολύ πιο ευκολότερο να εφαρμοστεί. Επιπλέον, η OpenGL είναι χρονοβόρα δοκιμάζεται, αλλάζει συνεχώς προς το καλύτερο και θα μπορεί να χρησιμοποιηθεί σε ένα πλήθος διαφορετικών τρόπων. Τι άλλες πληροφορίες που χρειάζεται να ξέρω; Αν είστε δημιουργός του υλικού, οι άδειες που θα πρέπει να λαμβάνεται πριν αρχίσει να χρησιμοποιεί OpenGL. Το ίδιο δεν ισχύει και για εκείνους που απλά θέλουν τη μέθοδο λογισμικού. Τι είναι ένα παράδειγμα για την OpenGL; Ένας αριθμός των ηλεκτρονικών παιχνιδιών χρησιμοποιούν η OpenGL μέθοδος για γραφικά. Αυτά τα παιχνίδια περιλαμβάνουν δημοφιλείς τίτλους όπως Doom 3, World of Warcraft, και το Quake σειρά. Τι είναι το Direct3D; Είναι OpenGL; Για να ανταγωνιστούν την OpenGL προϊόντος, η Microsoft γίνει δικό τους γραφικά μέθοδος ονομάζεται Direct3D. Με πολλούς τρόπους, Direct3D είναι η ίδια μέθοδος που είναι OpenGL. Ωστόσο, υπάρχουν σημαντικές διαφορές μεταξύ των δύο, και δεν είναι απλά διαφορετικά ονόματα για το ίδιο προϊόν. Σελίδα 12 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης 1.2 Τύποι δεδομένων OpenGL Χάριν ομοιομορφίας, και για να μπορέσει να υποστηρίξει διαφορετικές πλατφόρμες, η OpenGL ορίζει μια σειρά από τύπους δεδομένων οι κυριότεροι των οποίων φαίνονται στο παρακάτω πίνακα: Τύπος δεδομένων OpenGL Ορίζεται ως Αντιστοιχία με τύπο δεδομένων στη C GLbyte Ακέραιος 8-bit signed char b GLshort Ακέραιος 16-bit short s GLint Ακέραιος 32-bit int i GLdouble GLubyte GLushort GLuint Κινητής υποδιαστολής 64- bit Θετικός 8-bit Θετικός 16-bit Θετικός 32-bit ακέραιος ακέραιος ακέραιος double unsigned char unsigned short unsigned int GLchar Χαρακτήρας 8-bit char - GLfloat GLboolean Κινητής υποδιαστολής 32- bit Θετικός 8-bit ακέραιος float unsigned char Πίνακας 1:Τύποι δεδομένων Επίθεμα H OpenGL εγγυάται ότι για παράδειγμα ένας GLShort αριθμός θα έχει εύρος 16-bit ανεξάρτητα αν το λειτουργικό σύστημα είναι Windows, Unix ή κάποιο άλλο. Το επίθεμα είναι το γράμμα που βρίσκουμε στο τέλος μιας OpenGL εντολής και που δείχνει τον τύπο δεδομένων των παραμέτρων. d ub us ui f Σελίδα 13 από 342

1.3 Βιβλιοθήκες Στην ενότητα αυτή περιγράφουμε τις κατηγορίες βιβλιοθηκών που συναντά κανείς σε υλοποιήσεις της OpenGL, καθώς και συμβάσεις σε ό,τι αφορά το συμβολισμό εντολών και σταθερών. α) Βασική βιβλιοθήκη (OpenGL core library): H βασική βιβλιοθήκη της OpenGL περιέχει τις κύριες εντολές σχεδίασης. Όλες οι εντολές της βιβλιοθήκης αυτής διακρίνονται από το πρόθεμα g l. Πολλές από τις συναρτήσεις της δέχονται προκαθορισμένα ορίσματα (συμβολικές σταθερές) τα οποία έχουν οριστεί στη βιβλιοθήκη και αντιστοιχούν σε διάφορες παραμέτρους ή καταστάσεις λειτουργίας. Κατά σύμβαση, οι σταθερές αυτές ξεκινούν με το πρόθεμα GL_. β) OpenGL Utility Library (GLU): Περιλαμβάνει συναρτήσεις που εκτελούν σύνθετους αλγορίθμους όπως π.χ. τον καθορισμό μητρώων προβολής και το σχηματισμό σύνθετων καμπυλών και επιφανειών. Κάθε υλοποίηση της OpenGL εμπεριέχει τη βιβλιοθήκη GLU. Όλες οι εντολές της βιβλιοθήκης GLU ξεκινούν με το πρόθεμα glu. γ) OpenGL Utility Toolkit (GLUT): Όπως αναφέραμε το πρότυπο της OpenGL είναι ανεξάρτητο πλατφόρμας. Ωστόσο μια αυτονόητη απαίτηση ενός προγραμματιστή είναι να έχει τη δυνατότητα να δει το αποτέλεσμα των προγραμμάτων του αλλά και να έχει δηλαδή τη δυνατότητα αλληλεπίδρασης με αυτό. Χρειάζεται δηλαδή εντολές εισόδου-εξόδου. Ωστόσο οι εντολές αλληλεπίδρασης δεν είναι ανεξάρτητες πλατφόρμας και για το λόγο αυτό οι προγραμματιστές σε OpenGL χρησιμοποιούν μία ακόμη βιβλιοθήκη που τους προσφέρει εντολές εισόδου-εξόδου. Μία από τις βιβλιοθήκες που προσφέρει τη λειτουργικότητα αυτή είναι το OpenGL Utility Toolkit (GLUT). Η βιβλιοθήκη αυτή περιλαμβάνει εντολές απεικόνισης παραθύρων στην οθόνη, δημιουργίας menus, διαχείρισης γεγονότων κλπ. Όλες οι εντολές της ξεκινούν με το πρόθεμα glut. Σελίδα 14 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης 1.4 OpenGL graphics pipeline Σε αυτή την ενότητα θα δούμε σχηματικά τα βήματα που κάνει η OpenGL από την στιγμή που πάρει τις εντολές γραφικών από την εφαρμογή μας μέχρι την στιγμή δημιουργίας της τελικής εικόνας (rendered image). Εικόνα 1.2: Δημιουργία τελικής εικόνας [28] H OpenGL χρησιμοποιεί μια μηχανή καταστάσεων (state machine) για να επικοινωνεί με την εφαρμογή. Σε αυτή την μηχανή καταστάσεων η OpenGL παραμένει διαρκώς σε μια κατάσταση μέχρι να αλλάξει η εφαρμογή την κατάσταση. Παράδειγμα αν θέσουμε το χρώμα που θα χρησιμοποιεί η OpenGL για να ζωγραφίσει ένα μοντέλο, το χρώμα θα παραμείνει στη μνήμη και θα χρησιμοποιείται μέχρι να το αλλάξουμε ή να κλείσουμε την εφαρμογή. Εφόσον λοιπόν η εφαρμογή καθορίσει το περιβάλλον που θα χρησιμοποιήσει η OpenGL για να απεικονίσει το μοντέλο μας (χρώματα, υφές, πηγές φωτός, κάμερα κλπ), περνάει στο πρώτο στάδιο κατά το οποίο θα μετασχηματίσει και θα φωτίσει (transform and lighting) τα σημεία(vertices) του μοντέλου. Στην συνέχεια η OpenGL περνά στο στάδιο της ψηφιοποίησης το οποίο λαμβάνει όλες τις πληροφορίες και την γεωμετρία από το προηγούμενο στάδιο (του μετασχηματισμού) και παράγει την τελική, ψηφιακή, εικόνα. Η εικόνα αντιγράφεται στην μνήμη του frame buffer και φτάνει έτσι στην οθόνη του υπολογιστή. [28] Αυτή η ακολουθία βημάτων που ακολουθεί η OpenGL για να απεικονίσει το μοντέλο λέγεται graphics pipeline (διασωλήνωση). Σελίδα 15 από 342

1.5 Εντολές και συναρτήσεις main.cpp Στο αρχείο main.cpp η main ξεκινά με τη συνάρτηση glutinit(). Η glutinit() αρχικοποιεί τη βιβλιοθήκη glut η οποία κάνει το προγραμματισμό για τη δημιουργία του παραθύρου πιο εύκολο και μεταφέρσιμο. Η glutinitdisplaymode() με την οποία επιλέγουμε αν θα έχουμε χρώμα κατά το μοντέλο RGB (κόκκινο- πράσινο-μπλε) ή με παλέτα, αν θα έχουμε μονό ή διπλό buffer, και αν θα έχουμε διάφορους άλλους buffer (βάθους, κτλ). Στο παράδειγμά μας με τις παραμέτρους GLUT_RGBA GLUT_DOUBLE επιλέγουμε να έχουμε χρώμα κατά το μοντέλο κόκκινο- πράσινο-μπλε και διπλό buffer. Εδώ πρέπει να αναφέρουμε πώς αναπαριστάται το χρώμα στο μοντέλο κόκκινο - πράσινο - μπλε. Στο μοντέλο αυτό κάθε χρώμα είναι ένας γραμμικός συνδυασμός των τριών βασικών χρωμάτων: κόκκινο, πράσινο, μπλε. Το κάθε χρώμα παίρνει τιμές από 0 έως 255, δηλαδή 256 τιμές, άρα για να το αποθηκεύσουμε χρειαζόμαστε 28 τιμές = 8 bits = 1 byte. Οπότε και για τα τρία χρώματα χρειαζόμαστε 3 bytes. Αν επιπλέον αποθηκεύουμε και διαφάνεια (παράγοντας άλφα (Α) ) θα χρειαστούμε ένα byte επιπλέον. Τότε λέμε ότι έχουμε RGBA μοντέλο. Όσον αφορά τη χρήση διπλού buffer (double buffering), αυτό χρησιμοποιείται για να αποφύγουμε το «τρεμόπαιγμα» (flickering) της σκηνής όταν έχουμε κίνηση. Αυτό επιτυγχάνεται ως εξής: Έχουμε δύο buffers στους οποίους «ζωγραφίζουμε» τη σκηνή μας. Ο ένας δείχνεται στο χρήστη όσο εμείς ζωγραφίζουμε στον άλλο. Ύστερα με μια εντολή οι δύο buffer αλλάζουν ρόλους και εμείς ζωγραφίζουμε πλέον στον buffer που πριν από λίγο έβλεπε ο χρήστης. Με τη χρήση της τεχνικής αυτής το κάθε καρέ δείχνεται μόνο όταν είναι πλήρως ζωγραφισμένο. Ο χρήστης του προγράμματός μας δε βλέπει ποτέ ένα ημιτελές καρέ. glutinitwindowsize(x,y); Η glutinitwindowsize μας λέει πόσα pixel θα έχει πλάτος και ύψος το παράθυρο μας. glutinitwindowposition(x,y); Σελίδα 16 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης Με την glutinitwindowposition το τοποθετούμε στην οθόνη. Οι συντεταγμένες οθόνης ξεκινάνε από την πάνω αριστερά γωνία (0,0) και αυξάνονται προς τα κάτω και δεξιά, π.χ. (50,50). Αντίθετα στην OpenGL οι συντεταγμένες ξεκινάνε (0,0) στην κάτω αριστερή γωνία και αυξάνονται προς τα πάνω και δεξιά, όπως φαίνεται στο ακόλουθο σχήμα. Συντεταγμένες κατά ΟρβηΘΙ Εικόνα 1.3: Συντεταγμένες glutcreatewindow Τέλος, αφού έχουμε επιλέξει το μέγεθος και τη θέση του παραθύρου το δημιουργούμε με την glutcreatewindow. Το αλφαριθμητικό που παίρνει σαν παράμετρος είναι ο τίτλος που θα έχει το παράθυρο. glutmamloop0 Η συνάρτηση glutmainloop0 εκτελεί συνεχώς ένα βρόχο που τερματίζει όταν κλείσουμε το παράθυρο και στον οποίο καλούνται οι συναρτήσεις. glmatrixmode(gl_projection); glloadidentity(); Για να κατανοήσουμε τι κάνουν οι εντολές αυτές πρέπει πρώτα να εμβαθύνουμε λίγο στη λειτουργία του OpenGL. Το OpenGL αποθηκεύει πληροφορίες για τους μετασχηματισμούς ^ των αντικειμένων, ^ των υφών και ^ των προβολών Σελίδα 17 από 342

σε πίνακες. Με την εντολή glmatrixmode καθορίζουμε σε ποιον από τους πίνακες αυτούς θα αναφέρονται οι μετασχηματισμοί που θα ακολουθήσουν. Με το GL_PROJECTION αναφερόμαστε στον πίνακα για τους μετασχηματισμούς προβολών. Η εντολή glloadidentity φορτώνει το μοναδιαίο πίνακα στον πίνακα που αναφερόμαστε glcolor3f(x, y, z); Με την εντολή glcolor3f(1.0, 0.5, 0.2); θέτουμε το χρώμα που θέλουμε να χρησιμοποιήσουμε. Οι παράμετροι της glcolor3f είναι πραγματικοί αριθμοί από 0.0 έως 1.0 που καθορίζουν την ένταση των χρωμάτων κόκκινο, πράσινο, μπλε με τη σειρά που εμφανίζονται. 1.6 Πρωταρχικά Αντικείμενα Γραφικών (Graphics Primitives) Τα πιο απλά αντικείμενα γραφικών αποτελούν τα σημεία (points) και τα ευθύγραμμα τμήματα (lines). Με την σύνθεση των παραπάνω προκύπτουν πολύπλοκα αντικείμενα που αποτελούν, επίσης, πρωταρχικά αντικείμενα σχεδίασης. Για τον ορισμό και την σχεδίαση των αντικειμένων γραφικών χρησιμοποιείται η έννοια του vertex (κορυφή γεωμετρικού αντικειμένου) το οποίο δηλώνει ένα «ουσιώδες» σημείο για την περιγραφή του αντικειμένου glvertex*( ) Κάθε αντικείμενο γραφικών έχει κάποιες ιδιότητες με τις οποίες παρουσιάζεται στην οθόνη ή το διαχειρίζεται το σύστημα. Οι ιδιότητες αυτές υλοποιούνται μέσω ειδικών εντολών ή με την εντολή ενεργοποίησης glenable (και gldisable για απενεργοποίηση) Οι ιδιότητες των αντικειμένων, από τη στιγμή που θα δηλωθούν στο πρόγραμμα (με την εκτέλεση της αντίστοιχης εντολής), παραμένουν ενεργές έως ότου αλλαχθούν ή απενεργοποιηθούν από παρόμοιες εντολές. Σελίδα 18 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης Η σχεδίαση ενός ή περισσοτέρων αντικειμένων ταυτόχρονα γίνεται μέσα στο block σχεδίασης glbegin( GL_type) decleration_of_vertices glend() GL_type : Το είδος γραφικού που θα σχεδιαστεί decleration_of_vertices : ένα σύνολο από κορυφές (vertices) τα οποία δηλώνουν το αντικείμενο ή τα αντικείμενα προς σχεδίαση. Σελίδα 19 από 342

1.6.1 Στοιχειώδη αντικείμενα γραφικών GL_POINTS : Σχεδίαση σημείων. Ένα σημείο ορίζεται από ένα μοναδικό vertex και καταλαμβάνει στην οθόνη χώρο ίσο με ένα pixel. Άρα κάθε vertex στο block σχεδίασης ορίζει και ένα σημείο. ΙΔΙΟΤΗΤΕΣ ΣΗΜΕΙΩΝ glcolor*(_) : χρώμα glpointsize(glfloat x) : μέγεθος >>glenable(gl_point_smooth) : ομαλοποίηση GL_LINES: Σχεδίαση ευθυγράμμων τμημάτων (ή, απλά, γραμμή). Μια γραμμή ορίζεται από δύο vertices. Άρα, κάθε ζεύγος από vertices ορίζει και μια γραμμή. Παρακάτω βλέπουμε ένα παράδειγμά για το κάθε αντικείμενο. glbegin(gl_points); glvertex2i(10,10); glvertex2i(30,80); glvertex2i(90,10); glvertex2i(40,90); glvertex2i(90,110); glbegin(gl_lines); glvertex2i(10,10); glvertex2i(30,80); glvertex2i(90,10); glvertex2i(40,90); glvertex2i(90,110); glend(); glendo; Πίνακας 1.1: Παραδείγματα αντικειμένων ΙΔΙΟΤΗΤΕΣ ΓΡΑΜΜΩΝ glcolor*(_) : χρώμα gllinewidth*(glfloat) : χρώμα gllinestipple(glint factor, GLushort pattern)* : στυλ γραμμής * Απαιτείται η ενεργοποίηση : glenable(gl_line_stipple); >> gllinestipple(n, 255) : Διακεκομμένη γραμμή σε κλίμακα n. Σελίδα 20 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης 1.6.2 Σύνθετοι τύποι γραμμών GL_LINE_STRIP GL_LINE_LOOP 1.6.3 Πολύγωνα GL_TRIANGLES Επεξεργάζεται κάθε τρίστιχο των κορυφές ως ανεξάρτητο τρίγωνο. GL_QUADS Αντιμετωπίζει κάθε ομάδα από τις τέσσερις κορυφές ως ένα ανεξάρτητο τετράπλευρο. Vertices 4n - 3, 4n - 2, 4n - 1, και 4n ορίζουν τετράπλευρο n. N / 4 τετράπλευρα εξάγονται GL_POLYGON Σχεδιαζεται ένα ενιαίο, κυρτό πολύγωνο, αυτό το πολύγωνο καθορίζεται με κορυφές 1 έως Ν. ΤΡΟΠΟΣ ΣΧΕΔΙΑΣΗΣ glpolygonmode(glenum face, GLenum mode ) face : GL_FRONT για το μπροστινό μέρος του πολυγώνου GL_BACK για το πίσω μέρος του πολυγώνου, ή GL_FRONT_AND_BACK για το μπροστινό κ το πίσω μέρος του πολύγωνου mode: GL_POINT, GL_LINE, GL_FILL* *default value 1.6.4 Συνεχόμενη σχεδίαση (strips and fans) GL_TRIANGLE_FAN GL_QUAD_STRIP Σελίδα 21 από 342

Ρ1 Ρ2 Ρ3 Line Strip Ρ1 Ρ2 Ρ3 Line Loop Ρ2 Ρ4 Ρ6 Ρ8 Quadrilateral strip Σελίδα 22 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης Triangle Fan Ρ2 Ρ4 Ρ6 Ρ8 Triangle Strip Εικόνα 1.4: Συνεχόμενη σχεδίαση Σελίδα 23 από 342

OpenGL Primitives (σχεδιασμός καθορίζοντας κάθε κορυφή-vertex) Σελίδα 24 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης OpenGL Ρπηίίίνθβ 2 Εικόνα 1.6: OpenGL ΡΓΐηιίινθε 2 Σελίδα 25 από 342

Ένα τυπικό πρόγραμμα Στην παράγραφο αυτή παρουσιάζουμε και περιγράφουμε συνοπτικά τη δομή ενός τυπικού προγράμματος που βασίζεται στο πρότυπο της OpenGL. #include <glut.h> void display() glclearcolor(1,1,1,1); glclear(gl_color_buffer_bit); glbegin(gl_lines); glcolor3f(1,0,0); glvertex2i(20,20); glvertex2i(40,40); glend(); glflush(); int main(int argc, char** argv) glutinit(&argc,argv); glutinitwindowposition(50,50); glutinitwindowsize(640,480); glutinitdisplaymode(glut_single GLUT_RGB); glutcreatewindow(ma sample OpenGL application"); glmatrixmode(gl_projection); gluortho2d(0,50,0,50); glutdisplayfunc(display); glutmainloop(); return 0; Ας ξεκινήσουμε με την περιγραφή του κώδικα που περιέχεται στη συνάρτηση main. Σελίδα 26 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης Αρχικά προσθέτουμε την κεφαλίδα του GLUT glut.h. Γενικά, για την ανάπτυξη ενός προγράμματος που χρησιμοποιεί ρουτίνες της OpenGL, απαιτείται η προσθήκη των κεφαλίδων gl.h και glu.h, ενώ για χρήση του GLUT, απαιτείται η προσθήκη της glut.h. Ωστόσο, με τη δήλωση της κεφαλίδας glut.h δηλώνονται αυτομάτως και οι δύο προηγούμενες. Τι είναι το GLUT Η OpenGL όπως είπαμε είναι ένας γρήγορος και ευέλικτος τρόπος να επικοινωνούμε με το hardware γραφικών του υπολογιστή χωρίς να ενδιαφερόμαστε για τις λεπτομέρειες υλοποίησης του. Όμως δεν προσφέρει καθόλου λειτουργίες GUI (Graphical User Interface), δηλαδή δεν έχει την δυνατότητα να ανοίξει και να κλείσει παράθυρα στο λειτουργικό σύστημα, να ζωγραφίσει σε αυτά, ούτε να καταλάβει το πάτημα ενός πλήκτρου ή την κίνηση του ποντικιού, ούτε μπορεί να διαβάσει ένα αρχείο από το δίσκο. Αυτό έγινε επί σκοπού, μιας και η OpenGL σχεδιάστηκε να τρέχει σε πολλά λειτουργικά συστήματα τα οποία έχουν το δικό τους τρόπους επικοινωνίας με την οθόνη, το ποντίκι, το δίσκο, το πληκτρολόγιο. Για να γίνει αυτό θα πρέπει να χρησιμοποιήσουμε απευθείας τις εντολές του λειτουργικού μας συστήματος (Win32 εντολές στην περίπτωση των Windows). Εναλλακτικά μπορούμε να χρησιμοποιήσουμε μια από τις έτοιμες βιβλιοθήκες εντολών που υπάρχουν και που θα κάνουν αυτές τις λειτουργίες για εμάς εύκολα. Μια από τις πιο διαδεδομένες βιβλιοθήκες για αυτό το σκοπό είναι το GLUT (OpenGL Utility Toolkit) το οποίο είναι και αυτό σχεδιασμένο να τρέχει σε πολλά λειτουργικά συστήματα. Το GLUT προσφέρει ένα σύνολο εντολών που αναλαμβάνουν να ανοίξουν και να κλείσουν εύκολα παράθυρα, να καταγράψουν το πάτημα ενός πλήκτρου ή την κίνηση του ποντικιού. Δεν είναι κατάλληλο να γράψουμε μια κανονική εφαρμογή με αυτό (πχ ένα παιχνίδι) όμως είναι πολύ κατάλληλο για εκπαιδευτικές και πρότυπες εφαρμογές. [28] Σελίδα 27 από 342

Μορφή εντολών OpenGL/GLUT Η OpenGL χρησιμοποιεί μια απλή, στάνταρντ, μορφή ονοματολογίας για τις εντολές της. Όλες οι εντολές της έχουν μορφή παρόμοια με: glcolor3f... Βιβλίο θήιαι OpenGL Όνομα Αριθμός παράμετρο Τύπος παραμέτρου Εικόνα 1.7: Μορφή εντολών OpenGL/GLUT [28] Οι εντολές του GLUT δεν έχουν κάποιο ιδιαίτερο χαρακτηριστικό εκτός του ότι κάθε εντολή ξεκινά με το πρόθεμα glut: glutinitwindowsize(width, Height); Η συνάρτηση glutlnit ενεργοποιεί τη βιβλιοθήκη GLUT και μέσω αυτής μπορούμε να περάσουμε παραμέτρους στην εφαρμογή μας από τη γραμμή εντολών του DOS. Η ρουτίνα glutlnitwindowposition καθορίζει τη θέση στην οθόνη, στην οποία θα εμφανιστεί το παράθυρο της εφαρμογής (συντεταγμένη της άνω αριστερής κορυφής). Η εντολή glutlnitwindowsize καθορίζει το πλάτος και ύψος του παραθύρου της εφαρμογής σε pixels. Η εντολή glutlnitdisplaymode καθορίζει παραμέτρους σχετικές με τους ενταμιευτές και το χρωματικό μοντέλο που χρησιμοποιούνται κατά τη σχεδίαση. (Η τεχνική της διπλής ενταμίευσης χρησιμοποιείται κατά κόρον σε εφαρμογές κινουμένων γραφικών). Στο παράδειγμά μας χρησιμοποιούμε το χρωματικό μοντέλο RGB (GLUT_RGB) και την εφαρμογή απλής ενταμίευσης (GLUT_SINGLE). Η χρήση διπλού buffer (double buffering) κατά την απεικόνιση μιας σκηνής είναι μια βασική μέθοδος αποφυγής «τρεμοπαίγματος»(flickering). Ο τρόπος με τον οποίο δουλεύει είναι ορίζοντας 2 ενδιάμεσες περιοχές στην Σελίδα 28 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης μνήμη (buffers) στις οποίες αποθηκεύουμε τις εικόνες που δημιουργούμε. Όσο η οθόνη παίρνει (απεικονίζει) την εικόνα από τον έναν buffer εμείς ζωγραφίζουμε την σκηνή στον άλλον. Έπειτα ανταλλάσουμε τους ρόλους των buffer και συνεχίζουμε. Έτσι η οθόνη δείχνει πάντα μια ολοκληρωμένη εικόνα της σκηνής. Η εντολή glutcreatewindow εμφανίζει το παράθυρο της εφαρμογής στην οθόνη και του αποδίδει έναν τίτλο. Με την εντολή glmatrixmode(gluint mode) επιλέγουμε το μητρώο το οποίο επιθυμούμε να τροποποιήσουμε. (περισσότερα για τα μητρώα στις ενότητες «Μετασχηματισμοί συντεταγμένων» και «Προβολές») Στο παράδειγμα, δίνοντας ως όρισμα τη σταθερά GL_PROJECTION επιλέγουμε το μητρώο προβολής, το οποίο καθορίζει τον τρόπο με τον οποίο προβάλλεται η σκηνή στο επίπεδο του θεατή. Σε συνδυασμό με την εντολή gluortho2d( xmin,xmax,ymin,ymax) διευκρινίζουμε ότι θα απεικονιστεί η παράλληλη προβολή της σκηνής στο επίπεδο ΧΥ (το οποίο, στο συγκεκριμένο παράδειγμα, ταυτίζεται με το παράθυρο της εφαρμογής). Το περιεχόμενο του παραθύρου περιλαμβάνει όλα τα στοιχεία του σκηνικού που εκτείνονται μεταξύ των συντεταγμένων Χ=[- 50,50] και Υ=[-50,50]. Ο θετικός άξονας X έχει φορά προς τα δεξιά και το θετικό τμήμα του άξονα Y έχει φορά προς τα πάνω. Η εντολή glutdisplayfunc(void func()) εντάσσεται σε μια ειδική κατηγορία συναρτήσεων του GLUT, οι οποίες αποκαλούνται συναρτήσεις κλήσης (callback functions). Η συγκεκριμένη συνάρτηση δέχεται ως όρισμα μια συνάρτηση στην οποία εμπεριέχεται ο κώδικας σχεδίασης γραφικών. Η συνάρτηση αυτή εκτελείται κάθε φορά που η εφαρμογή διαπιστώσει ότι απαιτείται επανασχεδιασμός της σκηνής. Η συνάρτηση δεν επιστρέφει τιμή και δεν έχει ορίσματα. Στο συγκεκριμένο παράδειγμα δίνουμε ως όρισμα τη συνάρτηση display(). Η εντολή glutmainloop() ενεργοποιεί τον κύκλο διαχείρισης γεγονότων (event processing loop). Στον κύκλο αυτό, η εφαρμογή αναμένει επ' άπειρον και ανταποκρίνεται σε γεγονότα, όπως λ.χ. στο πάτημα ενός κουμπιού, στην αλλαγή του σκηνικού ή στην κίνηση του Σελίδα 29 από 342

ποντικιού. Από το πρόθεμά της, παρατηρούμε ότι η συγκεκριμένη εντολή εμπεριέχεται στη βιβλιοθήκη GLUT, εφόσον το πρότυπο της OpenGL, ως πρότυπο ανεξάρτητο πλατφόρμας, δεν ορίζει διαδικασίες εισόδου-εξόδου. Ας αναλύσουμε τώρα το περιεχόμενο της συνάρτησης display. Η εντολή glclearcolor() καθορίζει το χρώμα που χρησιμοποιείται κάθε φορά που εκτελείται εντολή καθαρισμού της οθόνης. Στην OpenGL το χρώμα του φόντου είναι μία μεταβλητή κατάστασης, η οποία διατηρεί την τιμή που της ανατέθηκε την τελευταία φορά. Το χρώμα καθορίζεται από τα βάρη του στο χρωματικό μοντέλο RGB. Στο συγκεκριμένο παράδειγμα, χρησιμοποιείται το λευκό χρώμα. Η εντολή glclear() καθαρίζει ενταμιευτές (buffers), συγκεκριμένες περιοχές μνήμης του συστήματος γραφικών (frame buffer). Η μηχανή γραφικών της OpenGL ορίζει ορισμένες κατηγορίες ενταμιευτών. Με την σταθερά GL_COLOR_BUFFER_BIT δίνουμε εντολή καθαρισμού του ενταμιευτή χρωματικών τιμών (colour buffer). Αυτή περιέχει τις χρωματικές τιμές των pixels που απεικονίζονται (ή πρόκειται να απεικονιστούν) στην οθόνη. Με την εντολή glcolor3f(float r, float g, float b) ορίζουμε το τρέχον χρώμα σχεδιάσης. Πρόκειται για μία ακόμη μεταβλητή κατάστασης που καθορίζει το χρώμα που χρησιμοποιείται για τη σχεδίαση γραφικών. Στην εντολή περνάμε ως ορίσματα τις κανονικοποιημένες ως προς τη μονάδα τιμές των συνιστωσών του κόκκινου, πράσινου και μπλέ χρώματος. Στο παράδειγμα επιλέγουμε ως χρώμα σχεδιάσης το κόκκινο. Η εντολή glbegin(glenum MODE) δηλώνει την έναρξη ορισμού ενός ή περισσοτέρων γεωμετρικών σχημάτων. Αναλόγως του ορίσματος, μπορεί να προσδιοριστεί μια ποικιλία σχημάτων. Στο παράδειγμά μας, ορίζουμε ευθύγράμμα τμήματα. Η εντολή glbegin εκτελείται πάντα σε συνδυασμό με την εντολή glend() και η δεύτερη ορίζει τη λήξη της επιλεγόμενης ρύθμισης σχεδίασης. Η εντολή glvertex2i ορίζει σημεία στο διδιάστατο χώρο. Εφόσον έχει προεπιλεγεί η κατάσταση σχεδίασης ευθυγράμμων τμημάτων, τα σημεία ορίζουν ανά ζεύγη τα ευθύγραμμα τμήματα Το παραπάνω Σελίδα 30 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης παράδειγμα σχεδιάζει ένα ευθύγραμμο τμήμα κόκκινου χρώματος με συνταταγμένες αρχής και τέλους (20,20) (40,40). Η εντολή glflush() εξαναγκάζει την εκτέλεση των εντολών που εκκρεμούν. Η εκτέλεση του κώδικα εμφανίζει το παράθυρο του παρακάτω σχήματος. Αφού περιγράψαμε επακριβώς την OpenGL και την χρησιμότητά της δίνοντας και ένα μικρό παράδειγμα, καταλαβαίνουμε ότι είναι ένα πρότυπο υλοποίησης βιβλιοθηκών σχεδίασης γραφικών την οποία την χρησιμοποιούμε ακόμη και για την σχεδίαση video games. Όμως αυτό δεν είναι αρκετό για να κατανοήσουμε και να μάθουμε αρκετά στοιχεία γι αυτήν οπότε είναι αναγκαίο στο επόμενο κεφάλαιο να γνωρίσουμε τους μετασχηματισμούς αντικειμένων. Σελίδα 31 από 342

Κεφάλαιο 2 Μετασχηματισμοί Αντικειμένων 2.1 Γεωμετρικοί Μετασχηματισμοί Αντικειμένων Ένας γεωμετρικός μετασχηματισμός μπορεί να περιγραφεί με έναν μετασχηματισμό συστήματος συντεταγμένων και προβολής του στο αρχικό καρτεσιανό σύστημα. Θεωρούμε δηλαδή, τις τιμές των καρτεσιανών συντεταγμένων ως τιμές ενός συστήματος καμπυλόγραμμων συντεταγμένων. Καρτεσιανό σύστημα (χ,γ,ζ) ^ (%,q2,%) Καμπυλόγραμμο σύστημα χ = /Μ»q2, «Λ γ = ^ ζ = ^ Σχήμα 2.1: Καρτεσιανό σύστημα Κάθε ομαλό καμπυλόγραμμο σύστημα μπορεί τοπικά να προσεγγιστεί με ένα «πλαγιογώνιο» σύστημα που ορίζεται με γραμμικές συναρτήσεις ί\, ί=1,2,3 (Γραμμικός Μετασχ.) χ ' = αηχ + α12γ + α13ζ γ ' = α 2ιΧ + α22γ + α23ζ αϋ Φ ο ο η Β ΐ ζ ' = α31χ + α32γ + α33ζ Σελίδα 32 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης (x,y,z) (x,y,z ) Σχήμα 2.2: καμπυλόγραμμο σύστημα 2.2 Α φ ινικο ί Μετασχηματισμοί (Affine Transformations) Ένας αφινικός μετασχηματισμός είναι ένας γραμμικός μετασχηματισμός συνοδευόμενος και από μια μετατόπιση χ ' = αηχ + a^y + αηζ + δχ y ' = α21χ + a22y + α23ζ + δ y ζ ' = α31χ + a32y + α33ζ + δζ ή σε μορφή πινάκων ( χ ' ϊ αΐ1 α12 α13 ( χ ϊ ' δχ Λ y ' = α21 α22 α23 y + δy νζ '> Vα31 α32 α33 y ν ζ. νδζ y r ' = Ar + δ Αν δ=(0,0,0)τ και Α=Ι, τότε παίρνουμε τον ταυτοτικό μετασχηματισμό (identity) ( χ ' > r 1 0 0 ^r χ > r 0 ^ y ' = 0 1 0 y + 0 νζ ' y V0 0 1y νζ y ν 0 y χ ' = χ ^ y ' = y ζ ' = ζ Σελίδα 33 από 342

Αν δ=(δχ,δγ,δζ)τ και A=I, τότε παίρνουμε μόνο μετατόπιση (Translation) ( χ' 1 y ' Vζ ' y (1 0 0 V x1 ( δχ1 0 1 0 y ν 0 0 1 y ν ζ y νδζ y + χ' = χ + δχ y 1= y + ^ ζ ' = ζ + δζ Αν δ=(0,0,0)τ και Α=άί8 9 8,ό,ο, τότε παίρνουμε τον μετασχηματισμό κλίμακας (scaling) ( χ ' > (α 0 0^ ( χ ^ ( 0 1 y' = 0 b 0 y + 0 νζ ' y ν 0 0 c y νζ y ν 0 y χ' = αχ ^ y ' = by ζ ' = cz 2.3 Ορθογώνιοι Μετασχηματισμοί Ορθογώνιος μετασχηματισμός ή περιστροφή (rotation) είναι ο αφινικός μετασχηματισμός με δ=(0,0,0)τ και Α ένας ορθογώνιος πίνακας A T A = A A T = I (A T = A _1) Ένας ορθογώνιος μετασχηματισμός συστήματος συντεταγμένων διατηρεί 1. την αρχή των αξόνων ( (0,0,0) fixed point) 2. την καθετότητα των αξόνων 3. την κλίμακα e' H e, = 1, V / = 1,2,3 Σελίδα 34 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης ^ χ ^ y' ν z J αΐ1 αΐ2 αΐ3 λ ί νλ α2ΐ a22 a23 y ν ^ j ν z j a = e ' i e j = coso) ή a12 = e' v e. = cos(ox'oy), a23 = e' ; e. = cos(oy'oz), κλπ Σχήμα 2.3: Ορθογώνιοι μετασμηματισμοί Ο πίνακας Α, στην περίπτωση περιστροφής συμβολίζεται με Κ Περιστροφή γύρω από τους άξονες Οχ, Ον και Οζ κατα γωνία θ f cos# - s in # 0 > f 1 0 0 > f cos# 0 s in # ^ R z = s in # cos# 0, R χ = 0 cos# - s in # > Ry = 0 1 0 ν 0 0 1J ν 0 s in# cos# j v- s in # 0 c o s # J Οι ορθογώνιοι μετασχηματισμοί μαζί με τις μετατοπίσεις ονομάζονται μετασχηματισμοί στερεού σώματος. 2.4 Ομοιογενής Φορμαλισμός (homogeneous coordinates) Για να εφαρμόσουμε έναν αφινικό μετασχηματισμό απαιτείται ο ορισμός δύο πινάκων, του Α και του δ, και δύο πράξεις, πολλαπλασιασμός και πρόσθεση πινάκων. Ο ομοιογενής φορμαλισμός συνίσταται στο να δηλώσουμε έναν αφινικό μετασχηματισμό «αντικειμένων» με έναν πίνακα Μ p = Mp Σελίδα 35 από 342

Σχήμα 2.3 Έστω το διάνυσμα ν και το σημείο Ρ. Και τα δύο αντικείμενα ορίζονται με τον ίδιο τρόπο ν = (χ, γ ) ρ = (χ, γ) Σε μια μετατόπιση του συστήματος συντεταγμένων το διάνυσμα ν παραμένει αναλλοίωτο όμως το Ρ μεταφέρεται στη θέση Ρ =(χ,γ )^Ρ(χ,γ). Για να διαχωρίσουμε την παραπάνω ασάφεια ορίζουμε τα διανύσματα και τα σημεία (στον 3ϋ χώρο) με τις τετράδες ν = (χ, γ, ζ, 0), Ρ = (χ, γ, ζ,1) Έτσι στην περίπτωση αυτή διανύσματα ή σημεία μπορούν να μετασχηματίζονται ως ρ' = Μρ ^ ( απ α12 α13 α14 ν χ Λ γ ζ Vί ) V 0 α21 α22 α23 α24 α α α α 0 0 γ ζ 1 Α 1) ρ ξ ν ογ Ρ ί = 0,1 Με τον παραπάνω φορμαλισμό μπορούμε να εκτελέσουμε κάθε αφινικό μετασχηματισμό. Πχ Σελίδα 36 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης Translation Scaling x-rotation (1 0 0 δχ ^ ( a 0 0 0 > (1 0 0 0 Λ 0 1 0 0 b 0 0 0 cos# - sin# 0 T =, S =, Rx = 0 0 1 δz 0 0 c 0 0 sin# cos# 0 ν 0 0 0 1 7 ν 0 0 0 17 ν 0 0 0 17 Ο 4x4 πίνακας Μ ονομάζεται "Modelview Matrix και έχει 12 βαθμούς ελευθερίας. Είναι δυνατό τα μηδενικά της τελευταίας στήλης να αντικατασταθούν από μη-μηδενικές τιμές (16 βαθμοί ελευθερίας). Τότε όμως δεν θα έχουμε αφινικό μετασχηματισμό. Σύνθεση Μετασχηματισμών (Concatenation) Έστω ότι εκτελούμε δύο μετασχηματισμούς Τι, Τ2 με αυτή τη σειρά και με πίνακες Α και Β, αντίστοιχα T :(χ, y, z) <χ', y ', z ') T2 :( x ', y ', z ') (x ", y ", z ") Στον συνολικό μετασχηματισμό Τ αντιστοιχεί ο πίνακας M = B A Προσοχή : οι πίνακες πολλαπλασιάζονται με την ανάποδη σειρά. Στον προγραμματισμό της OpenGL, οι μετασχηματισμοί δηλώνονται επίσης με την ανάποδη σειρά. Εν γένει δεν ισχύει η αντιμεταθετικότητα B A φ A B Σε κάθε μετασχηματισμό με πίνακα Μ ορίζεται και ο αντίστροφος με Λ πίνακα Μ-1. Έτσι Μ 1 Μ = Ι Σελίδα 37 από 342

Αντίστροφοι Αφινικοί Μετασχηματισμοί T = T (δχ,δγ,δζ) ^ T-1 = T (-δχ, -δ y, -δζ ) S = S(a, b, c) ^ S-1 = S(1/a,1/ b,1/c) R = R(0) ^ R- = R(-&) Με παρόμοιο τρόπο ορίζεται η σύνθεση περισσοτέρων μετασχηματισμών και ισχύει η προσετεριστικότητα, πχ M = C (A B) = (C B) A = C B A Ειδικές περιπτώσεις Περιστροφής 1. Γενική Περιστροφή γύρω από το (0,0,0): Σύνθεση περιστροφών γύρω από τους τρεις άξονες 2. Περιστροφή γωνίας θ γύρω από τυχαίο άξονα (ευθεία) που περνάει από την αρχή των αξόνων (0,0,0) Αν ν διάνυσμα επί του άξονα περιστροφής τότε I. Περιστροφή Κγ(ω) II. Περιστροφή Κχ(φ) >> Ζ' // V III. Περιστροφή Κ2(θ) >>Απαλοιφή (αντιστροφή) των πρώτων περιστροφών Σχήμα 2.4: Σύνθεση περιστροφών γύρω από τους τρεις άξονες Σελίδα 38 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης IV. Περιστροφή Ηχ(-φ) V. Περιστροφή Πγ(-ω) Άρα συνολικά έχουμε Κ-ν =Κ, (~ω) Κχ (Ψ β) ** Ψ) (ω) Αν ν = (νχ, ν,, νζ) τότε ν ' = (νχ,0, νζ) και ^ ν. ^ ω = ατοοοβ ν2 + ν.2 ^ φ = ζτοοοζ^ νιν ιιν ι; 3. Περιστροφή γωνίας θ γύρω από τυχαίο άξονα (ευθεία) που περνάει από τυχών σημείο Ρ=(ρι,Ρ2,Ρ3) Εφαρμόζουμε μια μετατόπιση Τ ώστε να φέρουμε το σημείο Ρ=(Ρι,Ρ2,Ρ3) στο (0,0,0). Εφαρμόζουμε την περιστροφή ^ γύρω από τον άξονα Λ Απαλειφουμε την αρχική μετατόπιση με την Τ-1. Άρα συνολικά έχουμε ΚΡ= Τ(Ρΐ, Ρ2, ρ3) Ρ (β) Τ(-ν, - Ρ2, - Ρ3 ) Στο δεύτερο κεφάλαιο το οποίο είναι και αυτό θεωρητικό είδαμε τους μετασχηματισμούς αντικειμένων, για την ακρίβεια τους γεωμετρικούς μετασχηματισμούς όπου αναλύθηκε το καρτεσιανό σύστημα. Στη συνέχεια πήγαμε στον αφινικό μετασχηματισμό ο οποίος είναι γραμμικός και συνοδεύετε και από μια μετατόπιση. Μετά γνωρίσαμε τους ορθογώνιους μετασχηματισμούς ή αλλιώς περιστροφή και τον ομοιογενή φορμαλισμό. Στο κεφάλαιο που ακολουθεί θα αναλυθούν οι μετασχηματισμοί στην ΟΡβηΘΙ συγκεκριμένα. Σελίδα 39 από 342

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

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης συντεταγμένων της σκηνής (κόσμου). Στην γενική ορολογία γραφικών αυτό το μετασχηματισμό το ονομάζουμε μετασχηματισμό κόσμου. Ο μετασχηματισμός που καθορίζει τι είναι ορατό στο σύστημα συντεταγμένων κάμερας (view space) και τι είδους προβολή επιθυμούμε (με προοπτική ή όχι) ονομάζεται μετασχηματισμός προβολής (projection transformation). Η OpenGL συνδυάζει του πίνακες μετασχηματισμού μοντέλου και μετασχηματισμού κάμερας σε έναν μόνο πίνακα, τον μετασχηματισμό Μοντέλου-Κάμερας (ModelView matrix). Με αυτό το μετασχηματισμό μπορούμε να τοποθετήσουμε ένα αντικείμενο κατευθείαν στο χώρο της κάμερας (χωρίς να περάσουμε από το σύστημα συντεταγμένων κόσμου). Μπορούμε να κατασκευάσουμε τον μετασχηματισμό Μοντέλου-Κάμερας με τέτοιο τρόπο ώστε να περιέχει κάθε περιστροφή, μετακίνηση και κλίμακα του αντικειμένου. [28] 3.1 Μετακίνηση Η μετακίνηση (translation) ενός αντικειμένου γίνεται με την εντολή glt ranslatef(glfloat X, GLfloat Y, GLfloat Z); H εντολή αυτή παίρνει ως παραμέτρους την μετακίνηση που επιθυμούμε κατά άξονα, κατασκευάζει ένα μετασχηματισμό μετακίνησης Τ (όπως είδαμε στην θεωρία) και τον εφαρμόζει (πολ/ζει) με τον μετασχηματισμό Μοντέλου-Κάμερας. 3.2 Περιστροφή Η περιστροφή (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] για το περιστροφή γύρω από τον Ζ. Σελίδα 41 από 342

3.3 Κλίμακα Η μεγέθυνση/σμίκρυνση (scaling) ενός αντικειμένου γίνεται με την εντολή glscalef(glfloat x, GLfloat y, GLfloat z); όπου x, y, z η κλίμακα του αντικειμένου ανά άξονα. 3.4 Τοποθέτηση κάμερας Η 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,0,0 0,1,0); 3.5 Εφαρμογή των μετασχηματισμών στην OpenGL Αναφέραμε ότι η OpenGL χρησιμοποιεί μόνο ένα πίνακα, τον ModelView, για να εφαρμόσει όλους τους μετασχηματισμούς μετακίνησης, περιστροφής και κλίμακας που είδαμε. Ο πίνακας αυτός αποθηκεύεται στην μνήμη της OpenGL και παραμένει ο ίδιος μέχρι να τον αλλάξουμε με μια άλλη εντολή. Το σύνολο όλων των μεταβλητών/παραμέτρων που διατηρεί η OpenGL για την λειτουργία της ονομάζεται μηχανή καταστάσεων (state machine). Με αυτό τον τρόπο λειτουργίας μια τιμή που θέτουμε σε μια μεταβλητή παραμένει σε ισχύ μέχρι να την αλλάξουμε ξανά. Σελίδα 42 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης Επειδή η 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), κατασκευάζουμε και Σελίδα 43 από 342

εφαρμόζουμε μια μετακίνηση T κατά -6 κατά μήκος του άξονα Ζ και μια περιστροφή R, 45 μοίρες γύρω από τον άξονα Y. O τελικός μετασχηματισμός ModelView θα είναι : ModelView = R * T * View Η OpenGL εφαρμόζει τους μετασχηματισμούς στο αντικείμανο με αντίστροφη σειρά από ότι τους δηλώνουμε στο πρόγραμμα. Στο παραπάνω παράδειγμα το αντικείμανο πρώτα θα περιστραφεί, μετά θα μετακινηθεί και μετά θα μεταφερθεί στο χώρο της κάμερας. Αν θεωρήσουμε ένα σημείο Ρ του αντικειμένου, τότε ο μετασχηματισμός αυτός θα εφαρμοστεί ως: P = P * ModelView = P * R * T * View 3.6 Στοίβα πινάκων Είπαμε ότι ό,τι μετασχηματισμό κατασκευάζουμε με τις εντολές gltranslation, glrotation και glscale συσσωρεύεται (με πολλ/μό) στο πίνακα ModelView, o οποίος με την σειρά του μετασχηματίζει όλα τα αντικείμενα της σκηνής. Υπάρχουν περιπτώσεις που πριν «προσθέσουμε» ένα νέο μετασχηματισμό στο ModelView (μια περιστροφή που ίσως αφορά ένα μόνο αντικείμενο και όχι όλη τη σκηνή) θέλουμε να τον αποθηκεύσουμε κάπου προσωρινά ώστε μετά να τον ανακτήσουμε αναλλοίωτο από τον νέο μετασχηματισμό. Η OpenGL προσφέρει ένα τέτοιο μηχανισμό και ονομάζεται στοίβα πινάκων (matrix stack). Η στοίβα είναι μια δομή δεδομένων που μας επιτρέπει μέσω εντολών Push και Pop να προσθέσουμε και να αφαιρέσουμε ένα στοιχείο από την κορυφή της στοίβας (και μόνο). Στην OpenGL οι εντολές που αποθηκεύουν και ανακτούν τον ModelView στην κορυφή της στοίβας είναι οι: glpushmatrix(); glpopmatrix(); Σχηματικά αυτό φαίνεται ως εξής: Σελίδα 44 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης ν.αίτιχ ϋϊκΐί Εικόνα 3.2: Στοίβα πινάκων Παράδειγμα, αν θέλουμε να ζωγραφίσουμε 2 αντικείμενα αφού πρώτα τα μετακινήσουμε το πρώτο κατά -6 κατά μήκος του άξονα Ζ και το δεύτερο κατά 10 κατά τον άξονα Υ τότε: glmatrixmode(gl_modelview); glloadidentityo; glulookat(10,10,10, 0,0,0, 0,1,0); glpushmatπx0; gltranslate(0, 0, -6); DrawModel_1 (); glpopmatπx0; gltranslate(0, 10, 0); DrawModel_2Q; Στο παράδειγμα αφού ορίσουμε τον μετασχηματισμό κάμερας με την εντολή glulookatq αποθηκεύουμε τον ModelView στην στοίβα με την εντολή glpushmatπx0. Έπειτα μετακινούμε το πρώτο αντικείμενο κατά -6 κατά μήκος του άξονα Ζ και το ζωγραφίζουμε. Στην συνέχεια ανακτούμε από την στοίβα τον ModelView (που δεν περιέχει την μετακίνηση κατά -6) με την εντολή glpopmatπxq. Τέλος μετακινούμε το δεύτερο αντικείμενο κατά 10 κατά τον άξονα Υ και το ζωγραφίζουμε. Αν υποθέσουμε ότι δεν χρησιμοποιούμε την στοίβα για να αποθηκεύσουμε τον ModelView: Σελίδα 45 από 342

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 χρήση της στοίβας είναι βασική λοιπόν για την σωστή τοποθέτηση των αντικειμένων στην σκηνή. 3.7 Μετασχηματισμός προβολής Με τον μετασχηματισμό προβολής (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 καθορίζει τον αναλογία μήκους/πλάτους του Σελίδα 46 από 342

Πτυχιακή εργασία της Περιστερίδου Καλλιόπης κοντινού πεδίου αποκοπής και οι znear και zfar την απόσταση του κοντινού (near) και μακρινού (far) πεδίου αποκοπής κατά τον άξονα Ζ. Σχηματικά η προβολή με προοπτική ορίζεται ως: Εικόνα 3.3: Μετασχηματισμός προβολής Η OpenGL αποθηκεύει τον πίνακα προβολής στον πίνακα GL_PROJECTION. Για να τον ενεργοποιήσουμε χρησιμοποιούμε και πάλι την εντολή glmatrixmodeq Παράδειγμα: 9ΐΜ8ίπχΜοόΘ(ΟΙ ΡΡΟύΕΟΤΙΟΝ); ςιιοαόιόθημγο; 9^ΡΘΐΈρΘ^ίνΘ(45, 4/3, 1, 400); Στο κεφάλαιο που μόλις τελείωσε αναφέρθηκαν οι μετασχηματισμοί στην ΟρΘηϋΙ, συγκεκριμένα κάποιες από τις ενότητες του κεφαλαίου ήταν η μετακίνηση την οποία επιθυμούμε κατά άξονα και την εντολή που χρησιμοποιούμε, την περιστροφή ενός αντικειμένου, την κλίμακα, την τοποθέτηση της κάμερας στην σκηνή και να θέσουμε την κατεύθυνση που επιθυμούμε και κάποια άλλα. Καθώς φεύγουμε από το κεφάλαιο τρία και προσχωρούμε στο τέταρτο θα αναφέρουμε τις υφές, την απεικόνιση, καθώς και που μας είναι χρήσιμη στο κτίσιμο ενός προγράμματος. Σελίδα 47 από 342