Mars2030 Thesis Booklet

111
Πτυχιακή εργασία του Γκουντή Άγγελου Πτυχιακή εργασία του Γκουντή Άγγελου ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΕΝΤΡΙΚΗΣ ΜΑΚΕΔΟΝΙΑΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΕΝΤΡΙΚΗΣ ΜΑΚΕΔΟΝΙΑΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΗΣ ΒΙΝΤΕΟΠΑΙΧΝΙΔΙΟΥ ΜΕ ΧΡΗΣΗ ΜΗΧΑΝΗΣ ΠΑΙΧΝΙΔΙΩΝ ΚΑΤΑΣΚΕΥΑΣΜΕΝΗΣ ΑΠΟ ΤΟ ΜΗΔΕΝ ΣΕ ΓΛΩΣΣΑ C++ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΗΣ ΒΙΝΤΕΟΠΑΙΧΝΙΔΙΟΥ ΜΕ ΧΡΗΣΗ ΜΗΧΑΝΗΣ ΠΑΙΧΝΙΔΙΩΝ ΚΑΤΑΣΚΕΥΑΣΜΕΝΗΣ ΑΠΟ ΤΟ ΜΗΔΕΝ ΣΕ ΓΛΩΣΣΑ C++ Επιβλέπων Δρ Α Νικολαΐδης, Επίκουρος Καθηγητής : . . ΣΕΡΡΕΣ ΣΕΠΤΕΜΒΡΙΟΣ , 2015 Επιβλέπων Δρ Α Νικολαΐδης, Επίκουρος Καθηγητής : . . ΣΕΡΡΕΣ ΣΕΠΤΕΜΒΡΙΟΣ , 2015

Transcript of Mars2030 Thesis Booklet

Page 1: Mars2030 Thesis Booklet

Πτυχιακή εργασία του Γκουντή ΆγγελουΠτυχιακή εργασία του Γκουντή Άγγελου

ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΕΝΤΡΙΚΗΣΜΑΚΕΔΟΝΙΑΣ

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

ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΕΝΤΡΙΚΗΣΜΑΚΕΔΟΝΙΑΣ

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΗΣΒΙΝΤΕΟΠΑΙΧΝΙΔΙΟΥΜΕ ΧΡΗΣΗΜΗΧΑΝΗΣΠΑΙΧΝΙΔΙΩΝ ΚΑΤΑΣΚΕΥΑΣΜΕΝΗΣ ΑΠΟ ΤΟ

ΜΗΔΕΝ ΣΕ ΓΛΩΣΣΑ C++

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΗΣΒΙΝΤΕΟΠΑΙΧΝΙΔΙΟΥΜΕ ΧΡΗΣΗΜΗΧΑΝΗΣΠΑΙΧΝΙΔΙΩΝ ΚΑΤΑΣΚΕΥΑΣΜΕΝΗΣ ΑΠΟ ΤΟ

ΜΗΔΕΝ ΣΕ ΓΛΩΣΣΑ C++

Επιβλέπων Δρ Α Νικολαΐδης, Επίκουρος Καθηγητής: . .ΣΕΡΡΕΣ ΣΕΠΤΕΜΒΡΙΟΣ, 2015

Επιβλέπων Δρ Α Νικολαΐδης, Επίκουρος Καθηγητής: . .ΣΕΡΡΕΣ ΣΕΠΤΕΜΒΡΙΟΣ, 2015

Page 2: Mars2030 Thesis Booklet

2

Υπεύθυνη δήλωση

Υπεύθυνη Δήλωση: Βεβαιώνω ότι είμαι συγγραφέας αυτής της πτυ-

χιακής εργασίας και ότι κάθε βοήθεια την οποία είχα για την προετοιμασία

της, είναι πλήρως αναγνωρισμένη και αναφέρεται στην πτυχιακή εργασία.

Επίσης έχω αναφέρει τις όποιες πηγές από τις οποίες έκανα χρήση δεδομέ-

νων, ιδεών ή λέξεων, είτε αυτές αναφέρονται ακριβώς είτε παραφρασμένες.

Επίσης βεβαιώνω ότι αυτή η πτυχιακή εργασία προετοιμάστηκε από εμένα

προσωπικά ειδικά για τις απαιτήσεις του προγράμματος σπουδών του Τμή-

ματος Μηχανικών Πληροφορικής ΤΕ του Τ.Ε.Ι. Κεντρικής Μακεδονίας.

Page 3: Mars2030 Thesis Booklet

3

Σύνοψη

Η παρούσα πτυχιακή εργασία αναλύει τη δημιουργία ενός βιντεοπαιχνι-

διού χρησιμοποιώντας μια μηχανή γραφικών κατασκευασμένη από μηδενική

βάση σε γλώσσα C++.

Κατά τη διάρκεια αυτής της ανάλυσης, αναλύονται επίσης και διάφορες

έννοιες της επιστήμης των γραφικών και των μαθηματικών, που εφαρμόζο-

νται κυρίως στους H/Y και χρησιμοποιήθηκαν για τη δημιουργία της μηχανής

γραφικών του βιντεοπαιχνιδιού.

Ειδικότερα περιγράφεται η έννοια των γραφικών αλλά και πιο συγκε-

κριμένα η εφαρμογή τους στους H/Y. Περιγράφονται επίσης η ανοιχτή βι-

βλιοθήκη γραφικών (OpenGL) από άποψη εννοιολογική αλλά και τεχνική.

Δίνεται βάση στην επεξήγηση μιας από τις πιο σημαντικές διαδικασίες που

μεσολαβούν για την τελική απόδοση των γραφικών, η οποία είναι το πέρα-

σμα των δεδομένων μέσα από το pipeline απόδοσης των γραφικών. Ανα-

φέρεται εκτενώς στη μαθηματική πλευρά των μετασχηματισμών που χρησι-

μοποιούνται για να μετακινήσουν, να περιστρέψουν, να κλιμακώσουν αλλά

και να προβάλλουν τα γραφικά στην οθόνη. Αναφέρεται σε διάφορα μοντέλα

σκίασης, όπως η επίπεδη και η ομαλή καθώς και στον αλγόριθμο δημιουρ-

γίας δυναμικών σκιών, χρησιμοποιώντας τον απομονωτή Z. Επεξηγείται η

χρήση της χαρτογράφηση κύβου για τον υπολογισμό αντανακλάσεων του

περιβάλλοντος πάνω σε αντικείμενα αλλά και για τη δημιουργία skyboxes.

Στη συνέχεια αναλύεται εκτενώς το βιντεοπαιχνίδι και η μηχανή γραφικών

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

τητας Oculus Rift και σε επίπεδο υλικού αλλά και σε επίπεδο εννοιών της

στερεοσκοπικής απόδοσης των γραφικών.

Page 4: Mars2030 Thesis Booklet

4

Περιεχόμενα

Υπεύθυνη δήλωση 2

Σύνοψη 3

Ορισμοί 10

1 Εισαγωγή στην έννοια των γραφικών 11

1.1 Τι Είναι Γραφικά; . . . . . . . . . . . . . . . . . . . . . . . . . 11

1.2 Γραφικά Ηλεκτρονικών Υπολογιστών (Computer Graphics). . 11

1.3 Τα Είδη των Γραφικών . . . . . . . . . . . . . . . . . . . . . . 12

1.3.1 Δισδιάστατα Γραφικά (2D Computer Graphics). . . . . 12

1.3.2 Τέχνη με Εικονοστοιχεία (Pixel Art) . . . . . . . . . . . 13

1.3.3 Διανυσματικά Γραφικά (Vector Graphics) . . . . . . . . 13

1.3.4 Τρισδιάστατα Γραφικά (3D Graphics) . . . . . . . . . . 14

2 Η Ανοιχτή Βιβλιοθήκη Γραφικών (OpenGL) 16

2.1 Τι είναι η Ανοιχτή Βιβλιοθήκη Γραφικών; . . . . . . . . . . . . 16

2.2 Σχεδιασμός . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.3 Ανάπτυξη λογισμικού με την OpenGL . . . . . . . . . . . . . . 18

2.4 Η Ανοιχτή Βιβλιοθήκη Γραφικών ως Μηχανή Καταστάσεων

(State Machine). . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3 Το Pipeline Απόδοσης των Γραφικών 21

3.1 Εισαγωγικά Στοιχεία . . . . . . . . . . . . . . . . . . . . . . . 21

3.2 Η Αρχιτεκτονική . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.3 Το στάδιο της εφαρμογής . . . . . . . . . . . . . . . . . . . . . 23

Page 5: Mars2030 Thesis Booklet

5

3.4 Το Στάδιο της Γεωμετρίας . . . . . . . . . . . . . . . . . . . . 24

3.4.1 Μετασχηματισμός Μοντέλου και Θέασης . . . . . . . . 24

3.4.2 Σκίαση Κορυφών . . . . . . . . . . . . . . . . . . . . . . 25

3.4.3 Προβολή . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

3.4.4 Ψαλίδισμα . . . . . . . . . . . . . . . . . . . . . . . . . 28

3.5 Χαρτογράφηση Οθόνης . . . . . . . . . . . . . . . . . . . . . . 29

3.6 Το Στάδιο του Rasterizer . . . . . . . . . . . . . . . . . . . . . 30

3.6.1 Προετοιμασία Τριγώνων . . . . . . . . . . . . . . . . . . 30

3.6.2 Σάρωση Τριγώνων . . . . . . . . . . . . . . . . . . . . . 30

3.6.3 Σκίαση Εικονοστοιχείων . . . . . . . . . . . . . . . . . . 31

3.6.4 Συγχώνευση . . . . . . . . . . . . . . . . . . . . . . . . 32

4 Μετασχηματισμοί 35

4.1 Μετακίνηση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.2 Περιστροφή . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.3 Κλιμάκωση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

4.4 Συνένωση Μετασχηματισμών . . . . . . . . . . . . . . . . . . . 41

4.5 Τετραδόνια (Quaternions) . . . . . . . . . . . . . . . . . . . . . 42

4.5.1 Μαθηματικό Υπόβαθρο . . . . . . . . . . . . . . . . . . 42

4.5.2 Μετατροπή Τετραδονίου σε Πίνακα . . . . . . . . . . . 45

4.5.3 Σφαιρική Γραμμική Παρεμβολή . . . . . . . . . . . . . 46

4.6 Προβολές . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

4.6.1 Ορθογραφική Προβολή . . . . . . . . . . . . . . . . . . 47

4.6.2 Προοπτική Προβολή . . . . . . . . . . . . . . . . . . . . 49

5 Σκίαση (Shading) 51

5.1 Επίπεδη Σκίαση . . . . . . . . . . . . . . . . . . . . . . . . . . 51

5.2 Ομαλή Σκίαση . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

5.2.1 Το μοντέλο σκίασης του Gouraud . . . . . . . . . . . . 53

5.2.2 Το μοντέλο σκίασης του Phong . . . . . . . . . . . . . . 54

6 Χαρτογράφηση Σκιών 56

6.1 Αλγόριθμος Σκιών του Απομονωτή Ζ (Z-buffer Shadows) . . . 56

Page 6: Mars2030 Thesis Booklet

6

6.1.1 Δημιουργώντας το χάρτη σκιών . . . . . . . . . . . . . 57

6.1.2 Η Σκίαση της Σκηνής . . . . . . . . . . . . . . . . . . . 58

7 Χαρτογράφηση Κύβου 61

7.0.1 Εφαρμογές της Χαρτογράφησης Κύβου . . . . . . . . . 61

8 Το βιντεοπαιχνίδι MARS2030 64

8.0.1 Τρόπος παιχνιδιού . . . . . . . . . . . . . . . . . . . . . 64

8.0.2 Τεχνολογίες που Χρησιμοποιήθηκαν . . . . . . . . . . . 65

8.0.3 Τεχνική Ανάλυση της Μηχανής Γραφικών . . . . . . . . 66

9 Oculus Rift 94

9.1 Έννοιες Στερεοσκοπικής Απόδοσης . . . . . . . . . . . . . . . 96

1 Πλέγματα Πολυγώνων. 102

2 Computer Animation 103

3 Απόδοση (Rendering) 105

4 Χαρτογράφηση Υφής (Texture Mapping) 107

Γλωσσάρι 108

Page 7: Mars2030 Thesis Booklet

7

Κατάλογος πινάκων

2.1 Εντολές επιστροφής τιμών μεταβλητών καταστάσεων. . . . . 20

4.1 Πίνακας διαφόρων τύπων μετασχηματισμών. . . . . . . . . . . 37

8.1 Πίνακας βιβλιοθηκών που χρησιμοποιήθηκαν. . . . . . . . . . 67

Page 8: Mars2030 Thesis Booklet

8

Κατάλογος εικόνων

1.1 Δισδιάστατο γραφικό. . . . . . . . . . . . . . . . . . . . . . . . 13

1.2 Τέχνη χρησιμοποιώντας pixels. . . . . . . . . . . . . . . . . . . 13

1.3 Διανυσματικό γραφικό. . . . . . . . . . . . . . . . . . . . . . . 14

1.4 Τρισδιάστατο γραφικό. . . . . . . . . . . . . . . . . . . . . . . 15

2.1 Λογότυπο της OpenGL . . . . . . . . . . . . . . . . . . . . . . 17

3.1 Το pipeline των γραφικών. . . . . . . . . . . . . . . . . . . . . 22

3.2 Προοπτική Προβολή - Ορθογραφική Προβολή . . . . . . . . . . 27

3.3 Ψαλίδισμα . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

3.4 Χαρτογράφηση Οθόνης . . . . . . . . . . . . . . . . . . . . . . 29

3.5 Σάρωση Τριγώνων - Rasterization . . . . . . . . . . . . . . . . 31

3.6 Σκίαση εικονοστοιχείων με διαφορετικά προγράμματα σκίασης. 32

5.1 Σκίαση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

5.2 Παράδειγμα Επίπεδης Σκίασης . . . . . . . . . . . . . . . . . 52

5.3 Διαφορές Επίπεδης σκίασης και σκίασης Gouraud. . . . . . . 53

5.4 Οπτική αναπαράσταση της εξίσωσης του Phong. . . . . . . . 55

6.1 Χαρτογράφηση Σκιών . . . . . . . . . . . . . . . . . . . . . . . 57

6.2 Αφαίρεση μετωπικών πολυγώνων για την αποφυγή των προ-

βλημάτων της ακμής σκίασης και της εφαρμογής των σκιών . 58

6.3 Χάρτης βάθους της σκηνής από το σημείο θέασης του φωτός 59

7.1 Παράδειγμα ενός skybox . . . . . . . . . . . . . . . . . . . . . 62

7.2 Αναπαράσταση του αλγορίθμου χαρτογράφησης αντανακλά-

σεων . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Page 9: Mars2030 Thesis Booklet

9

8.1 Διάγραμμα Κλάσεων της Μηχανής του Βιντεοπαιχνιδιού . . . 66

8.2 Παράδειγμα της τεχνικής Indexed Drawing. . . . . . . . . . . 72

9.1 Λογότυπο της εταιρίας Oculus VR. . . . . . . . . . . . . . . . 94

9.2 Rift Development Kit 2. . . . . . . . . . . . . . . . . . . . . . . 95

9.3 Μορφές παραμόρφωσης εικόνων. . . . . . . . . . . . . . . . . 96

9.4 Προβολές των εικόνων στο Rift για κάθε μάτι. . . . . . . . . . 97

1.1 Πλέγμα Πολυγώνων . . . . . . . . . . . . . . . . . . . . . . . . 102

3.1 Απόδοση Τρισδιάστατων Σφαιρών . . . . . . . . . . . . . . . . 106

4.1 Χαρτογράφηση Υφής . . . . . . . . . . . . . . . . . . . . . . . . 107

Page 10: Mars2030 Thesis Booklet

10

Ορισμοί

Framebuffer: Ένα τμήμα της μνήμης RAM που περιέχει μία εικόνα η οποία

οδηγείται σε μία οθόνη από έναν απομονωτή μνήμης που περιέχει όλα

τα δεδομένα ενός καρέ.

Aliasing: Είναι το φαινόμενο κατά το οποίο οι λείες επιφάνειες και οι κα-

μπύλες, στα γραφικά, εμφανίζονται με προεξοχές επειδή η ανάλυση

της συσκευής γραφικών δεν είναι αρκετά υψηλή για να τις απεικονίσει

σωστά.

Anti-aliasing: Είναι η διαδικασία εξομάλυνσης των προεξοχών που εμφα-

νίζονται στις λείες επιφάνειες και στις καμπύλες των γραφικών λόγο

του φαινομένου της ψευδωνυμίας (aliasing).

88

Page 11: Mars2030 Thesis Booklet

11

Κεφάλαιο 1

Εισαγωγή στην έννοια των

γραφικών

1.1 Τι Είναι Γραφικά;

Γραφικά (Graphics) είναι η παραγωγή οπτικών δηλώσεων πάνω σε κά-

ποια επιφάνεια, όπως τοίχος, καμβάς, αγγείο, οθόνη υπολογιστή, χαρτί, πέ-

τρα κτλ. . Περιλαμβάνει οτιδήποτε αφορά τη δημιουργία συμβόλων, δια-

γραμμάτων, logo, γράφων, σχεδίων (γραμμικών και μη γραμμικών), συμβό-

λων, γεωμετρικών σχεδίων και ούτω καθεξής.

1.2 Γραφικά Ηλεκτρονικών Υπολογιστών (Computer

Graphics).

Τα γραφικά ηλεκτρονικών υπολογιστών είναι γραφικά που δημιουργού-

νται χρησιμοποιώντας ηλεκτρονικούς υπολογιστές οι οποίοι αναπαριστούν

τα δεδομένα εικόνας, με τη βοήθεια ειδικού υλικού ή λογισμικού γραφικών.

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

ερμηνεία των δεδομένων έχει γίνει ευκολότερη λόγω των γραφικών ηλεκτρο-

νικών υπολογιστών. Η ανάπτυξη των γραφικών ηλεκτρονικών υπολογιστών

είχε σημαντικό αντίκτυπο σε πολλούς τύπους πολυμέσων και έχουν φέρει

επανάσταση στο animation, στις ταινίες και στη βιομηχανία βιντεοπαιχνι-

Page 12: Mars2030 Thesis Booklet

12

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

μία ευρεία έννοια για να περιγράψει σχεδόν οτιδήποτε αφορά τους υπολο-

γιστές και δεν είναι κείμενο ή ήχος. Τυπικά, ο όρος αυτός αναφέρεται σε

πολλά διαφορετικά πράγματα όπως:

• Στην αντιπροσώπευση και τον χειρισμό δεδομένων εικόνας από έναν

ηλεκτρονικό υπολογιστή.

• Στις διάφορες τεχνολογίες που χρησιμοποιούνται για τη δημιουργία

και την επεξεργασία εικόνων.

• Στο υπο-τμήμα της πληροφορικής το οποίο ασχολείται με μεθόδους

που χρησιμοποιούνται για την ψηφιακή σύνθεση και επεξεργασία οπτι-

κού περιεχομένου.

1.3 Τα Είδη των Γραφικών

1.3.1 Δισδιάστατα Γραφικά (2D Computer Graphics).

Τα δισδιάστατα γραφικά είναι η “βασισμένη στους ηλεκτρονικούς υπο-

λογιστές” δημιουργία των ψηφιακών εικόνων. Χρησιμοποιούνται κυρίως σε

εφαρμογές που αναπτύχθηκαν αρχικά πάνω σε παραδοσιακές τεχνολογίες

εκτύπωσης και σχεδίου, όπως η τυπογραφία. Σ’ αυτές τις εφαρμογές, η

δισδιάστατη εικόνα δεν είναι απλά μία αντιπροσώπευση ενός αντικειμέ-

νου στον πραγματικό κόσμο, αλλά είναι ένα ανεξάρτητο τεχνούργημα με

επιπρόσθετη σημασιολογική αξία. Γι’ αυτό το λόγο προτιμώνται τα δισδιά-

στατα μοντέλα επειδή παρέχουν πιο άμεσο έλεγχο της εικόνας απ’ ότι τα

τρισδιάστατα γραφικά, των οποίων η προσέγγιση πλησιάζει πιο πολύ την

φωτογραφία απ’ ότι την τυπογραφία.

Page 13: Mars2030 Thesis Booklet

13

Διάγραμμα 1.1: Δισδιάστατο γραφικό.

1.3.2 Τέχνη με Εικονοστοιχεία (Pixel Art)

Ένα μεγάλο τμήμα της ψηφιακής τέχνης είναι η “Τέχνη με Pixels”. Δη-

μιουργείται με τη χρήση προγραμμάτων γραφικών raster, όπου οι εικόνες

επεξεργάζονται σε επίπεδο pixel. Τα γραφικά στα περισσότερα (ή σε σχε-

τικά περιορισμένα) βιντεοπαιχνίδια , ειδικά αυτά που τρέχουν σε παλιές

κινητές συσκευές χρησιμοποιούν Pixel Art.

Διάγραμμα 1.2: Τέχνη χρησιμοποιώντας pixels.

1.3.3 Διανυσματικά Γραφικά (Vector Graphics)

Τα formats των διανυσματικών γραφικών είναι συμπληρωματικά των

γραφικών raster. Τα γραφικά raster είναι η αντιπροσώπευση των εικόνων

ως πίνακες από pixels και τυπικά χρησιμοποιούνται για την απεικόνιση

φωτογραφικών εικόνων. Τα διανυσματικά γραφικά συνίστανται στην κω-

δικοποίηση πληροφοριών που αφορούν σχήματα και χρώματα που αποτε-

λούν την εικόνα, γεγονός που επιτρέπει μεγαλύτερη ευελιξία στην απόδοσή

(rendering) της. Ανάλογα με την περίπτωση προτιμάται η χρήση είτε διανυ-

Page 14: Mars2030 Thesis Booklet

14

σματικών γραφικών είτε γραφικών raster. Σε ορισμένες περιπτώσεις χρησι-

μοποιούνται και τα δύο αυτά είδη γραφικών. Η κατανόηση των πλεονεκτη-

μάτων και των περιορισμών της κάθε τεχνολογίας, και της σχέσης μεταξύ

τους είναι απαραίτητη για την αποτελεσματική χρήση των εργαλείων επε-

ξεργασίας τους.

Διάγραμμα 1.3: Διανυσματικό γραφικό.

1.3.4 Τρισδιάστατα Γραφικά (3D Graphics)

Τα τρισδιάστατα γραφικά αν συγκριθούν με τα δισδιάστατα γραφικά,

είναι γραφικά τα οποία χρησιμοποιούν τρισδιάστατη αντιπροσώπευση γε-

ωμετρικών δεδομένων. Για να επιτευχθεί καλύτερη απόδοση τα δεδομένα

αυτά αποθηκεύονται στον υπολογιστή. Παρ’ όλες τις διαφορές μεταξύ τρισ-

διάστατων και δισδιάστατων γραφικών, τα τρισδιάστατα γραφικά βασίζο-

νται σε παρόμοιους αλγόριθμους με αυτούς των δισδιάστατων γραφικών.

Στα λογισμικά γραφικών η διάκριση μεταξύ δισδιάστατων και τρισδιάστα-

των γραφικών δεν είναι ξεκάθαρη σε ορισμένες περιπτώσεις. Δισδιάστατες

εφαρμογές μπορεί να χρησιμοποιήσουν τρισδιάστατες τεχνικές για να πετύ-

χουν εφέ όπως ο φωτισμός , ενώ τα τρισδιάστατα γραφικά μπορεί κυρίως

να χρησιμοποιήσουν δισδιάστατες τεχνικές απεικόνισης. Τα τρισδιάστατα

γραφικά είναι παρόμοια με τα τρισδιάστατα μοντέλα. Τα μοντέλα περιέ-

χονται μέσα σε αρχεία γραφικών δεδομένων. Το τρισδιάστατο μοντέλο εί-

ναι η αντιπροσώπευση οποιουδήποτε τρισδιάστατου αντικειμένου. Μέχρι

Page 15: Mars2030 Thesis Booklet

15

τη στιγμή της απεικόνισής του ένα μοντέλο δεν θεωρείται γραφικό. Λόγω

της τρισδιάστατης εκτύπωσης τα τρισδιάστατα μοντέλα δεν περιορίζονται

μόνο στον εικονικό χώρο. Τέλος, μπορούν να χρησιμοποιηθούν και σε μη

γραφικές εξομοιώσεις και σε διάφορους υπολογισμούς.

Διάγραμμα 1.4: Τρισδιάστατα γραφικά.

Page 16: Mars2030 Thesis Booklet

16

Κεφάλαιο 2

Η Ανοιχτή Βιβλιοθήκη Γραφικών

(OpenGL)

2.1 Τι είναι η Ανοιχτή Βιβλιοθήκη Γραφικών;

Η ανοιχτή βιβλιοθήκη γραφικών ή όπως θα αναφέρεται στη συνέχεια

OpenGL, είναι μία διεπαφή λογισμικού για το υλικό των γραφικών ενός

Η/Υ. Η διεπαφή αποτελείται από 150 διαφορετικές εντολές που χρησιμο-

ποιούνται για να ορίσουν τα αντικείμενα και τις ενέργειες που χρειάζονται

για να παραχθούν τρισδιάστατες εφαρμογές.

Η OpenGL έχει σχεδιαστεί ως μία βελτιωμένη διεπαφή ανεξάρτητη από

το υλικό που υλοποιείται πάνω σε πολλές διαφορετικές πλατφόρμες. Για

την επίτευξη αυτών των ιδιοτήτων, δεν υλοποιεί εντολές διαχείρισης παρα-

θύρων, εντολές διαχείρισης εισόδου από τον χρήστη, αλλά ούτε και εντολές

υψηλού επιπέδου για την περιγραφή τρισδιάστατων αντικειμένων όπως τμή-

ματα του ανθρώπινου σώματος, αεροπλάνα ή σωματίδια. Με την OpenGL

πρέπει ο προγραμματιστής να δημιουργήσει το μοντέλο που επιθυμεί χρη-

σιμοποιώντας ένα σύνολο βασικών γεωμετρικών σχημάτων, όπως σημεία,

γραμμές και πολύγωνα.

Χρησιμοποιώντας την OpenGL ο προγραμματιστής μπορεί να αναπτύξει

προγράμματα σκίασης (Shaders), να προσδιορίσει τα δεδομένα που χρη-

σιμοποιούν, αλλά και τις ρυθμιστικές πτυχές της OpenGL εκτός του πε-

δίου εφαρμογής των προγραμμάτων σκίασης. Συνήθως τα δεδομένα αυτά

Page 17: Mars2030 Thesis Booklet

17

αντιπροσωπεύουν γεωμετρία σε δύο ή τρεις διαστάσεις και εικόνες υφής

(textures), ενώ τα προγράμματα σκίασης ελέγχουν τη γεωμετρική μεταποί-

ηση, το rasterization της γεωμετρίας , τον φωτισμό και τη σκίαση των εικονο-

στοιχείων (pixels) που δημιουργούνται από το rasterization, με αποτέλεσμα

να γίνεται απεικόνιση της γεωμετρίας στον framebuffer.

Ένα τυπικό πρόγραμμα που χρησιμοποιεί την OpenGL αρχίζει με τις

κλήσεις για να ανοίξει ένα παράθυρο στον framebuffer, στον οποίο το πρό-

γραμμα θα ζωγραφίσει. Στη συνέχεια, γίνονται κλήσεις για να δημιουργη-

θεί το πλαίσιο της OpenGL καθώς και κλήσεις για να προσδιοριστούν τα

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

ακολουθούν εντολές οι οποίες ζωγραφίζουν τη γεωμετρία μεταφέροντας συ-

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

στούν και περαιτέρω επεξεργασία πριν απεικονιστούν στην οθόνη. Υπάρ-

χουν επίσης εντολές οι οποίες μπορούν να ελέγχουν άμεσα τον framebuffer

διαβάζοντας και γράφοντας εικονοστοιχεία.

Διάγραμμα 2.1: Λογότυπο της OpenGL

2.2 Σχεδιασμός

Ο προσδιορισμός της OpenGL περιγράφει ότι η βιβλιοθήκη είναι ένα

αφηρημένο API για την απόδοση δισδιάστατων και τρισδιάστατων γραφι-

κών. Αν και το API μπορεί να υλοποιηθεί εξ’ ολοκλήρου ως λογισμικό, είναι

σχεδιασμένο για να υλοποιηθεί κυρίως ή εξ’ ολοκλήρου στο υλικό.

Το API αποτελείται από έναν αριθμό συναρτήσεων που μπορούν να κλη-

θούν από ένα πρόγραμμα πελάτη, παράλληλα με ένα αριθμό από ονομασμέ-

νες ακέραιες σταθερές (για παράδειγμα , η σταθερά GL_TEXTURE_2D, η

Page 18: Mars2030 Thesis Booklet

18

οποία αντιστοιχεί στον αριθμό 3553). Παρ’ ότι οι ορισμοί των συναρτήσεων

είναι παρόμοιοι με αυτούς της γλώσσας προγραμματισμού C, δεν εξαρτώ-

νται από καμία γλώσσα προγραμματισμού. Ως εκ τούτου η OpenGL έχει

πολλά language bindings, μερικά από τα πιο σημαντικά είναι το binding με

την WebGL μέσω της JavaScript (ένα API που είναι βασισμένο στην OpenGL

ES 2.0, για την απόδοση τρισδιάστατων γραφικών μέσα από web browsers),

τα bindings με τη C (WGL, GLX, CGL) συμπεριλαμβανομένου του binding

που παρέχει το λειτουργικό iOS καθώς και το binding για Java και C που

παρέχει το Android.

2.3 Ανάπτυξη λογισμικού με την OpenGL

Η OpenGL είναι ένα εξελισσόμενο API. Νέες εκδόσεις του προσδιο-

ρισμού της OpenGL κυκλοφορούν ανά τακτά χρονικά διαστήματα από την

Khronos Group, κάθε μία από τις οποίες επεκτείνει την υποστήριξη του API

για διάφορα νέα χαρακτηριστικά. Οι λεπτομέρειες κάθε έκδοσης αποφασί-

ζονται μετά από ομοφωνία των μελών του Group, συμπεριλαμβανομένων

των κατασκευαστών των καρτών γραφικών, των σχεδιαστών λειτουργικών

συστημάτων και εταιριών γενικής τεχνολογίας όπως η Mozilla και η Google.

Επιπρόσθετα στα χαρακτηριστικά που υπάρχουν στον πυρήνα του API,

οι προμηθευτές των GPU μπορεί να παρέχουν επιπρόσθετη λειτουργικότητα

με τη μορφή επεκτάσεων. Οι επεκτάσεις μπορεί να εισάγουν νέες λειτουρ-

γίες και νέες σταθερές όπως επίσης και να χαλαρώσουν ή να αφαιρέσουν

περιορισμούς σε ήδη υπάρχουσες συναρτήσεις της OpenGL. Οι προμηθευ-

τές μπορούν να χρησιμοποιήσουν τις επεκτάσεις για να δημιουργήσουν δικά

τους API χωρίς να χρειάζονται υποστήριξη από άλλους προμηθευτές ή από

την Khronos Group, γεγονός το οποίο αυξάνει σε μεγάλο βαθμό την ευελι-

ξία της OpenGL. Όλες οι επεκτάσεις συγκεντρώνονται και ορίζονται από το

μητρώο της OpenGL.

Κάθε επέκταση συσχετίζεται με ένα σύντομο αναγνωριστικό, βασισμένο

στο όνομα της εταιρίας που δημιούργησε την επέκταση. Για παράδειγμα, το

αναγνωριστικό της Nvidia είναι NV, το οποίο είναι μέρος του ονόματος της

Page 19: Mars2030 Thesis Booklet

19

επέκτασης GL_NV_half_floatNV_half_floatNV_half_float, της ακέραιας στα-

θεράς GL_HALF_FLOAT_NV και της συνάρτησης glVertex2hNV(). Αν πολ-

λοί προμηθευτές συμφωνήσουν να υλοποιήσουν την ίδια λειτουργικότητα

χρησιμοποιώντας το ίδιο API, μπορεί να κυκλοφορήσει μία κοινή επέκταση,

χρησιμοποιώντας το αναγνωριστικό EXT. Σε τέτοιες περιπτώσεις υπάρχει

πιθανότητα το συμβούλιο επιθεώρησης αρχιτεκτονικής (Architecture Review

Board-ARB) να δώσει στην επέκταση ρητή έγκριση και σ’ αυτήν την περί-

πτωση χρησιμοποιείται το αναγνωριστικό ARB. Οι λειτουργίες που εισάγο-

νται με κάθε νέα έκδοση της OpenGL δημιουργούνται τυπικά από πολλές

ευρέως αποδεκτές επεκτάσεις, ειδικότερα επεκτάσεις του τύπου ARB ή

EXT.

2.4 Η Ανοιχτή Βιβλιοθήκη Γραφικών ως Μηχανή

Καταστάσεων (State Machine).

Η OpenGL είναι μία μηχανή καταστάσεων. Μπορεί κανείς να θέσει στη

μηχανή αυτή διάφορες καταστάσεις οι οποίες παραμένουν ενεργές μέχρι

να αλλαχθούν από τον προγραμματιστή. Ένα παράδειγμα μίας μεταβλη-

τής καταστάσεως στην OpenGL είναι το τρέχον χρώμα. Ο προγραμματιστής

μπορεί να θέσει το τρέχον χρώμα σε κόκκινο, άσπρο ή οποιοδήποτε άλλο

χρώμα, και από εκεί και μετά κάθε αντικείμενο ζωγραφίζεται με το χρώμα

που τέθηκε, μέχρι να τεθεί ένα διαφορετικό χρώμα. Το τρέχον χρώμα εί-

ναι μία μόνο από τις μεταβλητές καταστάσεων που περιέχει η OpenGL.

Άλλες ελέγχουν τους τρέχοντες μετασχηματισμούς θέασης (View) και προ-

βολής (Projection), τα μοτίβα των γραμμών και των πολυγώνων, τη θέση και

τα χαρακτηριστικά του φωτός, της ιδιότητες των υλικών των αντικειμένων

που ζωγραφίζονται κ.α. Πολλές μεταβλητές καταστάσεων αναφέρονται σε

καταστάσεις οι οποίες μπορούν να ενεργοποιηθούν ή να απενεργοποιηθούν

με τις εντολές glEnable() ή glDisable().

Κάθε μεταβλητή καταστάσεως έχει μία προκαθορισμένη τιμή, και σε

οποιαδήποτε χρονική στιγμή μπορούμε να ζητήσουμε από το σύστημα να

Page 20: Mars2030 Thesis Booklet

20

μας δώσει την τρέχουσα τιμή της. Τυπικά χρησιμοποιούμε μία από τις έξι

εντολές που ακολουθούν για να το πετύχουμε αυτό. Επιπρόσθετα υπάρ-

Πίνακας 2.1: Εντολές επιστροφής τιμών μεταβλητών καταστάσεων.

glGetBooleanv() Επιστρέφει μία τιμή κατάστασης

που έχει τύπο Bool σε μορφή δια-

νύσματος.

glGetDoublev() Επιστρέφει μία τιμή κατάστασης

που έχει τύπο Double σε μορφή δια-

νύσματος.

glGetFloatv() Επιστρέφει μία τιμή κατάστασης

που έχει τύπο Float σε μορφή δια-

νύσματος.

glGetIntegerv() Επιστρέφει μία τιμή κατάστασης

που έχει τύπο Integer σε μορφή δια-

νύσματος.

glGetPointerv() Επιστρέφει ένα δείκτη σε μία τιμή

μίας κατάστασης σε μορφή διανύ-

σματος.

glIsEnabled() Επιστρέφει μία συμβολική σταθερά

για το αν το σύστημα παρέχει την

OpenGL.

χει η δυνατότητα να σωθεί μία συλλογή από μεταβλητές καταστάσεως σε

μία στοίβα γνωρισμάτων (Attribute Stack), με τις εντολές glPushAttrib()

ή glPushClientAttrib(), να τροποποιηθεί προσωρινά, και αργότερα να γί-

νει η επαναφορά των τιμών τους χρησιμοποιώντας τις αντίστοιχες εντολές

glPopAttrib() ή glPopClientAttrib().

Page 21: Mars2030 Thesis Booklet

21

Κεφάλαιο 3

Το Pipeline Απόδοσης των

Γραφικών

3.1 Εισαγωγικά Στοιχεία

Το pipeline απόδοσης των γραφικών, ή όπως είναι απλά γνωστό, το

”pipeline”, έχει ως κύρια λειτουργία να δημιουργήσει ή να αποδώσει μία δισ-

διάστατη εικόνα, αφού του δοθούν, μία εικονική κάμερα, τρισδιάστατα αντι-

κείμενα, πηγές φωτός, συναρτήσεις σκίασης, εικόνες υφής κ.α. Το pipeline

απόδοσης είναι επομένως το βασικό εργαλείο για την απόδοση γραφικών

σε πραγματικό χρόνο.

3.2 Η Αρχιτεκτονική

Στον πραγματικό κόσμο η έννοια του αγωγού εμφανίζεται σε πολλές

διαφορετικές μορφές, από τις γραμμές παραγωγής εργοστασίων μέχρι τους

αναβατήρες για σκι. Η έννοια του όμως ισχύει και για την απόδοση των

γραφικών.

Ένα pipeline αποτελείται από πολλά στάδια. Για παράδειγμα, σε ένα

pipeline πετρελαίου, το πετρέλαιο δεν μπορεί να μεταβεί από το πρώτο

στάδιο του pipeline στο δεύτερο, αν το πετρέλαιο που βρίσκεται ήδη στο

δεύτερο στάδιο δεν έχει μεταβεί στο τρίτο στάδιο και ούτω καθ’ εξής. Αυτό

συνεπάγεται ότι η ταχύτητα του pipeline ορίζεται από το πιο αργό στάδιο

Page 22: Mars2030 Thesis Booklet

22

του, χωρίς να παίζει ρόλο το πόσο γρήγορα μπορεί να είναι τα υπόλοιπα

στάδια. Αυτό το φαινόμενο είναι γνωστό και ως bottleneck.

Στην ιδανική περίπτωση που ένα σύστημα, το οποίο δε χρησιμοποιεί

pipelines, χωριστεί σε Ν στάδια που χρησιμοποιούν pipelines, μπορεί να πα-

ρατηρηθεί αύξηση στην ταχύτητά του κατά ένα παράγοντα Ν. Αυτή η αύξηση

στην απόδοση είναι και ο κύριος λόγος να χρησιμοποιηθούν pipelines.

Αυτό το είδος της κατασκευής pipelines μπορεί κανείς να το συναντήσει

και στον τομέα των γραφικών Η/Υ πραγματικού χρόνου. Το pipeline από-

δοσης των γραφικών πραγματικού χρόνου μπορεί αν χωριστεί χονδρικά σε

τρία εννοιολογικά στάδια:

• Στάδιο εφαρμογής.

• Στάδιο γεωμετρίας.

• Στάδιο του rasterizer.

Αυτή η δομή αποτελεί τον πυρήνα-τη μηχανή του pipeline της απόδοσης των

γραφικών-η οποία χρησιμοποιείται στις εφαρμογές γραφικών H/Y πραγμα-

τικού χρόνου και είναι η βάση της συζήτησης των επόμενων υποκεφαλαίων.

Διάγραμμα 3.1: Το pipeline των γραφικών.

Page 23: Mars2030 Thesis Booklet

23

3.3 Το στάδιο της εφαρμογής

Όπως υπονοεί το όνομά του, το στάδιο της εφαρμογής έχει γνώμονα

την ίδια την εφαρμογή και ως εκ τούτου εφαρμόζεται σε λογισμικό που

εκτελείται σε επεξεργαστές γενικής χρήσης. Αυτοί οι επεξεργαστές συνή-

θως περιλαμβάνουν πολλαπλούς πυρήνες, οι οποίοι έχουν την ικανότητα να

επεξεργαστούν πολλαπλά νήματα εκτέλεσης διεργασιών παράλληλα. Αυτό

τους επιτρέπει να εκτελούν αποτελεσματικά μια μεγάλη ποικιλία εργασιών,

η οποίες είναι ευθύνη του σταδίου της εφαρμογής. Μερικές απ’ αυτές τις

εργασίες συνήθως εκτελούνται στον επεξεργαστή και περιλαμβάνουν αλ-

γορίθμους ανίχνευσης συγκρούσεων, καθολικούς αλγορίθμους επιτάχυνσης,

animation, εξομοίωση φυσικής και πολλές άλλες, ανάλογα με τον τύπο της

εφαρμογής.

Ο προγραμματιστής έχει πλήρη έλεγχο για το τι γίνεται στο στάδιο της

εφαρμογής, μιας και εκτελείται στην K.M.E. Ως εκ τούτου, μπορεί να προσ-

διοριστεί εξ’ ολοκλήρου τον τρόπο λειτουργίας του και μπορεί αργότερα να

τον τροποποιήσει με σκοπό να βελτιώσει την επίδοσή του. Οι αλλαγές σ’

αυτό το στάδιο μπορούν επίσης να επηρεάσουν την επίδοση των μετέπειτα

σταδίων. Για παράδειγμα, μία ρύθμιση ή ένας αλγόριθμος του σταδίου της

εφαρμογής θα μπορούσαν να μειώσουν τον αριθμό των τριγώνων που θα

αποδοθούν.

Στο τέλος του σταδίου της εφαρμογής, η γεωμετρία που θα αποδοθεί

οδηγείται στο στάδιο της γεωμετρίας. Η γεωμετρία αυτή αποτελείται από

απλά γεωμετρικά σχήματα, όπως π.χ., σημεία, γραμμές, και τρίγωνα, τα

οποία μπορεί τελικά να καταλήξουν στην οθόνη (ή σε οποιαδήποτε συσκευή

εξόδου χρησιμοποιείται). Αυτή είναι η πιο σημαντική αρμοδιότητα του στα-

δίου της εφαρμογής.

Το στάδιο της εφαρμογής είναι επίσης το κατάλληλο για να διαχειριστεί

είσοδο από άλλες πηγές, όπως το πληκτρολόγιο, το ποντίκι, μία συσκευή ει-

κονικής πραγματικότητας που φοριέται στο κεφάλι κ.τ.λ. Ανάλογα μ’ αυτή

την είσοδο μπορεί να αναληφθούν πολλά διαφορετικά είδη δράσεων. Άλ-

λες διεργασίες που δημιουργούνται σ’ αυτό το στάδιο περιλαμβάνουν το

Page 24: Mars2030 Thesis Booklet

24

animation των εικόνων υφής, τα animations μέσω μετασχηματισμών ή οποιο-

δήποτε άλλο είδος υπολογισμών, οι οποίοι δεν εκτελούνται σε οποιοδήποτε

από τα άλλα στάδια.

3.4 Το Στάδιο της Γεωμετρίας

Το στάδιο της γεωμετρίας είναι υπεύθυνο για την πλειονότητα των πρά-

ξεων που πραγματοποιούνται ανά πολύγωνο και ανά κορυφή. Αυτό το στά-

διο διαχωρίζεται περαιτέρω στα ακόλουθα λειτουργικά στάδια:

• Μετασχηματισμοί μοντέλου και θέασης.

• Σκίαση κορυφών.

• Προβολή.

• Ψαλίδισμα.

• Χαρτογράφηση οθόνης.

Σημειώστε ότι, ανάλογα με την κατασκευή τους, αυτά τα λειτουργικά στά-

δια μπορεί να είναι ή να μην είναι στάδια του αγωγού. Σε μερικές περιπτώ-

σεις, ένας αριθμός από συνεχή λειτουργικά στάδια δημιουργούν ένα στάδιο

του αγωγού (το οποίο εκτελείται παράλληλα με άλλα στάδια του αγωγού).

Σε άλλες περιπτώσεις ένα λειτουργικό στάδιο μπορεί να υποδιαιρεθεί σε

πολλά μικρότερα στάδια αγωγού.

3.4.1 Μετασχηματισμός Μοντέλου και Θέασης

Στο δρόμο προς την οθόνη, ένα μοντέλο μετασχηματίζεται σε πολλούς

διαφορετικούς ”χώρους” ή αλλιώς συστήματα συντεταγμένων. Αρχικά, ένα

μοντέλο κατοικεί στο δικό του ”χώρο”, ο οποίος ονομάζεται ”χώρος του μο-

ντέλου” που απλά σημαίνει ότι δεν έχει υποστεί κανένα μετασχηματισμό.

Κάθε μοντέλο μπορεί να συσχετιστεί με ένα μετασχηματισμό μοντέλου έτσι

ώστε να μπορέσει να του αποδοθεί θέση και προσανατολισμός. Είναι εφι-

κτό ένα μοντέλο να συσχετίζεται με πολλούς μετασχηματισμούς μοντέλου.

Page 25: Mars2030 Thesis Booklet

25

Αυτό επιτρέπει πολλά αντίγραφα (instances) του ίδιου μοντέλου να έχουν

διαφορετικές θέσεις, προσανατολισμούς και μεγέθη, στην ίδια σκηνή, χωρίς

να χρειάζεται αντιγραφή της βασικής γεωμετρίας.

Κατά το μετασχηματισμό μοντέλου μετασχηματίζονται οι κορυφές και

τα κάθετα διανύσματα επιφάνειας (normals) του μοντέλου. Οι συντεταγ-

μένες ενός αντικειμένου ονομάζονται συντεταγμένες μοντέλου, και αφού

εφαρμοστεί πάνω σ’ αυτές ο μετασχηματισμός μοντέλου, λέμε ότι το μο-

ντέλο βρίσκεται σε συντεταγμένες κόσμου ή στο ”χώρο του κόσμου”. Ο

χώρος του κόσμου είναι μοναδικός και αφού τα μοντέλα μετασχηματιστούν

με τον μετασχηματισμό μοντέλου που συσχετίζεται το καθ’ ένα, όλα τα

μοντέλα βρίσκονται στο ίδιο σύστημα συντεταγμένων.

Κατά τη διαδικασία της απόδοσης των μοντέλων, μόνο τα μοντέλα που

είναι ορατά στην κάμερα (ή αλλιώς παρατηρητή) αποδίδονται. Η κάμερα

έχει μία θέση στο σύστημα συντεταγμένων του κόσμου και μία κατεύθυνση,

τα οποία χρησιμοποιούνται για να τοποθετηθεί και να στοχευθεί. Για να

μπορέσει να πραγματοποιηθεί η προβολή και το ψαλίδισμα, η κάμερα και

όλα τα μοντέλα μετασχηματίζονται με το μετασχηματισμό θέασης. Ο σκοπός

του μετασχηματισμού θέασης είναι να τοποθετήσει την κάμερα στο αρχικό

σημείο του συστήματος συντεταγμένων και να τη στοχεύσει, έτσι ώστε να

κοιτάει στην κατεύθυνση του αρνητικού τμήματος του άξονα z, με τον άξονα

y να δείχνει προς τα πάνω και τον άξονα x να δείχνει δεξιά. Η πραγματική

θέση και η κατεύθυνση, αφού έχει πραγματοποιηθεί ο μετασχηματισμός θέ-

ασης εξαρτώνται από τη διεπαφή προγραμματισμού που υπάρχει. Ο χώρος

λοιπόν που οριοθετείται ονομάζεται ”χώρος της κάμερας” ή όπως συνηθέ-

στερα αποκαλείται ”ο χώρος του ματιού”.

3.4.2 Σκίαση Κορυφών

Για να παραχθεί μία ρεαλιστική σκηνή, δεν είναι αρκετό να αποδοθούν

οι θέση και το σχήμα των αντικειμένων, αλλά πρέπει να μοντελοποιηθεί

και η εμφάνισή τους. Αυτή η περιγραφή περιλαμβάνει το υλικό κάθε αντι-

κειμένου, όπως επίσης και την επίδραση οποιασδήποτε πηγής φωτός, που

Page 26: Mars2030 Thesis Booklet

26

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

ντελοποιηθούν με πολλούς τρόπους, από απλά χρώματα μέχρι λεπτομερείς

αντιπροσωπεύσεις των φυσικών τους ιδιοτήτων.

Αυτή η λειτουργία του καθορισμού της επιρροής μίας πηγής φωτός σε

ένα υλικό είναι γνωστή ως σκίαση. Περιλαμβάνει τον υπολογισμό μιας εξί-

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

αυτούς τους υπολογισμούς πραγματοποιούνται πάνω στις κορυφές του μο-

ντέλου κατά τη διάρκεια του σταδίου της γεωμετρίας, και άλλες μπορεί

να πραγματοποιούνται κατά διάρκεια του rasterization ανά εικονοστοιχείο.

Μία ποικιλία από δεδομένα υλικών μπορεί να αποθηκευθεί σε κάθε κορυφή

όπως η θέση του σημείου, ένα κάθετο διάνυσμα στην επιφάνεια, ένα χρώμα

ή οποιαδήποτε άλλη αριθμητική πληροφορία χρειάζεται για τον υπολογι-

σμό της εξίσωσης της σκίασης. Τα αποτελέσματα της σκίασης κορυφών (τα

οποία μπορεί να είναι χρώματα, διανύσματα, συντεταγμένες εικόνων υφής

ή οποιοδήποτε άλλο είδος δεδομένων σκίασης) στέλνονται έπειτα στο στά-

διο του rasterization για να πραγματοποιηθεί παρεμβολή (interpolation) στις

τιμές τους.

Οι υπολογισμοί της σκίασης θεωρείται συνήθως ότι γίνονται στο ”χώρο

του κόσμου”. Πρακτικά, είναι μερικές φορές βολικό να μετασχηματιστούν

οι σχετικές οντότητες (όπως η κάμερα και οι πηγές φωτός) σε κάποιο άλλο

χώρο (όπως το χώρο του μοντέλου ή το χώρο της κάμερας) και να γίνουν

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

μεταξύ των πηγών του φωτός, της κάμερας και των μοντέλων διατηρούνται

αν όλες οι οντότητες που συμπεριλαμβάνονται στους υπολογισμούς της σκί-

ασης είναι μετασχηματισμένες στον ίδιο χώρο.

3.4.3 Προβολή

Μετά τη σκίαση, τα συστήματα της απόδοσης των γραφικών πραγμα-

τοποιούν την προβολή, η οποία μετασχηματίζει την πυραμίδα της θέασης σε

ένα μοναδιαίο κύβο, του οποίου τα ακραία σημεία είναι το (−1,−1,−1) και

(1, 1, 1). Ο μοναδιαίος κύβος ονομάζεται κανονικός όγκος θέασης. Υπάρχουν

Page 27: Mars2030 Thesis Booklet

27

2 συνήθεις μέθοδοι προβολής, η ορθογραφική και η προοπτική προβολή.

Ο όγκος θέασης όταν βλέπουμε ορθογραφικά είναι συνήθως ένα ορθο-

γώνιο κουτί, και η ορθογραφική προβολή μετασχηματίζει τον όγκο θέασης σε

ένα μοναδιαίο κύβο. Το κύριο χαρακτηριστικό της ορθογραφικής προβολής

είναι ότι οι παράλληλες γραμμές παραμένουν παράλληλες μετά το μετα-

σχηματισμό. Αυτός ο μετασχηματισμός είναι ένας συνδυασμός μετακίνησης

και κλιμάκωσης.

Η προοπτική προβολή είναι λίγο πιο πολύπλοκη. Σ’ αυτό τον τύπο προ-

βολής, όσο πιο μακριά βρίσκεται ένα αντικείμενο από την κάμερα, τόσο μι-

κρότερο εμφανίζεται μετά την προβολή. Επιπρόσθετα οι παράλληλες γραμ-

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

λοιπόν μιμείται τον τρόπο που άνθρωπος αντιλαμβάνεται το μέγεθος ενός

αντικειμένου. Γεωμετρικά, ο όγκος θέασης, είναι κόλουρη πυραμίδα. Η κό-

λουρη πυραμίδα μετασχηματίζεται επίσης σε ένα μοναδιαίο κύβο Ο ορ-

θογραφικός αλλά και ο προοπτικός μετασχηματισμός μπορούν να κατα-

σκευαστούν με τετραδιάστατους πίνακες μετασχηματισμού, και μετά από

οποιονδήποτε απ’ αυτούς τους δύο μετασχηματισμούς, λέμε ότι τα μοντέλα

βρίσκονται σε κανονικοποιημένες συντεταγμένες συσκευής.

Παρ’ ότι αυτοί οι πίνακες μετασχηματίζουν έναν όγκο σε έναν άλλο, ονο-

μάζονται προβολές, επειδή μετά την απεικόνιση η τιμή z των συντεταγμένων

δεν αποθηκεύεται στην εικόνα που δημιουργείται. Με αυτόν τον τρόπο, τα

μοντέλα προβάλλονται από τις τρεις στις δύο διαστάσεις.

Διάγραμμα 3.2: Προοπτική Προβολή - Ορθογραφική Προβολή

Page 28: Mars2030 Thesis Booklet

28

3.4.4 Ψαλίδισμα

Μόνο τα γεωμετρικά σχήματα που βρίσκονται ολόκληρα ή μερικώς μέσα

στην πυραμίδα θέασης πρέπει να μεταβούν στο στάδιο του rasterizer, το

οποίο μετά τα ζωγραφίζει στην οθόνη. Ένα γεωμετρικό σχήμα το οποίο βρί-

σκεται εξ’ ολοκλήρου μέσα στον όγκο θέασης, θα μεταφερθεί όπως είναι

στο επόμενο στάδιο. Τα γεωμετρικά σχήματα που βρίσκονται εξ’ ολοκλή-

ρου εκτός του όγκου θέασης, δε μεταφέρονται σε επόμενο στάδιο, μιας και

δεν αποδίδονται. Τα γεωμετρικά σχήματα τα οποία είναι μερικός μέσα στον

όγκο θέασης είναι αυτά που χρειάζονται ψαλίδισμα. Για παράδειγμα, μία

γραμμή η οποία έχει μία κορυφή εκτός και μία εντός του όγκου θέασης πρέ-

πει να ψαλιδιστεί κατάλληλα, έτσι ώστε η κορυφή η οποία βρίσκεται εκτός

του όγκου θέασης να αντικατασταθεί από μία νέα κορυφή, η οποία βρίσκε-

ται στο σημείο τομής μεταξύ της γραμμής και του όγκου θέασης. Η χρήση

ενός πίνακα μετασχηματισμού προβολής υπονοεί ότι τα μετασχηματιζόμενα

γεωμετρικά σχήματα ψαλιδίζονται με βάση ένα μοναδιαίο κύβο. Το πλεο-

νέκτημα της πραγματοποίησης του μετασχηματισμού θέασης και προβολής

πριν από το ψαλίδισμα είναι ότι κάνει το πρόβλημα του ψαλιδίσματος στα-

θερό· πάντα τα γεωμετρικά σχήματα ψαλιδίζονται με βάση το μοναδιαίο

κύβο. Αντίθετα με τα προηγούμενα στάδια της γεωμετρίας, τα οποία τυ-

πικά πραγματοποιούνται από προγραμματιζόμενες μονάδες επεξεργασίας,

το στάδιο του ψαλιδίσματος (όπως επίσης και το στάδιο της χαρτογράφησης

οθόνης) επεξεργάζονται συνήθως από υλικό σταθερής λειτουργίας.

Διάγραμμα 3.3: Ψαλίδισμα

Page 29: Mars2030 Thesis Booklet

29

3.5 Χαρτογράφηση Οθόνης

Μόνο τα (ψαλιδισμένα) βασικά γεωμετρικά σχήματα που βρίσκονται

μέσα στον όγκο θέασης μεταφέρονται στο στάδιο χαρτογράφησης οθόνης,

και οι συντεταγμένες είναι ακόμα ορισμένες σε τρεις διαστάσεις όταν ει-

σέρχονται σ’ αυτό το στάδιο. Οι συντεταγμένες x και y του κάθε γεωμετρι-

κού σχήματος μετασχηματίζονται για να δημιουργήσουν τις συντεταγμένες

οθόνης. Οι συντεταγμένες οθόνης μαζί με την τιμή z των συντεταγμένων

ονομάζονται επίσης συντεταγμένες παραθύρου. Ας υποθέσουμε ότι η σκηνή

πρέπει να αποδοθεί σε ένα παράθυρο του οποίου η ελάχιστη γωνία του εί-

ναι το σημείο με συντεταγμένες (x1, y1) και η μέγιστη γωνία στο σημείο με

συντεταγμένες (x2, y2), όπου x1 < x2 και y1 < y2. Τότε η χαρτογράφηση οθό-

νης είναι μία μετακίνηση ακολουθούμενη από μια κλιμάκωση. Οι τιμές των

συντεταγμένων στον άξονα z δεν επηρεάζονται απ’ αυτή τη χαρτογράφηση.

Οι νέες τιμές των συντεταγμένων στους άξονες x και y λέγονται συντεταγ-

μένες οθόνης. Αυτές οι τιμές μαζί με την τιμή στον άξονα z (−1 ≤ z ≤ 1),

μεταφέρονται στο στάδιο του rasterizer.

Διάγραμμα 3.4: Χαρτογράφηση Οθόνης

Page 30: Mars2030 Thesis Booklet

30

3.6 Το Στάδιο του Rasterizer

Ο στόχος του σταδίου του rasterizer, αφού του δοθούν οι μετασχηματι-

σμένες και προβεβλημένες κορυφές μαζί με τα δεδομένα σκίασης (που προ-

έρχονται όλα από το στάδιο της γεωμετρίας) με τα οποία συσχετίζονται,

είναι να υπολογίσει και να θέσει χρώματα για τα εικονοστοιχεία που κα-

λύπτονται από το αντικείμενο. Αυτή η διαδικασία ονομάζεται rasterization

ή μετατροπή σάρωσης, η οποία είναι ουσιαστικά η μετατροπή από δισδιά-

στατες κορυφές που βρίσκονται στο ”χώρο της οθόνης” - με την καθεμία να

έχει μία τιμή στον z άξονα (τιμή βάθους), και διάφορες πληροφορίες σκί-

ασης οι οποίες συσχετίζονται με κάθε κορυφή - σε εικονοστοιχεία επάνω

στην οθόνη.

Όπως και στο στάδιο της γεωμετρίας, αυτό το στάδιο υποδιαιρείται σε

διάφορα λειτουργικά στάδια:

• Εγκατάσταση τριγώνων.

• Προετοιμασία τριγώνων.

• Σκίαση εικονοστοιχείων.

• Συγχώνευση.

3.6.1 Προετοιμασία Τριγώνων

Σ’ αυτό το στάδιο υπολογίζονται τα διαφορικά και άλλα δεδομένα για

την επιφάνεια του τριγώνου. Αυτά τα δεδομένα χρησιμοποιούνται για τη

μετατροπή σάρωσης, όπως επίσης και για την παρεμβολή μεταξύ των δια-

φόρων τιμών των δεδομένων σκίασης που παράγονται από το στάδιο της

γεωμετρίας. Αυτή η διαδικασία πραγματοποιείται από υλικό σταθερής λει-

τουργίας που υπάρχει συγκεκριμένα γι’ αυτό το σκοπό.

3.6.2 Σάρωση Τριγώνων

Σ’ αυτό το στάδιο κάθε εικονοστοιχείο το οποίο έχει το κέντρο του ή ένα

τμήμα του καλυμμένο από το τρίγωνο ελέγχεται και ένα τεμάχιο (fragment)

Page 31: Mars2030 Thesis Booklet

31

δημιουργείται για το κομμάτι του εικονοστοιχείου που επικαλύπτει το τρί-

γωνο. Η διαδικασία της εύρεσης των εικονοστοιχείων που βρίσκονται μέσα

σ’ ένα τρίγωνο ονομάζεται συχνά σάρωση τριγώνων ή μετατροπή σάρωσης.

Οι ιδιότητες κάθε τεμαχίου του τριγώνου παράγονται χρησιμοποιώντας δε-

δομένα που έχουν υποστεί παρεμβολή ανάμεσα στις τρεις κορυφές τριγώ-

νου. Αυτές οι ιδιότητες συμπεριλαμβάνουν την τιμή βάθους του τεμαχίου,

όπως επίσης και οποιαδήποτε άλλα δεδομένα σκίασης από το στάδιο της

γεωμετρίας.

Διάγραμμα 3.5: Σάρωση Τριγώνων - Rasterization

3.6.3 Σκίαση Εικονοστοιχείων

Όλοι οι υπολογισμοί ανά εικονοστοιχείο πραγματοποιούνται σ’ αυτό το

στάδιο, χρησιμοποιώντας δεδομένα που έχουν υποστεί παρεμβολή ως εί-

σοδο. Το τελικό αποτέλεσμα είναι ένα ή περισσότερα χρώματα τα οποία θα

περάσουν στο επόμενο στάδιο. Αντίθετα από το στάδιο της εγκατάστασης

και της σάρωσης των τριγώνων, τα οποία πραγματοποιούνται συνήθως από

υλικό αποκλειστικό γι’ αυτές τις διεργασίες, το στάδιο της σκίασης των

εικονοστοιχείο εκτελείται από προγραμματιζόμενους πυρήνες της κάρτας

γραφικών. Μία μεγάλη ποικιλία τεχνικών μπορεί να χρησιμοποιηθεί εδώ,

όπου μία από τις σημαντικότερες είναι η χαρτογράφηση υφής.

Page 32: Mars2030 Thesis Booklet

32

Διάγραμμα 3.6: Σκίαση εικονοστοιχείων με διαφορετικά προγράμματα σκίασης.

3.6.4 Συγχώνευση

Η πληροφορία για κάθε εικονοστοιχείο αποθηκεύεται στον απομονωτή

χρώματος (color buffer), ο οποίος είναι ένας ορθογώνιος πίνακας από χρώ-

ματα (με μία κόκκινη, μία πράσινη και μία μπλε συνιστώσα για κάθε χρώμα).

Είναι ευθύνη του σταδίου της συγχώνευσης να συνδυάσει το χρώμα του τε-

μαχίου που παράγεται από το στάδιο της σκίασης με το χρώμα που υπάρχει

ήδη αποθηκευμένο στον απομονωτή. Αντίθετα με το στάδιο της σκίασης, η

υπομονάδα της κάρτας γραφικών που τυπικά εκτελεί αυτό το στάδιο δεν

είναι πλήρως προγραμματιζόμενη. Παρ’ όλα αυτά, είναι ιδιαίτερα ρυθμιζό-

μενη με τη δυνατότητα ενεργοποίησης διαφόρων εφέ. Αυτό το στάδιο είναι

επίσης υπεύθυνο για την επίλυση του προβλήματος της ορατότητας των

αντικειμένων. Αυτό σημαίνει ότι αφού έχει αποδοθεί ολόκληρη η σκηνή, ο

απομονωτής χρώματος θα πρέπει να περιέχει τα χρώματα των γεωμετρι-

κών σχημάτων της σκηνής τα οποία είναι ορατά από το σημείο θέασης της

κάμερας. Για τις περισσότερες κάρτες γραφικών, αυτή η διαδικασία γίνεται

με τον αλγόριθμο του απομονωτή Z (Z-buffer), που είναι γνωστός και ως

απομονωτής βάθους. Ο απομονωτής βάθους έχει το ίδιο μέγεθος και σχήμα

με τον απομονωτή χρώματος και αποθηκεύει για κάθε εικονοστοιχείο την

τιμή του άξονα z, η οποία ορίζεται από τη θέση της κάμερας μέχρι το κο-

ντινότερο γεωμετρικό σχήμα. Αυτό σημαίνει ότι όταν ένα γεωμετρικό σχήμα

Page 33: Mars2030 Thesis Booklet

33

αποδίδεται πάνω σε ένα συγκεκριμένο εικονοστοιχείο υπολογίζεται και συ-

γκρίνεται με τα περιεχόμενα το ίδιου εικονοστοιχείου μέσα στον απομονωτή

βάθους. Αν η νέα τιμή στον άξονα z είναι μικρότερη από την τιμή του άξονα

z του απομονωτή βάθους, τότε το γεωμετρικό σχήμα που αποδίδεται είναι

πιο κοντά στην κάμερα από το γεωμετρικό σχήμα που ήταν προηγουμένως

πιο κοντά στην κάμερα στο συγκεκριμένο εικονοστοιχείο. Έτσι η τιμή στον

άξονα z και το χρώμα αυτού του εικονοστοιχείου ενημερώνεται με την τιμή

z και το χρώμα από το γεωμετρικό σχήμα που ζωγραφίζεται. Αν η τιμή z

που υπολογίστηκε είναι μεγαλύτερη από την τιμή z στον απομονωτή βάθους,

οι απομονωτές χρώματος και βάθους παραμένουν αμετάβλητοι. Αξίζει να

αναφερθεί ότι αυτός ο αλγόριθμος επιτρέπει τα περισσότερα γεωμετρικά

σχήματα να αποδοθούν με οποιαδήποτε σειρά, γεγονός που προσδίδει στη

δημοφιλία του. Παρ’ όλα αυτά, μερικώς διάφανα γεωμετρικά σχήματα δε

μπορούν να αποδοθούν με οποιαδήποτε σειρά. Πρέπει να αποδοθούν μετά

από όλα τα αδιαφανή αντικείμενα και με σειρά από πίσω προς τα εμπρός.

Αυτή είναι μία από τις μεγαλύτερες αδυναμίες του απομονωτή βάθους.

Όπως προαναφέρθηκε, ο απομονωτής χρώματος χρησιμοποιείται για την

αποθήκευση χρωμάτων και ο απομονωτής βάθους για την αποθήκευση των

τιμών στον άξονα z, για κάθε εικονοστοιχείο. Παρ’ όλα αυτά υπάρχουν και

άλλα κανάλια και απομονωτές που μπορούν να χρησιμοποιηθούν για να

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

συσχετίζεται με τον απομονωτή χρώματος και αποθηκεύει μία σχετική τιμή

διαφάνειας για κάθε εικονοστοιχείο. Μπορεί να πραγματοποιηθεί μία προ-

αιρετική δοκιμή της τιμής του καναλιού άλφα (alpha test) σε ένα εισερχό-

μενο τεμάχιο πριν την πραγματοποίηση της δοκιμής βάθους (depth test). Η

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

τιμή αναφοράς. Αν το τεμάχιο αποτύχει να περάσει τη δοκιμασία, αφαιρεί-

ται από οποιαδήποτε περαιτέρω διαδικασία επεξεργασίας. Αυτή η δοκιμή,

χρησιμοποιείται τυπικά για την αποφυγή του επηρεασμού του απομονωτή

βάθους από τεμάχια με πλήρη διαφάνεια.

Όλες αυτές οι λειτουργίες που πραγματοποιούνται στο τέλος του αγω-

γού ονομάζονται λειτουργίες ράστερ (raster operations) ή λειτουργίες μείξης

Page 34: Mars2030 Thesis Booklet

34

(blending operations).

Ο απομονωτής πλαισίου (framebuffer) αποτελείται από όλους τους υπό-

λοιπους απομονωτές του συστήματος (δηλαδή τον απομονωτή χρώματος,

βάθους, ίχνους, συσσώρευσης), αλλά μερικές φορές χρησιμοποιείται για να

περιγράψει τον απομονωτή χρώματος και βάθους σαν ένα σύνολο.

Όταν τα γεωμετρικά σχήματα έχουν φτάσει και έχουν περάσει από το

στάδιο του rasterizer, και είναι ορατά από το σημείο θέασης της κάμερας,

απεικονίζονται στην οθόνη. Η οθόνη απεικονίζει τα περιεχόμενα του απο-

μονωτή χρώματος. Για να αποφευχθεί το φαινόμενο ο χρήστης να μπορεί να

δει τα γεωμετρικά σχήματα την ώρα του rasterization και στέλνονται στην

οθόνη, χρησιμοποιείται η τεχνική του διπλού απομονωτή (double buffering).

Αυτό σημαίνει ότι η απόδοση της σκηνής γίνεται εκτός της οθόνης, σε έναν

όπισθεν απομονωτή. Μόλις η σκηνή έχει αποδοθεί στον όπισθεν απομονωτή,

τα περιεχόμενά του ανταλλάσσονται με τα περιεχόμενα του εμπρόσθιου

απομονωτή, ο οποίος απεικονιζόταν προηγουμένως στην οθόνη. Η ανταλ-

λαγή αυτή πραγματοποιείται κατά τη διάρκεια της κατακόρυφης σάρωσης

(vertical retrace), που είναι μία ασφαλής στιγμή για την πραγματοποίησή

της.

Page 35: Mars2030 Thesis Booklet

35

Κεφάλαιο 4

Μετασχηματισμοί

Ένας μετασχηματισμός είναι μία διαδικασία η οποία μετατρέπει με κά-

ποιο τρόπο οντότητες όπως σημεία, διανύσματα ή χρώματα. Για τον προ-

γραμματιστή γραφικών Η/Υ, είναι ιδιαίτερα σημαντικό να κατανοήσει σε

βάθος τους μετασχηματισμούς. Με τη χρήση τους μπορεί να τοποθετήσει,

να αλλάξει το σχήμα και να εμψυχώσει αντικείμενα, πηγές φωτός και κά-

μερες. Μπορεί επίσης να διασφαλίσει ότι όλοι οι υπολογισμοί πραγματο-

ποιούνται στο ίδιο σύστημα συντεταγμένων και να προβάλει αντικείμενα

σε ένα επίπεδο με πολλούς διαφορετικούς τρόπους. Αυτές οι διαδικασίες

είναι μόνο ένα μέρος του συνόλου των διαδικασιών που μπορούν να πραγ-

ματοποιηθούν με τη χρήση μετασχηματισμών και είναι αρκετές για να γίνει

επίδειξη της σημαντικότητάς τους στα γραφικά πραγματικού χρόνου ή και

σε οποιοδήποτε άλλο τομέα των γραφικών Η/Υ.

Ένας γραμμικός μετασχηματισμός διατηρεί το άθροισμα των διανυσμά-

των και τον πολλαπλασιασμό τους με μία βαθμίδα. Ειδικότερα:

f(x) + f(y) = f(x+ y), kf(x) = f(kx). (4.1)

Παραδείγματος χάρη, ο f(x) = 5x είναι ένας μετασχηματισμός που πολ-

λαπλασιάζει κάθε στοιχείο ενός διανύσματος με το πέντε. Αυτός ο μετα-

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

διανύσματα με το πέντε και μετά τα προσθέσουμε, παίρνουμε ακριβώς το

ίδιο αποτέλεσμα με το αν τα προσθέταμε και έπειτα τα πολλαπλασιάζαμε.

Αυτή η συνάρτηση ονομάζεται μετασχηματισμός κλιμάκωσης, μιας και μετα-

Page 36: Mars2030 Thesis Booklet

36

βάλλει την κλίμακα (μέγεθος) ενός αντικειμένου. Ο μετασχηματισμός περι-

στροφής είναι άλλος ένας γραμμικός μετασχηματισμός ο οποίος περιστρέφει

ένα διάνυσμα γύρο από ένα σημείο αναφοράς. Οι μετασχηματισμοί κλιμά-

κωσης και περιστροφής είναι γραμμικοί μετασχηματισμοί που μετασχημα-

τίζουν διανύσματα τριών διαστάσεων και μπορούν να αντιπροσωπευθούν

χρησιμοποιώντας έναν πίνακα μετασχηματισμού 3x3.

Παρ’ όλα αυτά, αυτό το μέγεθος πίνακα δεν είναι αρκετό. Μία συνάρ-

τηση για ένα τρισδιάστατο διάνυσμα x ορισμένη ως f(x) = x + (7, 3, 2) δεν

είναι γραμμική. Αν εφαρμόσουμε αυτή τη συνάρτηση σε δύο διαφορετικά

διανύσματα θα προσθέσει την τιμή του σταθερού διανύσματος (7, 3, 2) δύο

φορές για να παραχθεί το αποτέλεσμα. Η πρόσθεση ενός σταθερού διανύ-

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

ένας πολύ χρήσιμος μετασχηματισμός και θα θέλαμε να μπορούμε να συν-

δυάσουμε πολλούς διαφορετικούς μετασχηματισμούς, π.χ., να αλλάξουμε το

μέγεθος ενός αντικειμένου και μετά να το μετακινήσουμε σε μία διαφορε-

τική θέση. Διατηρώντας τους μετασχηματισμούς σε αυτήν την απλή μορφή,

καθιστά δύσκολο το συνδυασμό τους.

Ο συνδυασμός γραμμικών μετασχηματισμών και μετακινήσεων μπορεί

να πραγματοποιηθεί χρησιμοποιώντας ένα συσχετισμένο μετασχηματισμό,

που τυπικά αποθηκεύεται σε ένα πίνακα μετασχηματισμού 4x4. Ένας συ-

σχετισμένος μετασχηματισμός επιτελεί ένα γραμμικό μετασχηματισμό και

έπειτα μία μετακίνηση. Για να αναπαραστήσουμε ένα τετραδιάστατο διάνυ-

σμα χρησιμοποιούμε ομοιογενή σημειογραφία, δηλώνοντας σημεία και κα-

τευθύνσεις με τον ίδιο τρόπο (με μικρά έντονα γράμματα). Μία κατεύθυνση

ορίζεται ως v =(vx vy vz 0)T και ένα σημείο ως v = (vx vy vz 1)T .

Οι πίνακες μετασχηματισμού μετακίνησης, περιστροφής, κλιμάκωσης,

αντανάκλασης και διάτμησης είναι αφινικοί. Το κύριο χαρακτηριστικό ενός

αφινικού πίνακα είναι ότι διατηρεί τον παραλληλισμό των γραμμών, αλλά

όχι απαραίτητα τα μήκη και τις γωνίες. Ένας αφινικός μετασχηματισμός

μπορεί επίσης να αποτελείται από οποιαδήποτε σειρά από συνενώσεις ατο-

μικών αφινικών μετασχηματισμών.

Page 37: Mars2030 Thesis Booklet

37

Πίνακας 4.1: Πίνακας διαφόρων τύπων μετασχηματισμών.

Σημειογραφία Όνομα Χαρακτηριστικά

T (t) Πίνακας περιστροφής Αφινικός μετασχηματι-

σμός. Μετακινεί ένα

σημείο.

Rx(ρ) Πίνακας περιστροφής Ορθογώνιος και αφι-

νικός. Περιστρέφει ρ

ακτίνια γύρω από τον

άξονα x. Παρόμοια ση-

μειογραφία για τους

άξονες y και z.

R Πίνακας περιστροφής Οποιοσδήποτε πίνακας

περιστροφής. Είναι ορ-

θογώνιος και αφινικός.

B(s) Πίνακας κλιμάκωσης Αφινικός. Αλλάζει την

κλίμακα στους άξονες

x, y και z ανάλογα με

το s.

Po(s) Ορθογραφική προβολή Αφινικός. Προβάλει

παράλληλα πάνω σε

κάποιο επίπεδο ή

όγκο.

Pp(s) Προοπτική προβολή Προβάλει προοπτικά

πάνω σε κάποιο

επίπεδο ή όγκο.

slerp(q, r, t) Σφαιρική γραμμική

παρεμβολή (Spherical

linear interpolation)

Δημιουργεί ένα παρεμ-

βεβλημένο τετραδόνιο

(Quaternion) ανάμεσα

στα τετραδόνια q και

r χρησιμοποιώντας την

παράμετρο t.

Page 38: Mars2030 Thesis Booklet

38

4.1 Μετακίνηση

Μία μετακίνηση από μία θέση στο χώρο σε μία άλλη αντιπροσωπεύεται

από έναν πίνακα μετασχηματισμού μετακίνησης T . Αυτός ο πίνακας μετα-

κινεί μία οντότητα κατά ένα διάνυσμα t = (tx, ty, tz). Ο πίνακας T δίνεται

από την παρακάτω εξίσωση:

T (t) = T (tx, ty, tz) =

1 0 0 tx

0 1 0 ty

0 0 0 tz

0 0 0 1

(4.2)

Είναι εύκολο να παρατηρηθεί ότι ο πολλαπλασιασμός ενός σημείου p =

(px, py, pz, 1) με τον πίνακα T (t) δίνει ένα νέο σημείο p′ = (px + tx, py +

ty, pz + tz, 1) που είναι ξεκάθαρα μία μετακίνηση. Παρατηρήστε ότι ένα διά-

νυσμα v = (vx, vy, vz, 0) δεν επηρεάζεται από τον πολλαπλασιασμό με τον

πίνακα T , επειδή ένα διάνυσμα κατεύθυνσης δεν μπορεί να υποστεί μετα-

κίνηση. Σε αντίθεση, τα σημεία αλλά και τα διανύσματα επηρεάζονται από

τους υπόλοιπους αφινικούς μετασχηματισμούς. Ο αντίστροφος πίνακας με-

τασχηματισμού του T δίνεται από σχέση T−1 = T (−t), που παράγει ένα

διάνυσμα t με αρνητικό πρόσημο.

4.2 Περιστροφή

Ένας μετασχηματισμός περιστροφής περιστρέφει ένα διάνυσμα (θέσης

ή κατεύθυνσης) κατά μία συγκεκριμένη γωνία και ένα συγκεκριμένο άξονα,

ο οποίος περνάει από το σημείο προέλευσης. Όπως και ο πίνακας μετασχη-

ματισμού μετακίνησης, έτσι και ο πίνακας μετασχηματισμού περιστροφής

είναι μετασχηματισμός άκαμπτου σώματος, δηλαδή, διατηρεί τις αποστά-

σεις μεταξύ των μετασχηματισμένων σημείων και ποτέ δεν προκαλεί την

αλλαγή πλευρών από δεξιά στα αριστερά και το αντίστροφο. Αυτοί οι δύο

τύποι μετασχηματισμών είναι ξεκάθαρα χρήσιμοι για την τοποθέτηση των

αντικειμένων στο χώρο και για τον προσανατολισμό τους. Ένας πίνακας με-

τασχηματισμού προσανατολισμού είναι ένας πίνακας περιστροφής συσχε-

Page 39: Mars2030 Thesis Booklet

39

τισμένος με μία κάμερα ή ένα αντικείμενο που ορίζει τον προσανατολισμό

του στο χώρο, δηλαδή, της κατεύθυνσης για πάνω και μπροστά. Πίνακες

περιστροφής που χρησιμοποιούνται συχνά είναι οι Rx(ϕ), Ry(ϕ) και Rz(ϕ),

οι οποίοι περιστρέφουν μία οντότητα κατά ϕ ακτίνια γύρω από τους άξονες

x, y και z αντίστοιχα.

Rx(ϕ) =

1 0 0 0

0 cosϕ −sinϕ 0

0 sinϕ cosϕ 0

0 0 0 1

(4.3)

Ry(ϕ) =

cosϕ 0 sinϕ 0

0 1 0 0

−sinϕ 0 cosϕ 0

0 0 0 1

(4.4)

Rz(ϕ) =

cosϕ −sinϕ 0 0

sinϕ cosϕ 0 0

0 0 1 0

0 0 0 1

(4.5)

Για κάθε έναν πίνακα περιστροφής 3x3, που περιστρέφει κατά ϕ ακτίνια

γύρω από οπουδήποτε άξονα, το ίχνος είναι σταθερό και ανεξάρτητο από

τον άξονα και υπολογίζεται ως εξής:

tr(R) = 1 + 2cosϕ (4.6)

Αυτό που χαρακτηρίζει ένα πίνακα περιστροφήςRi(ϕ), εκτός από το γεγονός

ότι περιστρέφει κατά ϕ ακτίνια γύρο από τον άξονα i, είναι ότι δεν επηρεά-

ζει καθόλου τα σημεία που είναι ορισμένα πάνω στον άξονα i. Παρατηρείστε

ότι ο πίνακας R θα χρησιμοποιηθεί για να δηλώσει έναν πίνακα μετασχη-

ματισμού γύρω από οποιονδήποτε άξονα. Οι παραπάνω πίνακες μπορούν

να χρησιμοποιηθούν σε μία σειρά τριών μετασχηματισμών για να παράξουν

το αποτέλεσμα μίας περιστροφής γύρω από έναν αυθαίρετο άξονα.

Page 40: Mars2030 Thesis Booklet

40

Όλοι οι πίνακες περιστροφής έχουν ορίζουσα ίση με 1 και είναι ορθο-

γώνιοι. Αυτό ισχύει επίσης για συνδυασμούς οποιουδήποτε αριθμού συνε-

νώσεων, οποιουδήποτε αριθμού αυτών των μετασχηματισμών.

4.3 Κλιμάκωση

Ένας πίνακας μετασχηματισμού κλιμάκωσης, S(s) = S(sx, sy, sz), αλλά-

ζει την κλίμακα μίας οντότητας κατά sx, sy και sz στους άξονες x, y και z

αντίστοιχα. Αυτό σημαίνει ο πίνακας κλιμάκωσης μπορεί να χρησιμοποιηθεί

για να μεγεθυνθεί ή να σμικρυνθεί ένα αντικείμενο. Όσο μεγαλύτερο είναι

το si, i ∈ x, y, z, τόσο πιο πολύ θα μεγεθυνθεί η οντότητα σ’ αυτήν την κα-

τεύθυνση. Θέτοντας οποιοδήποτε στοιχείο του s ίσο με 1 δεν μεταβάλλεται

η κλίμακα σ’ αυτήν την κατεύθυνση. Η ακόλουθη εξίσωση περιγράφει τον

πίνακα κλιμάκωσης S:

S(s) =

sx 0 0 0

0 sy 0 0

0 0 sz 0

0 0 0 1

(4.7)

Η κλιμάκωση ονομάζεται ομοιόμορφη αν sx = sy = sz και μη ομοιόμορφη

αλλιώς. Μερικές φορές οι όροι ισοτοπική και ανισοτροπική αντί των ομοιό-

μορφη και ανομοιόμορφη για τη διαδικασία της κλιμάκωσης. Ο αντίστροφος

πίνακας είναι ο S−1 = S(1/sx, 1/sy, 1/sz).

Αν ένα από τα τρία στοιχεία του s είναι αρνητικός αριθμός τότε ο πί-

νακας κλιμάκωσης μετατρέπεται σε πίνακα αντανάκλασης ή όπως αλλιώς

αποκαλείται, ”πίνακας καθρέπτης”. Για να εντοπίσουμε αν ένας πίνακας

κλιμάκωσης είναι στην πραγματικότητα πίνακας αντανάκλασης, υπολογί-

ζουμε τη διακρίνουσα του άνω 3x3 τμήματος του πίνακα και αν το αποτέ-

λεσμα είναι αρνητικός αριθμός τότε ο πίνακας είναι πίνακας αντανάκλασης.

Page 41: Mars2030 Thesis Booklet

41

4.4 Συνένωση Μετασχηματισμών

Λόγω του γεγονότος ότι δεν ισχύει η αντιμεταθετική ιδιότητα στον πολ-

λαπλασιασμό πινάκων, έχει σημασία η σειρά πραγματοποίησης των πολλα-

πλασιασμών.

Ως ένα παράδειγμα την εξάρτησης της συνένωσης των μετασχηματισμών

από τη σειρά πραγματοποίησης των πράξεων, θεωρείστε τους πίνακες S

και R. Ο μετασχηματισμός S(2, 0.5, 1) αλλάζει την κλίμακα του στοιχείου

στον άξονα x κατά δύο και του στοιχείου στον άξονα y κατά 0.5. Ο με-

τασχηματισμός R(π/6) περιστρέφει κατά π/6 ακτίνια με φορά αντίστροφη

του ρολογιού γύρω από τον άξονα z. Αυτοί οι πίνακες μπορούν να πολλα-

πλασιαστούν με δύο τρόπους και τα αποτελέσματά τους θα είναι εντελώς

διαφορετικά.

Ο πιο εμφανής λόγος για τη συνένωση των μετασχηματισμών σε έναν,

είναι η αποδοτικότητα. Για παράδειγμα, φανταστείτε ότι έχετε ένα αντικεί-

μενο που αποτελείτε από πολλές χιλιάδες κορυφές, και πρέπει να κλιμακω-

θεί, να περιστραφεί και τέλος να κλιμακωθεί. Αντί να πολλαπλασιαστούν

όλες οι κορυφές με κάθε ένα πίνακα μετασχηματισμού ξεχωριστά, οι τρεις

πίνακες συνενώνονται σε έναν και μετασχηματίζει όλες τις κορυφές. Αυτός ο

σύνθετος πίνακας είναι ο C = TRS. Σημειώστε την σειρά των μετασχημα-

τισμών: Η κλιμάκωση πρέπει να εφαρμοστεί πρώτα και γι’ αυτό ο πίνακας

S βρίσκεται στα δεξιά στην σύνθεση των πινάκων. Αυτή η σειρά υπονοεί το

ότι TRSp = (T (R(Sp))).

Αξίζει να αναφερθεί ότι ενώ η συνένωση των πινάκων εξαρτάται από τη

σειρά των πράξεων οι πίνακες μπορούν να ομαδοποιηθούν με οποιοδήποτε

τρόπο επιθυμούμε. Για παράδειγμα, ας υποθέσουμε οτι με τον μετασχη-

ματισμό TRSp θέλαμε να υπολογίσουμε το τμήμα TR μία μόνο φορά για

όλες τις κορυφές. Είναι σωστό να ομαδοποιήσουμε αυτούς τους δύο πίνακες,

(TR)(Sp), και να αντικαταστήσουμε με το ενδιάμεσο αποτέλεσμα. Όποτε

συμπεραίνουμε ότι ο η συνένωση πινάκων είναι συσχετιστική.

Page 42: Mars2030 Thesis Booklet

42

4.5 Τετραδόνια (Quaternions)

Παρ’ ότι τα τετραδόνια ανακαλύφθηκαν το 1843 από τον Sir William

Rowan Hamilton ως μία επέκταση των μιγαδικών αριθμών, δεν χρησιμοποι-

ήθηκαν στον τομέα των γραφικών Η/Υ μέχρι το 1985 όταν εισήχθηκαν στο

πεδίο από τον Shoemake. Τα τετραδόνια είναι ισχυρά εργαλεία για την κα-

τασκευή μετασχηματισμών με εντυπωσιακά χαρακτηριστικά και κατά κά-

ποιο τρόπο είναι ανώτερα από τις γωνίες Euler και τους πίνακες, ειδικά

όταν πρόκειται για την πραγματοποίηση περιστροφών ή προσανατολισμών

αντικειμένων. Τα τετραδόνια μπορούν να χρησιμοποιηθούν για τη σταθερή

και συνεχή παρεμβολή των προσανατολισμών, κάτι που δεν μπορεί να γίνει

με τη χρήση γωνιών Euler.

Ένας μιγαδικός αριθμός αποτελείται από ένα φανταστικό και ένα πραγ-

ματικό μέρος, όπου κάθε ένα από τα δύο μέρη εκπροσωπούνται από δύο

πραγματικούς αριθμούς, με το δεύτερο πραγματικό αριθμό να πολλαπλα-

σιάζονται με το√−1. Παρόμοια, τα τετραδόνια αποτελούνται από τέσσερα

μέρη. Οι πρώτες τρεις τιμές σχετίζονται με τον άξονα περιστροφής και η

γωνία περιστροφής επηρεάζει και τα τέσσερα μέρη Κάθε τετραδόνιο εκπρο-

σωπείται από τέσσερις πραγματικούς αριθμούς που ο καθένας συσχετίζε-

ται με ένα από τα τέσσερα μέρη του τετραδονίου. Μιας και τα τετραδόνια

αποτελούνται από τέσσερα μέρη τα συμβολίζουμε ως διανύσματα, αλλά για

διαφοροποίηση, χρησιμοποιούμε το σύμβολοˆ , π.χ q.

4.5.1 Μαθηματικό Υπόβαθρο

Ας ξεκινήσουμε με τον ορισμό του τετραδονίου.

Ορισμός. Ένα τετραδόνιο q μπορεί να οριστεί με τους ακόλουθους τρό-

πους.

q = (qv, qw) = iqx + jqy + kqz + qw = qv + qw,

qv = iqx + jqy + kqz = (qx, qy, qz),

i2 = j2 = k2 = −1, jk = −jk = i, ki = −ik − j, ij = −ji = k.

(4.8)

Η μεταβλητή qw είναι το πραγματικό μέρος του τετραδονίου q. Το φαντα-

στικό μέρος είναι το qv και τα i, j και k ονομάζονται φανταστικές μονάδες.

Page 43: Mars2030 Thesis Booklet

43

Για το φανταστικό μέρος qv μπορούμε να χρησιμοποιήσουμε όλες τις

πράξεις των διανυσμάτων, όπως πρόσθεση, κλιμάκωση, εσωτερικό γινόμενο,

εξωτερικό γινόμενο κ.α. Χρησιμοποιώντας τον ορισμό του τετραδονίου, ο

πολλαπλασιασμός μεταξύ δύο τετραδονίων q και v παράγεται όπως θα

δειχθεί παρακάτω. Σημειώστε ότι στον πολλαπλασιασμό των φανταστικών

μονάδων δεν ισχύει η αντιμεταθετική ιδιότητα.

Πολλαπλασιασμός:

qr = (iqx + jqy + kqz + qw)(irx + jry + krz + rw)

= i(qyrz − qzry + rwqx + qwrx)

+j(qzrx − qxrz + rwqy + qwry)

+k(qxry − qyrx + rwqz + qwrz)

+qwrw − qxrx − qyry − qzrz =

= (qv × rv + rwqv + qwrv, qwrw − qv · rv).

(4.9)

Όπως φαίνεται σ’ αυτήν την εξίσωση, χρησιμοποιήσαμε και το εξωτερικό

αλλά και το εσωτερικό γινόμενο για να υπολογίσουμε τον πολλαπλασιασμό

των δύο τετραδονίων. Μαζί με τον ορισμό του τετραδονίου, χρειάζεται να

αναφερθούμε και στους ορισμούς της πρόσθεσης , του συζυγούς και του

μοναδιαίου τετραδονίου καθώς και της νόρμας:

Πρόσθεση:

q + r = (qv, qw) + (rv, rw) = (qv + rv, qw + rw).

Συζυγές:

q∗ = (qv, qw)∗ = (−qv, qw).

Νόρμα:

n(q) =√

qq∗ =√

q∗q =√qv · qv + q2w

=√

q2x + q2y + q2z + q2w

(4.10)

Μοναδιαίο:

i = (0, 1).

Page 44: Mars2030 Thesis Booklet

44

Όταν η σχέση n(q =√qq∗) απλοποιείται, τα φανταστικά τμήματα απλο-

ποιούνται. Ως αποτέλεσμα μπορεί να παραχθεί ένα πολλαπλασιαστικό αντί-

στροφο που συμβολίζεται ως q−1. Η εξίσωση q−1q = qq−1 = 1 πρέπει να

ισχύει για το αντίστροφο. Μπορούμε να παράξουμε τον τύπο από τον ορι-

σμό της νόρμας:

n(q)2 = qq∗ ⇐⇒ qq∗

n(q)2= 1. (4.11)

Αυτή η σχέση παράγει το πολλαπλασιαστικό αντίστροφο όπως φαίνεται

παρακάτω:

Αντίστροφο:

q−1 =1

n(q)2q∗. (4.12)

Ακολουθούν ορισμένοι κανόνες που προκύπτουν από τους ορισμούς:

Κανόνες Συζυγίας:

(q∗)∗ = q,

(q + r)∗ = q∗ + r∗,

(qr)∗ = r∗q∗.

(4.13)

Κανόνες Νόρμας:

n(q∗) = n(q),

n(qr) = n(q)n(r).(4.14)

Κανόνες πολλαπλασιασμού:

Γραμμικότητα:

p(sq + tr) = spq + tpr,

(sp+ tq)r = spr + tqr.(4.15)

Προσεταιριστική:

p(qr) = (pq)r.

Page 45: Mars2030 Thesis Booklet

45

Ένα τετραδόνιο q = (qv, qw), είναι μοναδιαίο όταν n(q) = 1. Απ’ αυτό

προκύπτει ότι το τετραδόνιο q μπορεί να γραφτεί και ως

q = (sinϕuq, cosϕ) = sinϕuq + cosϕ, (4.16)

για κάποιο τρισδιάστατο διάνυσμα uq, τέτοιο ώστε∥∥∥uq

∥∥∥ = 1, επειδή

n(q) = n(sinϕuq, cosϕ) =√

sin2ϕ(uq · uq) + cos2ϕ

=√

sin2ϕ+ cos2ϕ = 1(4.17)

αν και μόνο αν uq · uq = 1 =∥∥∥uq

∥∥∥2

.

Στους μιγαδικούς αριθμούς ένα δισδιάστατο διάνυσμα μπορεί να γρα-

φεί ως cosϕ+ isinϕ = eiϕ. Αντίστοιχα για τα τετραδόνια ισχύει:

q = sinϕuq + cosϕ = eϕuq . (4.18)

Ο λογάριθμος και η δύναμη για τα τετραδόνια δίνεται από τις σχέσεις:

Λογάριθμος:

log(q) = log(eϕuq) = ϕuq (4.19)

Δύναμη:

qt = (sinϕuq + cosϕ)t = eϕtuq = sin(ϕt)uq + cos(ϕt) (4.20)

4.5.2 Μετατροπή Τετραδονίου σε Πίνακα

Μιας και ορισμένα συστήματα έχουν υλοποιημένο τον πολλαπλασιασμό

πινάκων στο υλικό, χρειαζόμαστε μεθόδους μετατροπής των τετραδονίων

σε πίνακες και το αντίστροφο. Ένα τετραδόνιο q, μπορεί να μετατραπεί σε

ένα πίνακα M q ως εξής:

M q =

1− s(q2y + q2z) s(qxqy − qwqz) s(qxqz + qwqy) 0

s(qxqy + qwqz) 1− s(q2x + q2z) s(qyqz − qwqx) 0

s(qxqz − qwqy) s(qyqz + qwqx) 1− s(q2x + q2y) 0

0 0 0 1

(4.21)

Page 46: Mars2030 Thesis Booklet

46

Για s = 2/n(q) και για μοναδιαία τετραδόνια η παραπάνω σχέση απλοποιεί-

ται ως εξής:

M q =

1− 2(q2y + q2z) 2(qxqy − qwqz) 2(qxqz + qwqy) 0

2(qxqy + qwqz) 1− 2(q2x + q2z) 2(qyqz − qwqx) 0

2(qxqz − qwqy) 2(qyqz + qwqx) 1− 2(q2x + q2y) 0

0 0 0 1

(4.22)

4.5.3 Σφαιρική Γραμμική Παρεμβολή

Η σφαιρική γραμμική παρεμβολή είναι μία πράξη κατά την οποία έχο-

ντας δύο τετραδόνια q και r και μία παράμετρο t ∈ [0, 1], υπολογίζει ένα

παρεμβεβλημένο τετραδόνιο. Είναι χρήσιμη για την εμψύχωση των αντικει-

μένων, ενώ δεν είναι τόση χρήσιμη για παρεμβολές προσανατολισμών της

κάμερας, μιας και το διάνυσμα που δείχνει προς τα πάνω (up vector) μπορεί

να αποκτήσει κλήση κατά την παρεμβολή.

Η αλγεβρική μορφή αυτής της πράξης δίνεται από σύνθετο τετραδόνιο

s που ακολουθεί:

s(q, r, t) = (rq−1)tq. (4.23)

Παρ’ όλα αυτά για υλοποιήσεις της σφαιρικής γραμμικής παρεμβολής σε

επίπεδο λογισμικού χρησιμοποιείται η μορφή που ακολουθεί, όπου slerp

είναι ο συμβολισμός της σφαιρικής γραμμικής παρεμβολής:

s(q, r, t) = slerp(q, r, t) =sin(ϕ(1− t))

sinϕq +

sin(ϕt)

sinϕr. (4.24)

Για να υπολογιστεί η γωνία ϕ που χρειάζεται στην εξίσωση, χρησιμοποιούμε

τη σχέση: cosϕ = qxrx + qyry + qzrz + qwrw. Για t ∈ [0, 1], η σφαιρική γραμ-

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

το μικρότερο τόξο πάνω σε μία τετραδιάστατη μοναδιαία σφαίρα από το

τετραδόνιο q (t = 0) μέχρι το τετραδόνιο r (t = 1).

4.6 Προβολές

Πριν μπορέσει μία σκηνή να αποδοθεί, πρέπει όλα τα αντικείμενά της

να προβληθούν πάνω σε κάποιου είδους επίπεδο ή απλό γεωμετρικό όγκο.

Page 47: Mars2030 Thesis Booklet

47

Μετά απ’ αυτό ακολουθεί το ψαλίδισμα και η απόδοση των αντικειμένων

αυτών (δείτε το υποκεφάλαιο 3.4).

Όλοι οι μετασχηματισμοί που έχουμε δει μέχρι τώρα έχουν αφίσεια-

νεπιρρέαστη την τέταρτη συνιστώσα των τετραδιάστατων διανυσμάτων, τη

συνιστώσα w. Αυτό σημαίνει ότι τα σημεία και τα διανύσματα έχουν δια-

τηρήσει τους τύπους τους μετά το μετασχηματισμό και επίσης η κάτω τε-

λευταία σειρά των πινάκων 4x4 είχε πάντα τις τιμές (0 0 0 1). Οι πίνακες

μετασχηματισμού προοπτικής προβολής είναι η εξαίρεση και στις δύο πα-

ραπάνω ιδιότητες: Η κάτω τελευταία σειρά τους περιέχει αριθμούς που

διαχειρίζονται σημεία και διανύσματα, γεγονός που συχνά προϋποθέτει τη

χρήση μίας διαδικασίας ομογενοποίησης (συχνά η τιμή w δεν είναι ίση με 1,

οπότε είναι αναγκαία μία διαίρεση κάθε τιμής του διανύσματος ή σημείου

με το w, για να πάρουμε ως αποτέλεσμα την ομογενοποιημένη του μορφή).

Από την άλλη μεριά, οι πίνακες μετασχηματισμού ορθογραφικής προβολής

αποτελούν την απλούστερη μορφή προβολής και δεν επηρεάζουν την τιμή

του w.

4.6.1 Ορθογραφική Προβολή

Ένα χαρακτηριστικό μίας ορθογραφικής προβολής είναι ότι διατηρεί την

παραλληλία των γραμμών. Ο πιο συνηθισμένος πίνακας μετασχηματισμού

ορθογραφικής προβολής εκφράζεται με τη χρήση της εξάδας, (l, r, b, t, n, f),

που οι τιμές της αντιπροσωπεύουν το αριστερό, το δεξί, το κάτω, το πάνω,

το κοντινό και το μακρινό επίπεδο αντίστοιχα.

Μετά το μετασχηματισμό, προκύπτει ο κανονικοποιημένος όγκος θέα-

σης, έναντι του οποίου ψαλιδίζεται η γεωμετρία που πρέπει να αποδοθεί. Η

γεωμετρία που δεν βρίσκεται εκτός του κύβου αποδίδεται χαρτογραφώντας

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

Page 48: Mars2030 Thesis Booklet

48

εδώ:

Po = S(s)T (t) =

2

r−l0 0 0

0 2t−b

0 0

0 0 2f−n

0

0 0 0 1

1 0 0 − l+r

2

0 1 0 − t+b2

0 0 1 −f+n2

0 0 0 1

=

2

r−l0 0 − r+l

r−l

0 2t−b

0 − t+bt−b

0 0 2f−n

−f+nf−n

0 0 0 1

(4.25)

Στα γραφικά Η/Υ μετά την προβολή χρησιμοποιείται συνήθως ένα σύ-

στημα συντεταγμένων αριστερού χεριού. Επειδή τη τιμή του μακρινού επι-

πέδου είναι μικρότερη από την τιμή του κοντινού επιπέδου με τον τρόπο που

ορίσαμε πλαίσιο οριοθέτησης, ο ορθογραφικός μετασχηματισμός θα περιέχει

πάντα ένα μετασχηματισμό κατοπτρισμού. Για να το δούμε αυτό, ας υπο-

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

ίδιο μέγεθος με το στόχο του μετασχηματισμού, τον κανονικοποιημένο όγκο

θέασης. Τότε οι συντεταγμένες του πλαισίου οριοθέτησης είναι (−1,−1, 1)

για τα επίπεδα (l, b, n) και (1, 1,−1) για τα επίπεδα (r, t, f). Η εξίσωση που

ακολουθεί δίνει τον εξής πίνακα:

Po =

1 0 0 0

0 1 0 0

0 0 −1 0

0 0 0 1

. (4.26)

ο οποίος είναι ένας πίνακας αντικατοπτρισμού. Ο πίνακας μετασχηματι-

σμού είναι αυτός που μετατρέπει το σύστημα συντεταγμένων θέασης δε-

ξιού χεριού (το οποίο βλέπει στον αρνητικό άξονα z) σε κανονικοποιημένες

συντεταγμένες συσκευής αριστερού χεριού.

Page 49: Mars2030 Thesis Booklet

49

4.6.2 Προοπτική Προβολή

Ένας πολύ πιο ενδιαφέρον μετασχηματισμός προβολής εκτός από τον

ορθογραφικό είναι ο προοπτικός, που χρησιμοποιείται στην πλειονότητα

των εφαρμογών γραφικών Η/Υ. Εδώ οι παράλληλες γραμμές γενικότερα δεν

διατηρούνται παράλληλες μετά την προβολή, αλλά μπορεί να συγκλίνουν σε

ένα σημείο στα άκρα τους. Η προοπτική προβολή αντιπροσωπεύει σε μεγάλο

βαθμό το πως αντιλαμβανόμαστε τον κόσμο γύρω μας π.χ. τα αντικείμενα

που βρίσκονται πιο μακριά, φαίνονται μικρότερα.

Όπως και στην ορθογραφική προβολή θα χρησιμοποιήσουμε την εξάδα

(l, r, b, t, n, f), η οποία ορίζει την πυραμίδα της θέασης. Το οριζόντιο πεδίο

θέασης καθορίζεται από τη γωνία ανάμεσα στο αριστερό και στο δεξί επί-

πεδο της πυραμίδας θέασης. Κατά τον ίδιο τρόπο, το κάθετο πεδίο θέασης

καθορίζεται από τη γωνία ανάμεσα στο πάνω και στο κάτω επίπεδο. Όσο

μεγαλύτερο είναι το πεδίο θέασης, τόσο πιο μεγάλο κομμάτι της σκηνής

”βλέπει” η κάμερα.

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

σκηνής από τον παρατηρητή. Το ανθρώπινο μάτι έχει ένα φυσικό πεδίο

θέασης που η σχέση του με το οπτικό πεδίο του υπολογιστή δίνεται από τη

σχέση:

ϕ = 2arctan(w/(2d)) (4.27)

όπου ϕ είναι η γωνία που σχηματίζει το πεδίο θέασης, w είναι το πλάτος του

αντικειμένου που είναι κάθετο στην ευθεία θέασης και d είναι η απόσταση

από το αντικείμενο.

Ο πίνακας μετασχηματισμού προοπτικής προβολής που μετατρέπει την

πυραμίδα θέασης σε ένα μοναδιαίο κύβο δίνεται από την εξίσωση:

Pp =

2nr−l

0 − r+lr−l

0

0 2nt−b

− t+bt−b

0

0 0 f+nf−n

− 2fnf−n

0 0 1 0

. (4.28)

Αφού εφαρμόσουμε το μετασχηματισμό αυτό σε ένα σημείο, θα πάρουμε ένα

νέο σημείο q = (qx, qy, qz, qw)T . Η τιμή qw αυτού του σημείου θα είναι συνήθως

Page 50: Mars2030 Thesis Booklet

50

μή μηδενική και διάφορη του ενός. Για να πάρουμε το προβεβλημένο σημείο

p πρέπει να διαιρέσουμε με το qw: p = (qx/qw, qy/qw, qz/qw, 1)T . Ο πίνακας

Pp φροντίζει πάντα έτσι ώστε το z = f να χαρτογραφείται στο +1 και το

z = n στο −1. Αφού πραγματοποιηθεί η προοπτική προβολή ακολουθεί το

ψαλίδισμα και η ομογενοποίηση (διαίρεση με το w) έτσι ώστε να πάρουμε

τις κανονικοποιημένες συντεταγμένες συσκευής.

Για να πάρουμε τον προοπτικό μετασχηματισμό που χρησιμοποιείται

στην OpenGL, πρώτα πολλαπλασιάζουμε με το διάνυσμα S(1, 1,−1) για

τους ίδιους λόγους που ίσχυαν στον ορθογραφικό μετασχηματισμό. Μετά

απ’ αυτόν το μετασχηματισμό κατοπτρισμού, οι τιμές του κοντινού και μα-

κρινού επιπέδου εισάγονται ως θετικές τιμές, με 0 < n′ < f ′, όπως θα

παρουσιάζονταν παραδοσιακά στο χρήστη. Παρ’ όλα αυτά, εξακολουθούν

να αντιπροσωπεύουν αποστάσεις πάνω στον αρνητικό z άξονα του κόσμου,

που είναι η κατεύθυνση της θέασης. Ο πίνακας μετασχηματισμού προοπτι-

κής προβολής της OpenGL δίνεται από τη σχέση:

POpenGL =

2n′

r−l0 r+l

r−l0

0 2n′

t−bt+bt−b

0

0 0 −f ′+n′

f ′−n′ − 2f ′n′

f ′−n′

0 0 −1 0

. (4.29)

Page 51: Mars2030 Thesis Booklet

51

Κεφάλαιο 5

Σκίαση (Shading)

Ο όρος σκίαση αναφέρεται στην απεικόνιση του βάθους των τρισδιάστα-

των μοντέλων ή εικόνων μεταβάλλοντας τα επίπεδα της σκοτεινότητας. Εί-

ναι μία διαδικασία που χρησιμοποιείται στη ζωγραφική για την απεικόνιση

των επιπέδων της σκοτεινότητας. Στα γραφικά ηλεκτρονικών υπολογιστών

χρησιμοποιούνται ειδικοί αλγόριθμοι με τους οποίους επιτυγχάνεται αυτό

το αποτέλεσμα. Κάποιοι από αυτούς τους αλγορίθμους είναι ο αλγόριθμος

Flat Shading (Επίπεδης Σκίασης), ο αλγόριθμος του Gouraud, ο αλγόριθμος

του Phong κ.α.

Διάγραμμα 5.1: Σκίαση

5.1 Επίπεδη Σκίαση

Η επίπεδη σκίαση είναι μία τεχνική φωτισμού που χρησιμοποιείται στα

γραφικά Η/Υ για να σκιάσει κάθε πολύγωνο ενός αντικειμένου με βάση

την γωνία ανάμεσα στο κάθετο διάνυσμα της επιφάνειας του πολυγώνου

(normal vector), την κατεύθυνση της πηγής του φωτός, το χρώμα των πο-

Page 52: Mars2030 Thesis Booklet

52

λυγώνων και την ένταση της φωτεινής πηγής. Συνήθως χρησιμοποιείται σε

υψηλής ταχύτητας απόδοση γραφικών σε περίπτωση που τα πιο εξελιγμένα

μοντέλα σκίασης είναι πιο βαριά επεξεργαστικά. Ως αποτέλεσμα της επί-

πεδης σκίασης, όλες οι κορυφές όλων των πολυγώνων έχουν ένα χρώμα,

επιτρέποντας διαφοροποίηση μεταξύ γειτονικών πολυγώνων. Οι αντανα-

κλάσεις του φωτός αποδίδονται με μικρή ακρίβεια στην επίπεδη σκίαση. Αν

τύχει μία κορυφή ενός πολυγώνου να έχει μεγάλη τιμή ανακλαστικότητας,

τότε η φωτεινότητα της αντανάκλασης ζωγραφίζεται ομοιόμορφα πάνω σε

ολόκληρο το πολύγωνο.

Διάγραμμα 5.2: Παράδειγμα Επίπεδης Σκίασης

5.2 Ομαλή Σκίαση

Σε αντίθεση με την επίπεδη σκίαση, στην ομαλή σκίαση το χρώμα αλλά-

ζει από εικονοστοιχείο σε εικονοστοιχείο. Υποθέτει ότι οι επιφάνειες είναι

κοίλες και χρησιμοποιεί τεχνικές παρεμβολής για να υπολογίσει τις τιμές

του χρώματος των εικονοστοιχείων ανάμεσα στις κορυφές των πολυγώνων.

Υπάρχουν δύο κυρίαρχοι αλγόριθμοι ομαλής σκίασης:

• Σκίαση Gourdaud (Gouraud shading).

• Σκίαση Phong (Phong shading).

Page 53: Mars2030 Thesis Booklet

53

5.2.1 Το μοντέλο σκίασης του Gouraud

Η σκίαση Gouraud που πήρε το όνομά της από τον Henri Gouraud,

είναι μία μέθοδος μαθηματικής παρεμβολής που χρησιμοποιείται στα γρα-

φικά Η/Υ για να παραχθεί συνεχή σκίαση πάνω σε επιφάνειες που αντι-

προσωπεύονται από πλέγματα πολυγώνων. Στην πράξη, η σκίαση Gouraud

χρησιμοποιείται συνήθως για να επιτευχθεί συνεχής φωτισμός πάνω σε επι-

φάνειες τριγώνων υπολογίζοντας τον φωτισμό στις κορυφές κάθε τριγώνου

και παρεμβάλλοντας γραμμικά τα χρώματα που προκύπτουν για κάθε ει-

κονοστοιχείο που καλύπτεται από το τρίγωνο. Ο Gouraud δημοσίευσε για

πρώτη φορά αυτή την τεχνική το 1971.

Περιγραφή της τεχνικής.

Η σκίαση Gouraud λειτουργεί ως εξής: Ορίζεται ή υπολογίζεται (υπο-

λογίζοντας τον μέσο όρο των κάθετων διανυσμάτων επιφάνειας των πο-

λυγώνων που ”συναντώνται” σε κάθε κορυφή) μία εκτίμηση του κάθετου

διανύσματος επιφάνειας για κάθε κορυφή ενός πολυγωνικού τρισδιάστα-

του μοντέλου. Χρησιμοποιώντας αυτές τις εκτιμήσεις πραγματοποιούνται

υπολογισμοί φωτισμού, για κάθε εικονοστοιχείο που καλύπτεται από το πο-

λυγωνικό πλέγμα, βασισμένες σε ένα μαθηματικό μοντέλο φωτισμού (π.χ.

το μοντέλο φωτισμού του Phong), για να υπολογιστούν οι εντάσεις (φω-

τεινότητα) των χρωμάτων στις κορυφές. Στη συνέχεια αυτές οι χρωματικές

εντάσεις παρεμβάλλονται, συνήθως γραμμικά, μεταξύ των τιμών των χρωμά-

των που έχουν υπολογιστεί για κάθε κορυφή του πολυγωνικού πλέγματος.

Διάγραμμα 5.3: Διαφορές Επίπεδης σκίασης και σκίασης Gouraud.

Page 54: Mars2030 Thesis Booklet

54

5.2.2 Το μοντέλο σκίασης του Phong

Το μοντέλο σκίασης Phong αναφέρεται σε μία τεχνική μαθηματικής πα-

ρεμβολής για σκίαση επιφανειών στα τρισδιάστατα γραφικά Η/Υ και εί-

ναι η μέθοδος που χρησιμοποιείται στην υλοποίηση την μηχανής γραφικών

της συγκεκριμένης πτυχιακής εργασίας. Ονομάζεται επίσης σκίαση παρεμ-

βολής του Phong ή σκίαση παρεμβολής καθέτου διανύσματος επιφάνειας.

Ειδικότερα, πραγματοποιεί μαθηματική παρεμβολή καθέτων διανυσμάτων

επιφάνειας κατά μήκος rasterized πολυγώνων και υπολογίζει το χρώμα του

εικονοστοιχείου με βάση τα παρεμβεβλημένα κάθετα διανύσματα επιφά-

νειας και ένα μοντέλο αντανάκλασης.

Ιστορικά στοιχεία

Η σκίαση και το μοντέλο αντανάκλασης του Phong αναπτύχθηκαν στο

πανεπιστήμιου της Γιούτα από τον Bui Tuong Phong, ο οποίος τις δημο-

σίευσε το 1973 στη διατριβή του διδακτορικού του. Οι μέθοδοι του Phong

θεωρούνταν ριζοσπαστικές όταν πρωτοεισήχθικαν στον χώρο, αλλά πλέον

έχουν γίνει η βάση για τις μεθόδους σκίασης πολλών εφαρμογών απόδοσης

γραφικών. Οι μέθοδοι του Phong έγιναν διάσημες για την αποτελεσματική

αξιοποίηση του χρόνου επεξεργασίας ανά αποδιδόμενο εικονοστοιχείο.

Η μαθηματική παρεμβολή του Phong

Η σκίαση Phong βελτιώνει τη σκίαση Gouraud μία καλύτερη προσέγγιση

στη σκίαση ομαλών επιφανειών. Η σκίαση Phong υποθέτει ένα ομαλά με-

ταβαλλόμενο κάθετο διάνυσμα επιφάνειας και η παρεμβολή της λειτουργεί

καλύτερα από την παρεμβολή του Gouraud όταν εφαρμοστεί σε ένα μοντέλο

φωτισμού με μικρούς κατοπτρικούς τόνους όπως το μοντέλο φωτισμού του

Phong.

Το μεγαλύτερο πρόβλημα με τη σκίαση Gouraud συναντάται όταν οι

κατοπτρικοί τόνοι προκύπτουν στη μέση ενός μεγάλου πολυγώνου. Επειδή

αυτοί οι κατοπτρικοί τόνοι απουσιάζουν από τις κορυφές του πολυγώνου

και η σκίαση Gouraud πραγματοποιεί μαθηματική παρεμβολή με βάση τα

Page 55: Mars2030 Thesis Booklet

55

χρώματα των κορυφών, οι κατοπτρικοί τόνοι θα λείπουν από το εσωτερικό

του πολυγώνου. Αυτό το πρόβλημα λύνεται από τη σκίαση Phong.

Σε αντίθεση με τη σκίαση Gouraud που πραγματοποιεί παρεμβολή στα

χρώματα των κορυφών κατά μήκος των πολυγώνων, η σκίαση Phong πραγ-

ματοποιεί γραμμική παρεμβολή σε ένα κάθετο διάνυσμα επιφάνειας από

τις κορυφές του πολυγώνου και κατά μήκος της επιφάνειας του. Το κάθετο

διάνυσμα επιφάνειας παρεμβάλλεται και κανονικοποιείται σε κάθε εικο-

νοστοιχείο και έπειτα χρησιμοποιείται σε ένα μοντέλο αντανάκλασης έτσι

ώστε να υπολογιστεί το τελικό χρώμα του εικονοστοιχείου. Η σκίαση Phong

είναι πιο ακριβή επεξεργαστικά από τη σκίαση Gouraud καθώς το μοντέλο

αντανάκλασης πρέπει να υπολογιστεί για κάθε εικονοστοιχείο αντί για κάθε

κορυφή. Πλέον διάφορες εκδοχές αυτών των αλγορίθμων σκίασης πραγμα-

τοποιούνται σε επίπεδο υλικού χρησιμοποιώντας προγράμματα σκίασης.

Το μοντέλο φωτισμού του Phong

Το μοντέλο φωτισμού του Phong είναι ένα εμπειρικό μοντέλο τοπικού

φωτισμού. Περιγράφει τον τρόπο που μία επιφάνεια αντανακλά το φως ως

συνδυασμό της αντανάκλασης του διαχυτικού φωτός των ανώμαλων επιφα-

νειών, με την κατοπτρική αντανάκλαση των γυαλιστερών επιφανειών. Βα-

σίζεται στην άτυπη παρατήρηση του Phong ότι οι γυαλιστερές επιφάνειες

έχουν μικρούς και έντονους κατοπτρικούς τόνους, ενώ η ανώμαλες επιφά-

νειες έχουν μεγάλους κατοπτρικούς τόνους που μειώνονται πιο σταδιακά.

Το μοντέλο αυτό περιλαμβάνει επίσης ένα όρο που αφορά τον φωτισμό που

προέρχεται από το γενικότερο περιβάλλον στο οποίο βρίσκεται το αντικεί-

μενο.

Διάγραμμα 5.4: Οπτική αναπαράσταση της εξίσωσης του Phong.

Page 56: Mars2030 Thesis Booklet

56

Κεφάλαιο 6

Χαρτογράφηση Σκιών

Η χαρτογράφηση σκιών ή προβολική σκίαση είναι μία διαδικασία κατά

την οποία προστίθενται σκιές στα τρισδιάστατα γραφικά Η/Υ. Αυτή η έν-

νοια εισήχθη για πρώτη φορά από τον Λανς Γουίλιαμς (Lance Williams)

το 1978, σε μία επιστημονική μελέτη με τίτλο ”Casting curved shadows on

curves surfaces”. Από τότε και μετά μέθοδος αυτή έχει χρησιμοποιηθεί σε

προ αποδιδόμενες σκηνές αλλά και σε σκηνές πραγματικού χρόνου σε πολλά

βιντεοπαιχνίδια Η/Υ και κονσολών. Οι σκιές δημιουργούνται δοκιμάζοντας

αν το εικονοστοιχείο είναι θεατό από την πηγή φωτός, συγκρίνοντάς το με

έναν απομονωτή Ζ ή μία εικόνα βάθους δημιουργημένα από το σημείο θέα-

σης του φωτός, τα οποία είναι αποθηκευμένα σε μία εικόνα υφής.

6.1 Αλγόριθμος Σκιών του Απομονωτή Ζ (Z-buffer

Shadows)

Η απόδοση μίας σκιασμένης σκηνής περιλαμβάνει δύο κύρια βήματα. Το

πρώτο παράγει τον χάρτη σκιών και το δεύτερο τον εφαρμόζει στην σκηνή.

Ανάλογα με την υλοποίηση (και τον αριθμό των πηγών φωτός), μπορεί να

χρειαστούν δύο η περισσότερα περάσματα απόδοσης της σκηνής.

Page 57: Mars2030 Thesis Booklet

57

6.1.1 Δημιουργώντας το χάρτη σκιών

Το πρώτο βήμα αποδίδει την σκηνή από το σημείο θέασης του φω-

τός. Για ένα σημειακό φως, πρέπει να χρησιμοποιηθεί προοπτική προβολή

με πεδίο θέασης τόσο μεγάλο όσο χρειάζεται για να επιτευχθεί το επιθυ-

μητό αποτέλεσμα. Από αυτήν την απόδοση εξάγεται και αποθηκεύεται ο

απομονωτής βάθους. Επειδή μόνο η πληροφορία βάθους είναι απαραίτητη,

συνηθίζεται να αποφεύγεται η ενημέρωση των απομονωτών χρώματος όπως

επίσης συνηθίζεται η απενεργοποίηση του φωτισμού και των υπολογισμών

χαρτογράφησης υφής γι’ αυτήν την απόδοση, με σκοπό να εξοικονομηθεί

χρόνος. Αυτός ο χάρτης βάθους συνήθως αποθηκεύεται ως μία εικόνα υφής

στην μνήμη της κάρτας γραφικών.

Διάγραμμα 6.1: Χαρτογράφηση Σκιών

Ο χάρτης βάθους πρέπει να ενημερώνεται κάθε φορά που υπάρχει αλ-

λαγή είτε στο φως είτε σε αντικείμενα της σκηνής, αλλά μπορεί να επα-

ναχρησιμοποιηθεί σε άλλες περιπτώσεις, όπως όταν μετακινείται μόνο το

σημείο θέασης του παρατηρητή. (Αν υπάρχουν πολλαπλά φώτα στην σκηνή

πρέπει να χρησιμοποιηθεί ένας ξεχωριστός χάρτης βάθους για κάθε πηγή

φωτός.)

Σε πολλές υλοποιήσεις είναι πρακτικό να αποδοθεί μόνο ένα υποσύνολο

των αντικειμένων της σκηνής στον χάρτη σκίασης για να εξοικονομηθεί μέρος

του χρόνου που χρειάζεται για να επαναποδοθεί ο χάρτης. Επίσης, μπορεί

να εφαρμοστεί στον χάρτη σκίασης μία μικρή μετατόπιση βάθους η οποία

μετακινεί τα αντικείμενα μακριά από την πηγή φωτός στην προσπάθεια

να επιλυθούν προβλήματα εφαρμογής των σκιών στα αντικείμενα (Peter

Panning) και ακμής σκίασης (shadow acne) που δημιουργούνται όταν οι

Page 58: Mars2030 Thesis Booklet

58

τιμές του χάρτη σκίασης είναι πολύ κοντά στο βάθος της επιφάνειας που θα

ζωγραφιστεί στο επόμενο βήμα. Εναλλακτικά, μπορούν να αφαιρεθούν τα

μετωπικά πολύγωνα και να αποδοθούν μόνο τα πίσω στον χάρτη σκίασης

για να επιτευχθεί παρόμοιο αποτέλεσμα.

Διάγραμμα 6.2: Αφαίρεση μετωπικών πολυγώνων για την αποφυγή των προβλη-

μάτων της ακμής σκίασης και της εφαρμογής των σκιών

6.1.2 Η Σκίαση της Σκηνής

Το δεύτερο βήμα είναι να αποδοθεί η σκηνή από το σημείο θέασης της

κάμερας, εφαρμόζοντας το χάρτη σκίασης. Αυτή η διαδικασία αποτελείται

από τρία βασικά συστατικά, το πρώτο είναι να βρεθούν οι συντεταγμένες

του αντικειμένου από το σημείο θέσης του φωτός, το δεύτερο είναι η δοκιμή

που συγκρίνει αυτή τη συντεταγμένη με το χάρτη βάθους και τέλος να ληφθεί

απόφαση για το αν το αντικείμενο θα αποδοθεί υπό σκιά η φωτισμένο.

Συντεταγμένες στον Χώρο του Φωτός

Για να μπορέσει να πραγματοποιηθεί η δοκιμή ενός σημείου με τον

χάρτη βάθους, η θέση του από συντεταγμένες σκηνής πρέπει να μετασχη-

ματιστεί σε μία ισάξια θέση, όπως θα φαινότανε από το σημείο θέασης του

φωτός. Αυτό επιτυγχάνεται χρησιμοποιώντας πολλαπλασιασμό πινάκων. Η

θέση του αντικειμένου στην οθόνη προσδιορίζεται από τον γνωστό μετα-

σχηματισμό των συντεταγμένων του, αλλά για να προσδιοριστεί η θέση του

αντικειμένου στο χώρο του φωτός, πρέπει να δημιουργηθεί ένα δεύτερο σετ

συντεταγμένων.

Page 59: Mars2030 Thesis Booklet

59

Διάγραμμα 6.3: Χάρτης βάθους της σκηνής από το σημείο θέασης του φωτός

Ο πίνακας μετασχηματισμού που χρησιμοποιείται για να μετασχηματί-

σει τις συντεταγμένες από χώρο του κόσμου σε συντεταγμένες στον χώρο

του φωτός είναι ο ίδιος με αυτόν που χρησιμοποιήθηκε για να αποδοθεί ο

χάρτης σκιών στο πρώτο βήμα. Αυτή η διαδικασία θα παράγει ένα σετ ομο-

γενών συντεταγμένων που χρειάζονται προοπτική διαίρεση (διαίρεση του

x, y, z με το w) για να μετατραπούν σε κανοκινοποιημένες συντεταγμένες

συσκευής, στις οποίες κάθε τιμή του σημείου (x, y ή z) πέφτει ανάμεσα

στο −1 και το 1 (αν είναι ορατό από το σημείο θέασης του φωτός). Πολλές

υλοποιήσεις (όπως της OpenGL και του Direct3D) χρειάζονται έναν επιπρό-

σθετο μετασχηματισμό κλιμάκωσης έτσι ώστε να χαρτογραφηθούν οι τιμές

που βρίσκονται ανάμεσα στο −1 και το 1, στο διάστημα 0 έως 1 που εί-

ναι και οι συνήθεις συντεταγμένες για την αναζήτηση των εικονοστοιχείων

του χάρτη βάθους. Αυτή η κλιμάκωση μπορεί να πραγματοποιηθεί πριν την

προοπτική διαίρεση και μπορεί εύκολα να συνενωθεί με τον προηγούμενο

μετασχηματισμό πολλαπλασιάζοντάς τον με τον ακόλουθο πίνακα:0.5 0 0 0.5

0 0.5 0 0.5

0 0 0.5 0.5

0 0 0 1

(6.1)

Αν αυτή η διαδικασία πραγματοποιηθεί με ένα πρόγραμμα σκίασης (shader),

ή άλλη επέκταση υλικού γραφικών, ο μετασχηματισμός θα πραγματοποιού-

νταν σε επίπεδο επεξεργασίας των κορυφών (vertex level) και η τιμή που

υπολογίζεται παρεμβάλλεται μαθηματικά ανάμεσα στις άλλες κορυφές και

περνάει στο επίπεδο επεξεργασίας των τεμαχίων (fragment level).

Page 60: Mars2030 Thesis Booklet

60

Η Δοκιμή με τον Χάρτη Βάθους

Αφού υπολογιστούν οι συντεταγμένες του αντικειμένου στο χώρο του

φωτός, οι τιμές x και y συνήθως αντιστοιχούν σε μία τοποθεσία μέσα στον

χάρτη βάθους και η τιμή z αντιστοιχεί στο ανάλογο βάθος το οποίο μπορεί

να συγκριθεί με την τιμή του χάρτη βάθους. Αν η τιμή z του μετασχηματισμέ-

νου αντικειμένου είναι μεγαλύτερη από την τιμή που είναι αποθηκευμένη

στο χάρτη βάθους, τότε το αντικείμενο θεωρείται ότι καλύπτεται από κά-

ποιο άλλο, η δοκιμή θεωρείται ότι απέτυχε και συνεπώς το αντικείμενο θα

αποδοθεί υπό σκιά. Διαφορετικά θα ζωγραφιστεί φωτισμένο. Αν η (x, y)

τοποθεσία πέσει έξω από τα όρια του χάρτη βάθους, ο προγραμματιστής

πρέπει να αποφασίσει για το αν το αντικείμενο πρέπει να φωτιστεί η όχι

στο σημείο εκείνο (συνήθως φωτίζεται).

Η Απόδοση της Σκηνής

Η απόδοση της σκηνής με σκιές μπορεί να γίνει με πολλούς διάφορους

τρόπους. Ο κυριότερος από αυτούς είναι χρησιμοποιώντας προγράμματα

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

σκίασης τεμαχίων (fragment shader) το οποίο απλά αποδίδει το αντικείμενο

φωτισμένο ή υπό σκιά ανάλογα με το αποτέλεσμα της δοκιμής, ζωγραφί-

ζοντας τη σκηνή με ένα πέρασμα (αφού προηγηθεί ένα πέρασμα για να

δημιουργηθεί ο χάρτης σκιών).

Page 61: Mars2030 Thesis Booklet

61

Κεφάλαιο 7

Χαρτογράφηση Κύβου

Στα γραφικά Η/Υ, η χαρτογράφηση κύβου είναι μία μέθοδος χαρτογρά-

φησης περιβάλλοντος η οποία χρησιμοποιεί τις έξι πλευρές ενός κύβου ως

το σχήμα του χάρτη. Το περιβάλλον προβάλλεται πάνω στις πλευρές του κύ-

βου και αποθηκεύεται ως έξι εικόνες υφής (textures) ή ως έξι περιοχές της

ίδιας εικόνας υφής. Ο χάρτης κύβου δημιουργείται αποδίδοντας της σκηνή

έξι φορές από ένα σημείο θέασης, με την κάθε θέα να ορίζεται από μία

κόλουρη πυραμίδα με πεδίο θέασης 90 μοιρών και να αντιπροσωπεύει μία

πλευρά του κύβου.

7.0.1 Εφαρμογές της Χαρτογράφησης Κύβου

Η χαρτογράφηση κύβου έχει πολλές εφαρμογές στα γραφικά των Η/Υ.

Στην πτυχιακή αυτή εργασία χρησιμοποιούνται δύο από τις κυριότερες:

• Skyboxes

• Χαρτογράφηση Αντανακλάσεων

Skyboxes

Ίσως μία από τις πιο εξελιγμένες εφαρμογές της χαρτογράφησης κύβου

είναι η δημιουργία προαποδιδόμενων πανοραμικών εικόνων περιβάλλοντος

οι οποίες αποδίδονται από τη μηχανή γραφικών ως οι πλευρές ενός κύβου

σε πρακτικά άπειρη απόσταση, με το πεδίο θέασης να βρίσκεται στο κέντρο

Page 62: Mars2030 Thesis Booklet

62

του κύβου. Η προοπτική προβολή των πλευρών του κύβου που πραγματο-

ποιείται από τη μηχανή γραφικών αντιστρέφει τη διαδικασία που χρειά-

στηκε για να δημιουργηθεί ο χάρτης κύβου (προβολή του περιβάλλοντος σε

έξι πλευρές ενός κύβου), με αποτέλεσμα ο παρατηρητής να αισθάνεται την

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

τη δημιουργία του skybox. Αυτή η τεχνική έχει ευρεία χρήση στα βιντεοπαι-

χνίδια μιας και επιτρέπει τους σχεδιαστές να προσθέσουν πολύπλοκα (και

απρόσιτα) περιβάλλοντα σε ένα παιχνίδι με σχεδόν μηδενικό κόστος στην

απόδοση της μηχανής γραφικών.

Διάγραμμα 7.1: Παράδειγμα ενός skybox

Χαρτογράφηση Αντανακλάσεων

Η χαρτογράφηση αντανακλάσεων ή χαρτογράφηση περιβάλλοντος είναι

μία αποτελεσματική τεχνική φωτισμού βασισμένη σε εικόνες για την προ-

σέγγιση της εμφάνισης μίας ανακλαστικής επιφάνειας χρησιμοποιώντας μία

προϋπολογισμένη εικόνα υφής. Γενικότερα, για την χαρτογράφηση αντα-

νακλάσεων χρησιμοποιείται το ίδιο skybox που χρησιμοποιείται για την

απόδοση των εξωτερικών χώρων. Οι αντανακλάσεις χαρτογράφησης κύβου

πραγματοποιούνται προσδιορίζοντας το διάνυσμα της θέασης προς το αντι-

κείμενο. Θεωρείται μία ευθεία (ακτίνα) από το σημείο θέασης μέχρι το αντι-

κείμενο και υπολογίζεται η αντανάκλασή της με βάση το κάθετο διάνυσμα

επιφάνειας στο σημείο πρόσπτωσης της ακτίνας με το αντικείμενο. Αυτό

Page 63: Mars2030 Thesis Booklet

63

έχει ως αποτέλεσμα την ανακλώμενη ακτίνα η οποία δείχνει πιο εικονο-

στοιχείο του χάρτη κύβου θα δώσει το χρώμα του στο αντικείμενο κατά τον

υπολογισμό του φωτισμού. Αυτή η διαδικασία δημιουργεί την ψευδαίσθηση

ότι το αντικείμενο είναι ανακλαστικό.

Διάγραμμα 7.2: Αναπαράσταση του αλγορίθμου χαρτογράφησης αντανακλάσεων

Page 64: Mars2030 Thesis Booklet

64

Κεφάλαιο 8

Το βιντεοπαιχνίδι MARS2030

8.0.1 Τρόπος παιχνιδιού

Το βιντεοπαιχνίδι MARS2030 είναι ένα παιχνίδι πρώτου προσώπου, σχε-

διασμένο με την απλότητα ως κύριο στοιχείο στον τομέα του τρόπου παιχνι-

διού και κύριο σκοπό έχει την επίδειξη των ικανοτήτων της κάρτας γραφικών

και των αλγορίθμων γραφικών που θα εφαρμοστούν έχοντας ως μέσο διε-

παφής την OpenGL. Σκοπός του παιχνιδιού είναι να υπερασπιστεί ο παίχτης

το διαστημικό του σκάφος από εχθρούς που κινούνται προς το μέρος του,

πριν αυτοί καταφέρουν να συγκρουστούν μαζί του. Αυτό επιτυγχάνεται με

τη χρήση του οπλικού συστήματος του σκάφους και με τη χρήση ενός ολο-

γραφικού χάρτη για τον εντοπισμό των εχθρών. Η ακεραιότητα του σκάφους

ορίζεται από ένα ακέραιο αριθμό με μέγιστη τιμή το 100 και ελάχιστη το

0. Αυτή η τιμή μειώνεται κάθε φορά που κάποιος εχθρός συγκρούεται με

το σκάφος του παίχτη. Αν η τιμή της ακεραιότητας του παίχτη φτάσει στο

0 τότε το σκάφος καταστρέφεται και το παιχνίδι τελειώνει. Η λειτουργία

του οπλικού συστήματος του σκάφους εξαρτάται και αυτό από μία ακέραια

τιμή η οποία αντιπροσωπεύει το ποσοστό της θερμοκρασίας που έχει ανα-

πτυχθεί στο οπλικό σύστημα. Η τιμή θερμοκρασίας αυξάνεται εκθετικά όσο

ο παίχτης πυροβολεί και μειώνεται γραμμικά όσο ο παίχτης δεν πυροβολεί.

Αν η τιμή αυτή φτάσει το 100 τότε το οπλικό σύστημα υπερθερμαίνεται

και ο παίχτης πρέπει να περιμένει το σύστημα να επανέλθει σε μηδενικό

ποσοστό θερμοκρασίας. Για να διευκολυνθεί ο παίχτης το οπλικό σύστημα

Page 65: Mars2030 Thesis Booklet

65

έχει εγκατεστημένο ένα σύστημα ψύξης το οποίο έχει 3 διαθέσιμες χρή-

σεις. Το οπλικό σύστημα αποκτά μία καινούρια χρήση ψυκτικού ανά 30

δευτερόλεπτα.

8.0.2 Τεχνολογίες που Χρησιμοποιήθηκαν

Στη συγκεκριμένη πτυχιακή εργασία χρησιμοποιήθηκαν οι εξής τεχνο-

λογίες - αλγόριθμοι (μερικές από τι οποίες αναλύονται στα παραπάνω κε-

φάλαια):

• Χαρτογράφηση υφής (Texture Mapping).

• Χαρτογράφηση καθέτων διανυσμάτων επιφάνειας (Normal Mapping).

• Σκίαση Phong (Phong Shading).

• Σκιές πραγματικού χρόνου χρησιμοποιώντας τον αλγόριθμό του απο-

μονωτή Ζ (Z-buffer shadows).

• Εξομάλυνση των σκιών πραγματικού χρόνου με την χρήση του αλ-

γορίθμου φιλτραρίσματος πλησιέστερου ποσοστού (Percentage-Closer

Filtering - PCF).

• Δημιουργία Skybox με τη χρήση χαρτογράφησης κύβου (Cube Mapping).

• Χαρτογράφηση αντανακλάσεων (Reflection/Environment Mapping) με

τη χρήση χαρτογράφησης κύβου (Cube Mapping).

• Υπολογισμός και χρήση του όρου του Fresnel (Fresnel Term) για τον

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

• Εντοπισμός συγκρούσεων με υπολογισμό τομής σφαίρας-κάψουλας

(sphere-capsule collision detection).

• Αντιμετώπιση της ψευδωνυμίας (aliasing) των γραφικών χρησιμοποιώ-

ντας τον αλγόριθμό FSAA (Full Scene Anti Aliasing).

• Aλγόριθμος θορύβου (Simplex Noise).

Page 66: Mars2030 Thesis Booklet

66

• Σύστημα σωματιδίων (Particle System).

• Προγράμματα σκίασης (Shaders).

• Διόρθωση φωτεινότητας (Gamma Correction).

8.0.3 Τεχνική Ανάλυση της Μηχανής Γραφικών

Σε αυτό το σημείο θα γίνει μία τεχνική ανάλυση και επεξήγηση των βα-

σικών κλάσεων της μηχανής γραφικών. Ακολουθεί το διάγραμμα κλάσεων:

Διάγραμμα 8.1: Διάγραμμα Κλάσεων της Μηχανής του Βιντεοπαιχνιδιού

Page 67: Mars2030 Thesis Booklet

67

Πίνακας 8.1: Πίνακας βιβλιοθηκών που χρησιμοποιήθηκαν.

Όνομα Περιγραφή

vmath Μαθηματική βιβλιοθήκη.

ncf Βιβλιοθήκη φόρτωσης-αποθήκευσης

αρχείων ρύθμισης.

libpng, libjpeg Βιβλιοθήκες φόρτωσης-

αποθήκευσης εικόνων με συμπίεση

png, jpeg.

libimago Βιβλιοθήκη φόρτωσης-αποθήκευσης

εικόνων.

libdrawtext Βιβλιοθήκη απόδοσης γραμματο-

σειρών στην OpenGL.

libvorbis Βιβλιοθήκη κωδικοποίησης-

αποκωδικοποίησης vorbis για

αρχεία ήχου.

ogg Βιβλιοθήκη διαχείρισης των ogg

containers.

zlib Βιβλιοθήκη συμπίεσης-

αποσυμπίεσης αρχείων.

OpenAL Βιβλιοθήκη διεπαφής με την κάρτα

ήχου.

Page 68: Mars2030 Thesis Booklet

68

Class Animation

Η κλάση Animation περιέχει τα δεδομένα που περιγράφουν ένα animation.

Τα animations λειτουργούν με την χρήση keyframes τα οποία περιγράφουν

την θέση, περιστροφή και κλιμάκωση ενός αντικειμένου σε μία δεδομένη

χρονική στιγμή. Για να μπορέσει να φανεί ότι ένα animation έχει ομαλή

συνέχεια και ότι δεν μεταπηδά απότομα από το ένα keyframe στο επόμενο,

χρησιμοποιούνται μαθηματικές παρεμβολές για να υπολογιστούν η θέση, η

περιστροφή και η κλιμάκωση του αντικειμένου σε χρονικές στιγμές που δεν

αντιστοιχούν σε αυτές των keyframes.

Η κλάση περιέχει τρεις std::vector καθένας από τους οποίους αντι-

προσωπεύει τα keyframes θέσης, περιστροφής και κλιμάκωσης του animation.

Τα struct είναι τα εξής:

1 s t r u c t KeyframeVec3

2 {

3 Vector3 v ;

4 long time ;

5 KeyframeVec3 ( ) ;

6 KeyframeVec3 ( const Vector3 &v , long time ) ;

7 bool operator <( const KeyframeVec3 &key2 ) const ;

8 } ;

9

10 s t r u c t KeyframeQuat

11 {

12 Quaternion r ;

13 long time ;

14 KeyframeQuat ( ) ;

15 KeyframeQuat ( const Quaternion &r , long time ) ;

16 bool operator <( const KeyframeQuat &key2 ) const ;

17 } ;

Το struct KeyframeVec3 περιγράφει ένα keyframe που θα χρησιμο-

ποιούνταν για την περιγραφή της θέσης ή της κλιμάκωσης ενός αντικειμέ-

νου. Περιέχει ένα τρισδιάστατο διάνυσμα τύπου Vector3 το οποίο στην

περίπτωση της μετακίνησης αντιπροσωπεύει τη θέση του αντικειμένου στον

τρισδιάστατο χώρο, ενώ στην περίπτωση της κλιμάκωσης αντιπροσωπεύει

Page 69: Mars2030 Thesis Booklet

69

το ποσοστό της κλιμάκωσης του αντικειμένου σε κάθε άξονα.

Το struct KeyframeQuat περιγράφει ένα keyframe περιστροφής. Πε-

ριέχει ένα τετραδόνιο τύπου Quaternion το οποίο αντιπροσωπεύει την

περιστροφή του αντικειμένου στον τρισδιάστατο χώρο.

Και τα δύο struct περιέχουν έναν ακέραιο αριθμό τύπου long που

αντιπροσωπεύει τη χρονική στιγμή που αντιστοιχεί το κάθε keyframe.

Class XFormNode

Η μηχανή γραφικών αυτής της πτυχιακής εργασίας θεωρεί ότι οποιοδή-

ποτε αντικείμενο πρόκειται να υποστεί μετασχηματισμό στον χώρο (μετακί-

νηση, περιστροφή, κλιμάκωση) είναι ένα transformation node (XFormNode)

και χρησιμοποιεί το μοντέλο του ιεραρχικού animation. Σε περίπτωση πολύ-

πλοκων τρισδιάστατων μοντέλων, όταν αυτά εμπεριέχουν κάποιο animation,

δημιουργείται μία ιεραρχία από nodes με κάθε node να έχει τα δικά του

animation keyframes και κάθε child node να κληρονομεί το animation του

parent node.

Η κλάση XFormNode είναι υπεύθυνη για τον χειρισμό των μετασχηματι-

σμών των αντικειμένων στον τρισδιάστατο χώρο. Κάθε XFormNode έχει ένα

όνομα τύπου std::string, ένα std::vector από Animation pointers

που αντιπροσωπεύουν το σύνολο των animations που έχει το συγκεκριμένο

transformation node, έναν αριθμό τύπου unsigned int ο οποίος αντιπρο-

σωπεύει το τρέχον ενεργό animation του node, ένα πίνακα μετασχηματι-

σμού τύπου Matrix4x4 στον οποίο χρησιμοποιώντας συνένωση μετασχη-

ματισμών συγκεντρώνονται όλοι οι μετασχηματισμοί του αντικειμένου σε

μία συγκεκριμένη χρονική στιγμή, έναν ακόμα πίνακα μετασχηματισμού τύ-

που Matrix4x4 που χρησιμοποιείται για την προσθήκη ενός επιπρόσθετου

μετασχηματισμού που επηρεάζει μόνο το συγκεκριμένο node, έναν pointer

τύπου XFormNode ο οποίος δείχνει στον parent του node αν αυτός υπάρχει,

ένα std::vector από pointers σε XFormNode που περιέχει τους pointers

που δείχνουν σε όλα τα children που έχει ένα node στην ιεραρχία και τέλος

έναν αριθμό τύπου unsigned int που περιγράφει τον τύπου του node,

δηλαδή αν είναι object, light, camera, particle system emitter, entity ή απλά

Page 70: Mars2030 Thesis Booklet

70

ένα απλό node.

Η κλάση παρέχει τη δυνατότητα να υπολογιστεί η θέση, η περιστροφή

και κλιμάκωση του node σε οποιαδήποτε χρονική στιγμή με τις συναρτήσεις:

1 v i r t u a l Vector3 ge t _po s i t i on ( long time = 0) ;

2 v i r t u a l Quaternion ge t _ r o t a t i on ( long time = 0) ;

3 v i r t u a l Vector3 g e t _ s c a l i ng ( long time = 0) ;

αντίστοιχα. Οι συναρτήσεις αυτές χρησιμοποιούν γραμμική παρεμβολή (lerp)

για τον υπολογισμό της θέσης και της κλιμάκωσης, ενώ για τον υπολογισμό

του τετραδονίου περιστροφής χρησιμοποιεί σφαιρική γραμμική παρεμβολή

(slerp).

Η κλάση παρέχει επίσης τη δυνατότητα να θέσει ο χρήστης της συγκε-

κριμένα keyframes θέσης, περιστροφής ή κλιμάκωσης στο default animation

του node (animation index 0 στο vector των animations) χρησιμοποιώντας

τις εξής συναρτήσεις:

1 v i r t u a l void s e t _po s i t i on ( const Vector3 &pos , long time = 0) ;

2 v i r t u a l void s e t _ r o t a t i o n ( const Vector3 &axis , f l o a t angle , long

time = 0) ;

3 v i r t u a l void s e t _ r o t a t i o n ( const Quaternion &rot , long time = 0) ;

4 v i r t u a l void s e t _ s c a l i n g ( const Vector3 &sca l e , long time = 0) ;

Μία από τις ποιό σημαντικές συναρτήσεις της κλάσης είναι η:

1 v i r t u a l void ca l c_mat r ix ( long time = 0) ;

Η οποία υπολογίζει τον πίνακα μετασχηματισμού που περιέχει τη συνένωση

των μετασχηματισμών θέσης, περιστροφής και κλιμάκωσης για μία συγκε-

κριμένη χρονική στιγμή λαμβάνοντας υπόψιν της το αν υπάρχει parent node

στο τρέχον node. Η συνάρτηση υλοποιείται ως εξής:

1 void XFormNode : : ca l c_mat r i x ( long time )

2 {

3 Vector3 tmp_pos ;

4 Quaternion tmp_rot ;

5 Vector3 tmp_scal ing ;

6

7 long t = ( time − anim_star t_ t ime ) * get_anim_speed ( ) ;

8

Page 71: Mars2030 Thesis Booklet

71

9 tmp_pos = ge t _po s i t i on ( t ) ;

10 tmp_rot = ge t _ r o t a t i on ( t ) . normalized ( ) ;

11 tmp_scal ing = ge t _ s c a l i ng ( t ) ;

12

13 xform_mat . r e s e t _ i d e n t i t y ( ) ;

14 xform_mat . t r a n s l a t e ( tmp_pos ) ;

15 xform_mat . r o t a t e ( tmp_rot ) ;

16 xform_mat . s c a l e ( Vector4 ( tmp_scal ing ) ) ;

17 xform_mat = loca l_mat * xform_mat ;

18

19 i f ( parent ) {

20 xform_mat = parent−>xform_mat * xform_mat ;

21 }

22 }

Η κλάση XFormNode αποτελεί την base class για πολλές από τις κλάσεις

που θα μιλήσουμε στη συνέχεια και αποτελεί μαζί με τις κλάσεις Animation,

Mesh και Material τον πυρήνα της μηχανής γραφικών.

Class Mesh

Η κλάση Mesh αντιπροσωπεύει και διαχειρίζεται τον τρόπο απόδοσης

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

VBOs (Vertex Buffer Objects) για τη μεταφορά των δεδομένων της γεωμε-

τρίας των αντικειμένων στην κάρτα γραφικών και χρησιμοποιεί το τρίγωνο

ως βασικό γεωμετρικό σχήμα για την απόδοσή τους. Χρησιμοποιείται επίσης

indexed drawing για την απόδοση της γεωμετρίας. Το indexed drawing είναι

μία τεχνική με την οποία αντί να αποθηκεύουμε στο VBO τις ίδιες κορυφές

περισσότερες από μία φορές σε περίπτωση που δύο πολύγωνα μοιράζονται

την ίδια πλευρά, χρησιμοποιούνται αριθμοί οι οποίοι αντιστοιχίζονται με

τις κορυφές και σε περίπτωση επαναχρησιμοποίησης αναφερόμαστε σε ήδη

υπάρχοντες κορυφές με το index τους. Με αυτή την τεχνική μειώνεται η

χρήση μνήμης και αυξάνεται σημαντικά η απόδοση της μηχανής διότι μειώ-

νεται ο αριθμός των γεωμετρικών δεδομένων που πρέπει να διαχειριστεί η

κάρτα γραφικών σε κάθε frame.

Page 72: Mars2030 Thesis Booklet

72

Διάγραμμα 8.2: Παράδειγμα της τεχνικής Indexed Drawing.

Class Texture

Η κλάση Texture είναι υπεύθυνη για το φόρτωμα και τη διαχείριση

και την αρχικοποίηση της κατάστασης (state) της OpenGL για τις εικόνες

χαρτογράφησης υφής. Οι καταστάσεις της OpenGL μπορεί να είναι για

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

(GL_LINEAR ή GL_NEAREST) ή ο τρόπος αναδίπλωσης τους (GL_REPEAT,

GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER κ.α.). Οι εικόνες χαρτο-

γράφησης υφής μπορεί να είναι μονοδιάστατες (1D Textures), δισδιάστατες

(2D Textures), τρισδιάστατες (3D Textures) και cubemaps.

Class Material

Η κλάση Material είναι υπεύθυνη για τη διαχείριση του υλικού (υφής)

ενός αντικειμένου. Το υλικό ενός αντικείμενου αποτελείται από το διαχυ-

τικό και το ανακλαστικό χρώμα του (diffuse και specular color), το ποσο-

στό ανακλαστικότητάς του (shininess), τις εικόνες χαρτογράφησης υφής του

αντικειμένου (diffuse και specular map) και την εικόνα χαρτογράφησης κα-

θέτων διανυσμάτων επιφάνειας (normal map) η οποία χρησιμοποιείται για

να δημιουργηθεί η ψευδαίσθηση ότι το αντικείμενο είναι ανάγλυφο. Κύρια

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

στο πρόγραμμα σκίασης που είναι ενεργό τη στιγμή της απόδοσης του αντι-

κειμένου, έτσι ώστε να υπολογιστεί ο φωτισμός, τα χρώματα και η υφή του.

Page 73: Mars2030 Thesis Booklet

73

Class Object

Η κλάση Object κληρονομεί τη βασική κλάση XFormNode και αντιπρο-

σωπεύει ένα αντικείμενο στο χώρο το οποίο μπορεί να είναι τμήμα μίας

μεγαλύτερης σκηνής. Περιέχει ένα δείκτη τύπου Mesh, γεγονός που της

δίνει τη δυνατότητα να διαχειρίζεται τη θέση αυτής της γεωμετρίας στο

χώρο, και ένα υλικό τύπου Material το οποίο θα προσδώσει την ανάλογη

υφή στο αντικείμενο. Αξίζει να σημειωθεί ότι η κλάση αυτή δεν είναι εξαρ-

χής υπεύθυνη για τη διαχείριση της μνήμης που δεσμεύεται για τον δείκτη

Mesh, αλλά καθίσταται υπεύθυνη αν τεθεί η σημαία τύπου bool με όνομα

mesh_ownership στην κατάσταση true. Αν η απόδοση ενός συγκεκριμένου

αντικειμένου (είτε αυτό ανήκει σε μία ιεραρχία άλλων αντικειμένων είτε

όχι) απαιτεί ειδική μεταχείριση, η κλάση μπορεί να δεχτεί ένα εξειδικευ-

μένο πρόγραμμα σκίασης στον δείκτη τύπου ShaderProg που θα χρησι-

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

διαχειριστεί το αν κάποιο αντικείμενο θα εξαιρεθεί από περάσματα από-

δοσης σκιών χρησιμοποιώντας μία σημαία τύπου bool.

Class Scene

Η κλάση Scene αντιπροσωπεύει μία σκηνή ή οποία κατά κύρια βάση

φορτώνεται από εξωτερικό αρχείο. Η σκηνή μπορεί να αποτελείται από

ένα η περισσότερα αντικείμενα τα οποία μπορεί να είναι τύπου Object,

Camera και Light. Η σκηνή επίσης μπορεί να περιέχει γεωμετρία (class

Mesh pointers) ή οποία συνήθως αντιστοιχίζεται με τα Objects που περιέχει

η σκηνή. Κάθε αντικείμενο της σκηνής καθώς και η σκηνή ως σύνολο υπο-

στηρίζει animations. Για τη φόρτωση των σκηνών από εξωτερικά αρχεία,

η κλάση Scene χρησιμοποιεί την βιβλιοθήκη assimp (Asset Import Library)

η οποία υποστηρίζει φόρτωση πολλών διαφόρων τύπων αρχείων γραφικών,

όπως FBX, OBJ, COLLADA, 3DS κ.α.

Page 74: Mars2030 Thesis Booklet

74

Class Light

Η κλάση Light κληρονομεί την κλάση XFormNode και αντιπροσωπεύει

μία πηγή φωτός στο χώρο. Η κλάση διαχειρίζεται το διαχυτικό και το ανα-

κλαστικό χρώμα της πηγής φωτός καθώς και τις τιμές της συνεχούς, της

γραμμικής αλλά και της τετραγωνικής απόσβεσης του φωτός με βάση την

απόσταση. Τέλος η κλάση είναι υπεύθυνη για τη αποστολή αυτών των δε-

δομένων στο πρόγραμμα σκίασης.

Class Camera

Η κλάση Camera κληρονομεί την κλάση XFormNode και αντιπροσωπεύει

μία εικονική κάμερα στο χώρο. Είναι υπεύθυνη για τη διαχείριση του πίνακα

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

ψαλιδίσματος. Η κλάση είναι υπεύθυνη για τη μεταφορά των δεδομένων

αυτών στο πρόγραμμα σκίασης.

Class NucParticle

Η κλάση NucParticle αντιπροσωπεύει ένα σωματίδιο που αποτελεί μέρος

ενός συστήματος σωματιδίων. Η κλάση διαχειρίζεται τα χαρακτηριστικά

του σωματιδίου όπως είναι η θέση του στο χώρο, το χρώμα του και το

μέγεθός του, μέσω ενός struct ParticleAttributes. Η κλάση επίσης ορίζει

την ταχύτητα και την κατεύθυνση κίνησης του σωματιδίου στο χώρο καθώς

και τη διάρκεια ζωής του, το αν είναι ενεργό η όχι και τη χρονική στιγμή

της δημιουργίας του.

Class NucEmitter

Η κλάση NucEmitter κληρονομεί την κλάση XFormNode και αντιπρο-

σωπεύει έναν εκπομπό σωματιδίων στο χώρο. Περιέχει ένα std::list

από NucParticle και είναι υπεύθυνη για τη διαχείρισή τους. Διαχειρίζεται

το πόσα σωματίδια παράγονται το δευτερόλεπτο, τη διάρκεια εκπομπής, το

μέγιστο αριθμό σωματιδίων που επιτρέπεται να είναι ενεργά σε κάθε χρο-

νική στιγμή, τη διάρκεια ζωής τους, το μέγεθός τους, καθώς και τη μετάβασή

Page 75: Mars2030 Thesis Booklet

75

τους από ένα το αρχικό χρώμα σε ένα τελικό χρώμα (το οποίο υπολογίζε-

ται χρησιμοποιώντας γραμμική παρεμβολή με βάση το χρόνο) όπως και την

εικόνα υφής που θα εφαρμοστεί στα σωματίδια. Ο εκπομπός σωματιδίων

εκπέμπει τα σωματίδια είτε από ένα σημείο είτε από ένα σφαιρικό χώρο

με συγκεκριμένη ακτίνα. Το αν ο εκπομπός εκπέμπει σωματίδια ρυθμίζεται

από ένα flag τύπου bool. Επίσης περιέχονται στην κλάση δείκτες στις κλά-

σεις NucRenderer kai NucPhysics, οι οποίες διαχειρίζονται την απόδοση και

την εξομοίωση της φυσικής των σωματιδίων αντίστοιχα. Ακολουθεί τμήμα

κώδικα που αποφασίζει πόσα σωματίδια θα εμφανιστούν με βάση το ρυθμό

εκπομπής:

1 / * Ca l cu l a t e the p a r t i c l e s to spawn . * /

2 par t i c l e s_ to_spawn += conf ig . spawn_rate * d t_sec ;

3 i n t num_spawn = par t i c l e s_ to_spawn ;

4 par t i c l e s_ to_spawn −= num_spawn;

5

6 in t i = 0;

7

8 / * i f the emi t t e r i s a c t i v e . . . * /

9 i f ( a c t i v e ) {

10 while ( i < num_spawn && ( in t ) p a r t i c l e s . s i z e ( ) < conf ig . max_par t i c l e s

) {

11 spawn_part i c le ( time ) ;

12 i ++;

13 }

14 }

Class NucRenderer

Η κλάση NucRenderer είναι υπεύθυνη για το τρόπο με τον οποίο θα

αποδοθούν τα σωματίδια που εκπέμπονται από την κλάση NucEmitter. Η

κλάση περιέχει ένα δείκτη σε αντικείμενο τύπου ShaderProg που είναι το

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

αποφευχθεί η καθυστέρηση που δημιουργείτε όταν ξεκινήσει η απόδοση των

σωματιδίων με την κλήση της συνάρτησης glDrawArrays, λόγω του ότι το

API κλειδώνει το VBO έτσι ώστε να μην υπάρχει επικάλυψη δεδομένων από

Page 76: Mars2030 Thesis Booklet

76

την εισαγωγή καινούριων κατά τη διάρκεια της απόδοσης, χρησιμοποιείται

ένα pool από σωματίδια και δύο VBOs τα οποία χρησιμοποιούνται εναλλάξ

για την απόδοση των σωματιδίων (όταν το pool των σωματιδίων γεμίζει

το ένα VBO αποδίδει τα σωματίδια όσο το άλλο συνεχίζει να γεμίζει με

δεδομένα).

Class NucPhysics

Η κλάση NucPhysics είναι υπεύθυνη για την εξομοίωση της φυσικής του

συστήματος σωματιδίων. Μιας και η κλάση περιέχεται μέσα στην κλάση

NucEmitter της παρέχει την αρχική ταχύτητα των σωματιδίων καθώς και το

εύρος μέσα στο οποίο θα δημιουργηθεί μία τυχαιότητα η οποία θα προστεθεί

στην αρχική ταχύτητα των σωματιδίων κατά τη διαδικασία της δημιουργίας

τους. Δέχεται ως είσοδο τα σωματίδια που δημιουργήθηκαν από την κλάση

NucEmiτter και τους δίνει κίνηση με βάση μία εξωτερική δύναμη (π.χ. βα-

ρύτητα). Είναι υπεύθυνη επίσης για τη μείωση τις τιμής της διάρκειας ζωής

των σωματιδίων με βάση το χρόνο που μεσολαβεί ανάμεσα σε δύο καρέ.

Χρησιμοποιώντας τις τιμές αυτές ο προγραμματιστής μπορεί να προσο-

μοιώσει διαφορετικές φυσικές συμπεριφορές, όπως εκρήξεις, σιντριβάνια,

φλόγες κ.α. Ακολουθεί η υλοποίηση της συνάρτησης εξομοίωσης:

1 void NucPhysics : : s imulate ( f l o a t dt_sec , s td : : l i s t <NucPar t i c l e *> &

pa r t i c l e s , long t ime_sec )

2 {

3 std : : l i s t <NucPar t i c l e * > : : i t e r a t o r i t = p a r t i c l e s . begin ( ) ;

4

5 while ( i t != p a r t i c l e s . end ( ) ) {

6 NucPar t i c l e *p = * i t ;

7

8 p−>s e t _po s i t i on (p−>ge t _po s i t i on ( ) + p−>g e t _ v e l o c i t y ( ) * d t_sec ) ;

9 p−>s e t _ v e l o c i t y (p−>g e t _ v e l o c i t y ( ) + ex t e rna l _ f o r c e * d t_sec ) ;

10

11 p−> s e t _ l i f e (p−>g e t _ l i f e ( ) − dt_sec ) ;

12

13 i t ++;

14 }

Page 77: Mars2030 Thesis Booklet

77

15 }

Class NucManager

Η κλάση NucManager είναι η κλάση η οποία διαχειρίζεται τους εκπο-

μπούς που έχουν τοποθετηθεί σε μία σκηνή. Είναι υπεύθυνη να καλέσει τις

συναρτήσεις απόδοσης και ενημέρωσης των εκπομπών που διαχειρίζεται.

Είναι επίσης υπεύθυνη για την διαγραφή των εκπομπών όταν αυτοί είναι

ανενεργοί, έχουν μαρκαριστεί προς διαγραφή και δεν περιέχουν ενεργά σω-

ματίδια μέσα τους, πράγμα που επιτυγχάνεται ελέγχοντας τα boolean flags

active και marked_for_death

1 void NucManager : : update ( f l o a t dt , long time )

2 {

3 i f ( ! em i t t e r s . empty ( ) ) {

4 std : : l i s t <NucEmitter * > : : i t e r a t o r i t = emi t t e r s . begin ( ) ;

5

6 while ( i t != emi t t e r s . end ( ) ) {

7 ( * i t )−>update ( dt , t ime ) ;

8

9 i f ( ! ( ( * i t )−> i s _ a c t i v e ( ) ) && ( * i t )−>is_marked_for_death ( ) && ( ( *

i t )−>ge t _pa r t i c l e _ coun t ( ) == 0) ) {

10 XFormNode * parent = NULL;

11 parent = ( * i t )−>get_parent ( ) ;

12

13 i f ( parent )

14 parent−>remove_child ( * i t ) ;

15

16 de l e t e * i t ;

17 i t = emi t t e r s . e rase ( i t ) ;

18 }

19 e l s e {

20 i t ++;

21 }

22 }

23 }

24 }

Page 78: Mars2030 Thesis Booklet

78

Class Entity

Η κλάση Entity αντιπροσωπεύει οντότητες μέσα στη σκηνή. Αυτές οι

οντότητες μπορεί είναι ο παίχτης οι εχθροί ή οποιοδήποτε άλλο αντικείμενο

το οποίο έχει κίνηση μέσα στο χώρο και συμμετέχει στη διαδικασία του

παιχνιδιού. Περιέχει μέσα της μία σκηνή τύπου Scene για τη διαχείριση

του animation και της γεωμετρίας, ένα αντικείμενο τύπου Sphere για τον

έλεγχο συγκρούσεων και ένα boolean flag το οποίο καθορίζει αν η οντότητα

συμμετέχει σε ελέγχους συγκρούσεων. Η κλάση Entity κληρονομεί την κλάση

XFormNode έτσι ώστε να μπορεί να διαχειριστεί τη θέση της στο χώρο.

Class EnemyTemplate

Η κλάση EnemyTemplate αντιπροσωπεύει ένα πρότυπο ενός εχθρού.

Κληρονομεί την κλάση Entity μιας και αποτελεί μία οντότητα μέσα στο

παιχνίδι. Κάθε EnemyTemplate περιγράφει έναν τύπο εχθρού. Περιέχει το

όνομα του εχθρού, τους πόντους υγείας του, την ταχύτητά του, τους πόντους

ζημίας του και τον τύπο του.

Class Enemy

Η κλάση Enemy αντιπροσωπεύει έναν εχθρό στο παιχνίδι. Περιέχει μέσα

της ένα δείκτη στην κλάση EnemyTemplate από την οποία αποκτάει ”ταυ-

τότητα”, δηλαδή τα στοιχεία ενός συγκεκριμένου προτύπου εχθρού και είναι

υπεύθυνη για τη διαχείριση της ενημέρωσης της θέσης και της γενικότερης

συμπεριφοράς του. Αντί για ανίχνευση συγκρούσεων μεταξύ των εχθρών,

που κύριο σκοπό θα είχε την απομάκρυνση του ενός από τον άλλο σε περί-

πτωση που οι γεωμετρίες τους συγκρούονταν, χρησιμοποιήθηκε μία τεχνική

εμπνευσμένη από τον τύπο της δύναμης μεταξύ ηλεκτρικών φορτίων. Θεω-

ρήθηκε ότι κάθε εχθρός είναι ένα φορτίο που έχει ίδιο πρόσημο με όλους

τους υπόλοιπους έτσι ώστε να απωθεί και απωθείται. Έτσι κάθε εχθρός

ασκεί αλλά και δέχεται δύναμη υπολογισμένη με βάση τον τύπο 1r2∗a, όπου

r η απόσταση μεταξύ δύο εχθρών και a μία σταθερά με την οποία ρυθμίζε-

ται η ένταση της δύναμης που θα ασκηθεί. Έτσι σε μεγάλες αποστάσεις η

Page 79: Mars2030 Thesis Booklet

79

δύναμη είναι αμελητέα ενώ σε πολύ κοντινές αποστάσεις η δύναμη αυξάνε-

ται σημαντικά. Με αυτόν τον τρόπο οι εχθροί πάντα διατηρούν αποστάσεις

μεταξύ τους και δε συγκρούονται. Ακολουθεί η υλοποίηση της συνάρτησης

απώθησης των εχθρών:

1 void Enemy : : repulse (Wave *wave )

2 {

3 Vector3 tmp_vel ;

4

5 std : : l i s t <Enemy*> e n _ l i s t = wave−>ge t_enemy_ l i s t ( ) ;

6 s td : : l i s t <Enemy* > : : i t e r a t o r i t = e n _ l i s t . begin ( ) ;

7

8 while ( i t != e n _ l i s t . end ( ) ) {

9 i f ( ( * i t )−> i s _ s o l i d ( ) ) {

10 i f ( ( * i t ) == th i s ) {

11 i t ++;

12 cont inue ;

13 }

14

15 Vector3 pos = ( * i t )−>ge t _po s i t i on ( ) ;

16 Vector3 th i s_pos = th i s−>ge t _po s i t i on ( ) ;

17

18 / * Ca l cu l a t e the d i r e c t i on of the repuls ion . * /

19 Vector3 repuls ion_vec = th i s_pos − pos ;

20

21 f l o a t d i s t = repuls ion_vec . length ( ) ;

22 f l o a t d i s t _ sqrd = d i s t * d i s t ;

23

24 i f ( d i s t > 0) {

25 repuls ion_vec /= d i s t ;

26

27 f l o a t r epu l s i on_ f a c t o r = (1 .0 / d i s t _ sqrd ) * 2 .0 ;

28 repuls ion_vec *= r epu l s i on_ f a c t o r ;

29

30 / * Accumulate the repuls ion vec to r s from a l l enemies . * /

31 tmp_vel += repuls ion_vec ;

32 }

33 }

34 i t ++;

Page 80: Mars2030 Thesis Booklet

80

35 }

36

37 / * Modify the v e l o c i t y of the enemy by adding

38 * the f i n a l repuls ion vec tor . * /

39 v e l o c i t y += tmp_vel ;

40 }

Class EnemyGenerator

Η κλάση EnemyGenerator όπως φαίνεται και από το όνομα της παράγει

εχθρούς και τους προσθέτει στο στο ανάλογο κύμα εχθρών. Ευθύνη της

κλάσης είναι να αποφασίσει το σημείο δημιουργίας κάθε εχθρού στον κόσμο.

Στην συγκεκριμένη υλοποίησή της χρησιμοποιεί πολικές συντεταγμένες για

το πραγματοποιήσει. Με βάση λοιπόν μίας ακτίνας, 2 γωνιών καθώς και

ενός εύρους τυχαιότητας η κλάση δημιουργεί εχθρούς λαμβάνοντας επίσης

υπόψιν της έναν ρυθμό παραγωγής εχθρών που ορίζεται με βάση το χρόνο.

Class Wave

Η κλάση Wave αντιπροσωπεύει ένα κύμα εχθρών στο παιχνίδι. Περιέ-

χει ένα std::list από EnemyGenerators οι οποίοι τροφοδοτούν εχθρούς

στο κύμα με βάση το χρόνο. Η κλάση μπορεί να εφαρμόσει μία καθυστέ-

ρηση στη παραγωγή εχθρών από τους παραγωγούς εχθρών ανάλογα με τις

ανάγκες του προγραμματιστή. Είναι υπεύθυνη να ενημερώνει τους εχθρούς,

να τους αποδίδει καθώς και να αφαιρέσει από τη λίστα αυτούς που έχουν

καταστραφεί. Η κλάση χειρίζεται τους παραγωγούς εχθρών και είναι υπεύ-

θυνη στο να τους διαγράψει από τη λίστα όταν έχει τελειώσει ο αριθμός

των εχθρών που ήταν προκαθορισμένοι να παράγουν. Ένα κύμα θεωρείται

νικημένο όταν όλοι οι εχθροί καθώς και όλοι οι παραγωγοί εχθρών έχουν

διαγραφεί από τις λίστες.

Class WaveGroup

Η κλάση WaveGroup αντιπροσωπεύει μία ομάδα από κύματα εχθρών.

Είναι υπεύθυνη για την ενημέρωσή τους, την απόδοσή τους, την πρόοδο τους

Page 81: Mars2030 Thesis Booklet

81

καθώς και τη διαγραφή τους όταν αυτά έχουν νικηθεί. Το κάθε επίπεδο του

παιχνιδιού αποτελείται από ένα σύνολο ομάδων κυμάτων. Στη συγκεκρι-

μένη υλοποίησή της κλάσης πριν ξεκινήσει η διαχείριση των κυμάτων, ανα-

παράγεται ένα αρχείο ήχου με κάποιο διάλογο μεταξύ των χαρακτήρων του

παιχνιδιού. Μία ομάδα κυμάτων θεωρείται νικημένη όταν όλα τα κύματα

στη λίστα της έχουν διαγραφεί.

Class WaveGroupManager

Η κλάση WaveGroupManager είναι υπεύθυνη για τη διαχείριση των ομά-

δων κυμάτων ενός επιπέδου του παιχνιδιού. Είναι υπεύθυνη για τη ενημέ-

ρωση, την απόδοση καθώς και για πρόοδο και τη διαγραφή τους όταν αυτά

έχουν νικηθεί από τον παίχτη.

Class Projectile

Η κλάση Projectile αντιπροσωπεύει ένα βλήμα του οπλικού συστήμα-

τος του παιχνιδιού. Η κλάση διαχειρίζεται την κατεύθυνση, την ταχύτητα,

τη ζημία του βλήματος καθώς και το αν έχει συγκρουστεί με έναν εχθρό η

όχι (χρησιμοποιώντας εντοπισμό σύγκρουσης ανάμεσα σε δύο σφαίρες). Το

βλήμα μπορεί να αντιπροσωπεύεται οπτικά είτε από ένα σύστημα σωματι-

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

ται σύστημα σωματιδίων).

Class Stage

Η κλάση Stage αντιπροσωπεύει ένα επίπεδο του παιχνιδιού. Είναι υπεύ-

θυνη για τη διαχείριση της εμφάνισης του επιπέδου. Διαχειρίζεται την από-

δοση των σκηνών του επιπέδου, τα περάσματα απόδοσης για τη δημιουργία

του χάρτη σκιών και των εικόνων χαρτογράφησης υφής που δημιουργούνται

σε πραγματικό χρόνο καθώς και την απόδοση του HUD (Heads Up Display).

Η συνάρτηση απόδοσης των σκηνών του επιπέδου χρησιμοποιεί ένα bitmask

με το οποίο ο προγραμματιστής μπορεί να ελέγξει ποια κομμάτια της σκη-

νής αποδίδονται. Η κλάση διαχειρίζεται επίσης τις ομάδες κυμάτων των

Page 82: Mars2030 Thesis Booklet

82

εχθρών με τη χρήση του WaveGroupManager καθώς και την αναπαραγωγή

της μουσικής και του εισαγωγικού αρχείου ήχου εκπαίδευσης του παίχτη.

Τέλος ελέγχει αν οι πόντοι υγείας έχουν φτάσει στο μηδέν έτσι ώστε να

μεταβεί στην οθόνη τέλους παιχνιδιού.

Class WeaponSystem

Η κλάση WeaponSystem είναι υπεύθυνη για τη διαχείριση του οπλι-

κού συστήματος του παιχνιδιού. Διαχειρίζεται τη γεωμετρία των όπλων, τα

βλήματα που έχουν πυροβοληθεί, τη μέγιστη απόσταση που είναι αποτε-

λεσματικά τα βλήματα, το ρυθμό αύξησης και μείωσης της θερμοκρασίας

καθώς και το σύστημα ψύξης. Η θερμοκρασία αυξάνεται λογαριθμικά και

μειώνεται γραμμικά. Όσον αφορά το σύστημα ψύξης, διαθέτει μέγιστο τρεις

χρήσεις και προστίθεται νέα χρήση ανά τριάντα δευτερόλεπτα. Για να επι-

τευχθεί ο εναλλάξ πυροβολισμός των όπλων, υπολογίζεται το ακέραιο υπό-

λοιπο του συνολικού αριθμού βλημάτων που εκτοξεύθηκαν με τον αριθμό

δύο. Αν το υπόλοιπο είναι μηδέν, πυροβολείται το αριστερό όπλο ενώ σε

κάθε άλλη περίπτωση πυροβολείται το δεξί.

Class BaseScreen

Η κλάση BaseScreen περιγράφει μία οθόνη του παιχνιδιού (π.χ. αρχική

οθόνη, οθόνη παιχνιδιού, οθόνη τέλους παιχνιδιού κ.α.). Η κλάση αποτελεί

τη βασική κλάση για οποιαδήποτε υλοποίηση οθόνης στο παιχνίδι. Διαχει-

ρίζεται τον πίνακα μετασχηματισμού προβολής που θα χρησιμοποιηθεί, το

χρονικό διάστημα μέσα στο οποίο ανιχνεύεται το διπλό κλικ, τις θέσεις του

κέρσορα του ποντικιού στα σημεία πίεσης και απελευθέρωσης του αριστε-

ρού κουμπιού του ποντικιού (οι οποίες χρησιμοποιούνται για να υπολογιστεί

η απόσταση συρσίματος του κέρσορα) καθώς και το χρόνο που έχει παρέλ-

θει στην συγκεκριμένη οθόνη εφόσον αυτή είναι ενεργή. Υπολογίζει επίσης

το διάστημα ανάμεσα σε δύο frames της οθόνης το οποίο χρησιμοποιείται

από τις υπόλοιπες κλάσεις όπου αυτές χρειάζεται να καλέσουν τις συναρτή-

σεις ενημέρωσής τους. Τέλος διαχειρίζεται τα events του ποντικιού και του

πληκτρολογίου σε επίπεδο οθόνης και εξυπηρετούν τη λογική της εκάστοτε

Page 83: Mars2030 Thesis Booklet

83

οθόνης.

Class ScreenManager

Η κλάση ScreenManager είναι υπεύθυνη για τη διαχείριση των οθονών

του παιχνιδιού. Εφόσον δεσμευτεί μνήμη για τις υλοποιήσεις των διάφορων

οθονών του παιχνιδιού προστίθενται σε μία στοίβα τύπου std::stack που

περιέχεται μέσα στην κλάση. Ενεργή είναι πάντα η οθόνη που βρίσκεται

στην κορυφή της στοίβας και η κλάση είναι υπεύθυνη για την κλήση των συ-

ναρτήσεων απόδοσης, ενημέρωσης, αλλαγής μεγέθους (και κατά συνέπεια

τρόπου προβολής του περιεχομένου της στην οθόνη) και αρχικοποίησης της

ενεργής οθόνης. Σε περίπτωση που χρειάζεται να μεταβούμε σε μία από τις

οθόνες που υπάρχουν στη στοίβα αρκεί απλά να καλέσουμε τη συνάρτηση

pop() τόσες φορές όσες χρειάζεται για να έρθει στην κορυφή της στοίβας

στην ενεργή οθόνη ή αν η επιθυμητή οθόνη δε βρίσκεται στην στοίβα την

προσθέτουμε στην κορυφή της καλώντας την συνάρτηση push(). Τέλος εί-

ναι υπεύθυνη για την κλήση των συναρτήσεων διαχείρισης των events της

ενεργής οθόνης.

Class EventHander

Η κλάση EventHandler είναι υπεύθυνη για τη διαχείριση των events που

δημιουργούνται από το σύστημα διαχείρισης των events του πληκτρολογίου

και του ποντικιού της βιβλιοθήκης SDL2 η οποία χρησιμοποιείται και για

τη δημιουργία του παραθύρου του παιχνιδιού καθώς και την αρχικοποίηση

του βασικού γενικού πλαισίου της OpenGL. Βασική της υπευθυνότητα εί-

ναι να μεταφέρει τα events που ανιχνεύονται από την SDL2 στα κατώτερα

στρώματα της ιεραρχίας, δηλαδή να καλεί τις συναρτήσεις διαχείρισης των

events της κλάσης ScreenManager η οποία με τη σειρά της καλεί τις ανάλο-

γες συναρτήσεις την ενεργής οθόνης. Κύριος σχεδιαστικός ρόλος της κλάσης

είναι να διαχωρίσει το σύστημα διαχείρισης των events της SDL2 από την

υπόλοιπη υλοποίηση της μηχανής γραφικών.

Page 84: Mars2030 Thesis Booklet

84

Class BitmapText

Η κλάση BitmapText κληρονομεί τη κλάση XFormNode και αντιπροσω-

πεύει ένα αντικείμενο κειμένου στον τρισδιάστατο χώρο. Είναι στην πραγ-

ματικότητα μία wrapper class γύρω από την βιβλιοθήκη libdrawtext η οποία

δημιουργεί glyphmaps από αρχεία γραμματοσειρών και διαχειρίζεται την

απόδοση τους στην οθόνη μέσω της OpenGL εφαρμόζοντάς τα ως εικόνες

υφής πάνω σε γεωμετρία η οποία δημιουργείται με βάση το μέγεθος της

γραμματοσειράς που θέτει ο προγραμματιστής. Η κλάση προσθέτει την επι-

πρόσθετη λειτουργικότητα της στοίχισης του κειμένου γύρω από το σημείο

δημιουργίας του αντικειμένου στο χώρο καθώς και της εφαρμογής μετασχη-

ματισμών και της δημιουργίας animation στο κείμενο.

Class CollisionEntity

Η κλάση CollisionEntity αντιπροσωπεύει οποιαδήποτε οντότητα συμμε-

τέχει σε έλεγχους συγκρούσεων και συνήθως κληρονομείται από κλάσεις

που περιγράφουν γεωμετρικά στερεά. Η κλάση είναι pure virtual πράγμα

που σημαίνει ότι δεν έχει υλοποίηση των συναρτήσεών της και όποια κλάση

την κληρονομεί υποχρεούται να υλοποιήσει τις συναρτήσεις που ορίζονται

μέσα της. Ακολουθεί ο ορισμός της κλάσης καθώς και ο ορισμός του struct

HitPoint το οποίο αντιπροσωπεύει ένα σημείο τομής ανάμεσα σε δύο οντό-

τητες συγκρούσεων:

1 / * Forward dec l a r a t i on . * /

2 c l a s s Co l l i s i onEn t i t y ;

3

4 s t r u c t Hi tPo in t

5 {

6 / * World pos i t i on of the i n t e r s e c t i o n point . * /

7 Vector3 pos ;

8

9 / * Sur face normal vec tor a t the i n t e r s e c t i o n point . * /

10 Vector3 normal ;

11

12 / * Parametr ic d i s t ance of the i n t e r s e c t i o n point * /

Page 85: Mars2030 Thesis Booklet

85

13 f l o a t d i s t ;

14

15 const Co l l i s i onEn t i t y * c o l _ e n t i t y ;

16

17 Hi tPo int ( ) ;

18 Hi tPo int ( const Vector3 &p , const Vector3 &n , f l o a t d , const

Co l l i s i onEn t i t y * c ) ;

19 } ;

20

21 c l a s s Co l l i s i onEn t i t y

22 {

23 publ i c :

24 v i r t u a l ~Co l l i s i onEn t i t y ( ) ;

25 v i r t u a l bool i n t e r s e c t ( const Ray &ray , Hi tPo in t * pt ) const = 0;

26 v i r t u a l void v i s u a l i z a t i o n ( const Vector3 &obj_pos ) = 0;

27 } ;

Όπως είναι φανερό η κλάση ορίζει ότι όποια άλλη κλάση την κληρονομή-

σει πρέπει να υλοποιήσει μία συνάρτηση που ορίζει το πως υπολογίζεται

το σημείο τομής της με μία ευθεία (ακτίνα - Ray) καθώς και μία συνάρ-

τηση που ορίζει το πως οπτικοποιείται ο γεωμετρικός όγκος υπολογισμού

συγκρούσεων που ορίζει (κυρίως για λόγους debugging).

Class Sphere

Η κλάση Sphere κληρονομεί την κλάση CollisionEntity και αντιπροσω-

πεύει έναν όγκο υπολογισμού συγκρούσεων με τη μορφή σφαίρας. Η σφαίρα

ορίζεται από ένα τρισδιάστατο διάνυσμα που αποτελεί το κέντρο της, και

μία ακτίνα. Στο συγκεκριμένο παιχνίδι η κλάση χρησιμοποιείται για τον

υπολογισμό συγκρούσεων μεταξύ βλημάτων και εχθρών. Κάθε πρότυπο

εχθρού λόγο του ότι είναι ένα Entity περιέχει έναν δείκτη στην κλάση Sphere.

Για να μπορέσει η εικονική σφαίρα να περιβάλλει σωστά τη γεωμετρία του

μοντέλου του εχθρού πρέπει να υπολογιστεί το κέντρο του μοντέλου (σημείο

που αποτελεί το κέντρο της σφαίρας συγκρούσεων) αλλά και να βρεθεί η κο-

ρυφή με την μεγαλύτερη απόσταση από αυτό (τιμή που αποτελεί την ακτίνα

της σφαίρας συγκρούσεων). Για να πραγματοποιηθεί ο υπολογισμός του κέ-

Page 86: Mars2030 Thesis Booklet

86

ντρου του μοντέλου, προστίθενται οι τιμές x, y και z όλων των κορυφών του,

αποθηκεύονται σε ένα τρισδιάστατο διάνυσμα και έπειτα διαιρούνται με το

πλήθος των κορυφών.

Class RenderTarget

Η κλάση RenderTarget διαχειρίζεται τα framebuffer objects (FBO) και

τους renderbuffers της μηχανής γραφικών. Τα FBOs σε συνδυασμό με τους

renderbuffers χρησιμοποιούνται για την απόδοση γραφικών εκτός οθόνης

(off-screen rendering) και αποθηκεύουν το αποτέλεσμα της απόδοσης σε

μία εικόνα υφής (γι’ αυτό και η διαδικασία ονομάζεται render to texture)

σε αντίθεση με τους renderbuffers οι οποίοι απλά κρατάνε δεδομένα μέσα

τους και χρησιμοποιούνται για αποθήκευση δεδομένων που η λογική τους

χρήση δεν είναι ως εικόνα υφής (όπως ο απομονωτής Ζ σε περίπτωση που

δεν χρειάζεται να υπολογιστούν δυναμικές σκιές). Η τεχνική αυτή επιτρέπει

στον προγραμματιστή να αποδώσει σκηνές οι οποίες αλλάζουν δυναμικά

και να εφαρμόσει την εικόνα υφής που δημιουργείται πάνω σε οποιαδή-

ποτε γεωμετρία (βλέπε τις οθόνες με τις τιμές structure και heat οι οποίες

αλλάζουν δυναμικά. Επίσης χρησιμοποιούνται όταν χρειάζεται να δημιουρ-

γηθεί κάποια εικόνα υφής που έχει μέσα της πληροφορία που χρειάζεται

να εφαρμοστεί σε κάποιο αλγόριθμο γραφικών όπως για παράδειγμα κατά

την δημιουργία σκιών χρησιμοποιώντας τον αλγόριθμο του απομονωτή Z,

οι πληροφορία του βάθους των αντικειμένων αποθηκεύεται σε μία εικόνα

υφής με τη χρήση ενός FBO και στη συνέχεια χρησιμοποιούνται οι τιμές των

εικονοστοιχείων της για να αποφασιστεί το αν κάποιο αντικείμενο είναι υπό

σκιά η όχι. Η κλάση λοιπόν διαχειρίζεται τη δημιουργία, την διαγραφή και

το binding των FBOs, των renderbuffers και των εικόνων υφής που χρη-

σιμοποιούνται ως attachmets για τα FBOs κάνοντας τις ανάλογες κλήσεις

στην OpenGL. Ένα αντικείμενο της κλάσης RenderTarget περιέχει μέσα του

δύο FBOs, ένα renderbuffer και δύο εικόνες υφής. Το ένα FBO μαζί με

τη μία εικόνα υφής και τον renderbuffer χρησιμοποιούνται για περάσματα

απόδοσης χρώματος, ενώ το δεύτερο FBO μαζί με τη δεύτερη εικόνα υφής

χρησιμοποιούνται για περάσματα υπολογισμού του χάρτη σκιών που θα

Page 87: Mars2030 Thesis Booklet

87

χρησιμοποιηθεί για τον υπολογισμό δυναμικών σκιών. Ο προγραμματιστής

μπορεί να ορίσει ποιοι buffers θα δημιουργηθούν δίνοντας στη συνάρτηση

δημιουργίας του ένα bitmask:

1 bool RenderTarget : : c r e a t e ( unsigned in t rt_mask )

2 {

3 i f ( rt_mask &(1 << RT_COLOR_AND_DEPTH) ) {

4

5 / * I f the FBO hasn ’ t been created , c r e a t e now* /

6 i f ( ! fbo ) {

7 glGenFramebuffers ( 1 , &fbo ) ;

8 }

9

10 / * I f no t ex tu r e fo r drawing co lo r has been ass igned

11 * c r e a t e a new tex tu re fo r the co lo r attachment of the fbo * /

12 i f ( ! co lor_at tachment ) {

13 glGenTextures ( 1 , &color_at tachment ) ;

14 }

15

16 / * bind the framebuffer to perform opera t ions on i t * /

17 glBindFramebuffer (GL_FRAMEBUFFER, fbo ) ;

18

19 / * i n i t i a l i z e the co lo r attachment t ex tu r e * /

20 glBindTexture (GL_TEXTURE_2D, co lor_at tachment ) ;

21 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) ;

22 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) ;

23

24 fb_tex_width = game : : u t i l s : : next_pow2 ( fb_width ) ;

25 fb_ t ex_he igh t = game : : u t i l s : : next_pow2 ( fb_he ight ) ;

26

27 / * Create the t ex tu r e 2d image * /

28 glBindTexture (GL_TEXTURE_2D, co lor_at tachment ) ;

29 glTexImage2D (GL_TEXTURE_2D, 0 , GL_RGBA16F , fb_tex_width ,

fb_ tex_he ight , 0 , GL_RGBA, GL_UNSIGNED_BYTE, 0) ;

30

31 / * Attach the co lo r attachment t ex tu r e to the fbo * /

32 glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,

GL_TEXTURE_2D, color_at tachment , 0) ;

33

Page 88: Mars2030 Thesis Booklet

88

34 / * Create a Renderbuffer fo r depth s torage ( used fo r depth t e s t i n g

) * /

35 glGenRenderbuffers ( 1 , &depth_renderbuffer ) ;

36 glBindRenderbuffer (GL_RENDERBUFFER, depth_renderbuffer ) ;

37 g lRenderbuf ferS torage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT,

fb_tex_width , fb_ t ex_he igh t ) ;

38 glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,

GL_RENDERBUFFER, depth_renderbuffer ) ;

39

40 i f ( glCheckFramebufferStatus (GL_FRAMEBUFFER) !=

GL_FRAMEBUFFER_COMPLETE) {

41 std : : c e r r << ” Incomplete Framebuffer ! ” << std : : endl ;

42 return f a l s e ;

43 }

44

45 glBindFramebuffer (GL_FRAMEBUFFER, 0) ;

46 glBindTexture (GL_TEXTURE_2D, 0) ;

47 s td : : cout << ” Created render t a r g e t : ” << fb_width << ”x” <<

fb_he ight << ” ( t ex tu r e s i z e : ” << fb_tex_width << ”x” <<

fb_ t ex_he igh t << ” ) ” << std : : endl ;

48 }

49

50 i f ( rt_mask &(1 << RT_SHADOW) ) {

51 i f ( ! depth_attachment && ( ! shad_tex_width | | ! shad_tex_height ) ) {

52 std : : c e r r << ”No dimensions fo r depth s torage t ex tu r e have been

ass igned or one of them i s 0. ”<< ”Shadow fbo not crea ted ! ”

<< std : : endl ;

53 return f a l s e ;

54 }

55

56 glGenFramebuffers ( 1 , &shadow_fbo ) ;

57

58 i f ( ! depth_attachment ) {

59 glGenTextures ( 1 , &depth_attachment ) ;

60

61 / * Create and parametr ize the depth s torage t ex tu r e * /

62 glBindTexture (GL_TEXTURE_2D, depth_attachment ) ;

Page 89: Mars2030 Thesis Booklet

89

63 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR

) ;

64 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR

) ;

65 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,

GL_CLAMP_TO_EDGE) ;

66 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,

GL_CLAMP_TO_EDGE) ;

67

68 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,

GL_COMPARE_R_TO_TEXTURE) ;

69 glTexImage2D (GL_TEXTURE_2D, 0 , GL_DEPTH_COMPONENT24,

shad_tex_width , shad_tex_height , 0 , GL_DEPTH_COMPONENT,

GL_UNSIGNED_BYTE, 0) ;

70 }

71

72 / * Bind the framebuffer to perform opera t ions on i t . * /

73 glBindFramebuffer (GL_FRAMEBUFFER, shadow_fbo ) ;

74 glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,

GL_TEXTURE_2D, depth_attachment , 0) ;

75

76 glGenRenderbuffers ( 1 , &dummy_renderbuffer ) ;

77 glBindRenderbuffer (GL_RENDERBUFFER, dummy_renderbuffer ) ;

78 g lRenderbuf ferS torage (GL_RENDERBUFFER, GL_RGBA, shad_tex_width ,

shad_tex_height ) ;

79 glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,

GL_RENDERBUFFER, dummy_renderbuffer ) ;

80

81 i f ( glCheckFramebufferStatus (GL_FRAMEBUFFER) !=

GL_FRAMEBUFFER_COMPLETE) {

82 std : : c e r r << ” Incomplete Framebuffer ! ” << std : : endl ;

83 return f a l s e ;

84 }

85

86 glBindTexture (GL_TEXTURE_2D, 0) ;

87 glBindFramebuffer (GL_FRAMEBUFFER, 0) ;

88

Page 90: Mars2030 Thesis Booklet

90

89 std : : cout << ” Created shadow render t a r g e t : ” << fb_width << ”x”

<< fb_he ight << ” ( t ex tu r e s i z e : ” << shad_tex_width << ”x” <<

shad_tex_height << ” ) ” << std : : endl ;

90 }

91

92 return true ;

93 }

Class AudioSample

Η κλάση AudioSample αντιπροσωπεύει δεδομένα ήχου που φορτώνο-

νται και αποθηκεύονται στη μνήμη και χρησιμοποιούνται κατευθείαν από

το πρόγραμμα. Χρησιμοποιούνται κυρίως για μικρού μεγέθους αρχεία ήχου

όπως sound effects ή μικρούς διαλόγους. Για την αναπαραγωγή των ήχων

στο παιχνίδι χρησιμοποιείται η OpenAL (Open Audio Library) η οποία εί-

ναι ένα API μου σχεδιάστηκε για να μοιάζει πολύ με την αρχιτεκτονική

της OpenGL και διαχειρίζεται το σύστημα ήχου. Για την αναπαραγωγή των

AudioSamples χρησιμοποιούνται AudioSources τα οποία αντιπροσωπεύουν

αντικείμενα τα οποία διαβάζουν τα δεδομένα των AudioSamples και πραγ-

ματοποιούν την κατάλληλη επεξεργασία, λαμβάνοντας υπ’ όψη έξτρα πα-

ραμέτρους όπως η θέση του AudioSource στο χώρο για να υπολογίσει π.χ.

την απόσβεση του ήχου με βάση την απόσταση.

Class AudioStream

Η κλάση AudioStream αντιπροσωπεύει δεδομένα ήχου τα οποία φορτώ-

νονται τμηματικά στη μνήμη για να χρησιμοποιηθούν από το πρόγραμμα.

Χρησιμοποιούνται κυρίως για πολύ μεγάλα αρχεία ήχου όπως soundtracks ή

μεγάλους διαλόγους. Αυτό γίνεται για να μειωθεί η μνήμη που δεσμεύει το

πρόγραμμά μας. Για την αναπαραγωγή τους, επειδή χρησιμοποιείται δειγ-

ματοληψία στα δεδομένα του αρχείο ήχου για να γίνει η μεταφορά τους στη

μνήμη και είναι μία διαδικασία η οποία θα προσέθετε μεγάλη καθυστέρηση

στην κανονική ροή του προγράμματος, εκτελείται σε ένα δεύτερο thread.

Page 91: Mars2030 Thesis Booklet

91

Class AudioManager

Η κλάση AudioManager είναι υπεύθυνη για τη διαχείριση του συστή-

ματος ήχου της μηχανής. Υλοποιεί δύο pools από audio sources και audio

streams. Όταν ζητείται από τον manager να αναπαραχθεί ένα AudioSample

ή ένα AudioStream, αυτός ελέγχει τα δύο pools για το αν υπάρχει κάποιο

ελεύθερο source ή stream. Αν υπάρχει το χρησιμοποιεί, ενώ αν δεν υπάρχει

δεσμεύει μνήμη για ένα καινούριο. Στην περίπτωση που έχουν δεσμευτεί

όλα τα ενεργά sources και streams από τα pools και δεν υπάρχει χώρος

για τη δέσμευση καινούριου, εμφανίζεται κατάλληλο μήνυμα στην κονσόλα

που ειδοποιεί τον προγραμματιστή. Υλοποιεί επίσης λειτουργία για playlists

τις οποίες αναπαράγει και μπορεί παρέχει και τη δυνατότητα για looping.

Τέλος διαχειρίζεται τις εντάσεις των ήχων. Ακολουθεί η υλοποίηση των συ-

ναρτήσεων αίτησης για sources και streams από τα pools:

1 OggVorbisStream * AudioManager : : request_s tream ( in t * stream_idx )

2 {

3 fo r ( unsigned in t i = 0; i < NUM_STREAMS; i ++) {

4

5 i f ( streams [ i ] && ! streams [ i ]−> i s _p l ay ing ( ) ) {

6

7 streams [ i ]−> c l o s e ( ) ;

8

9 i f ( stream_idx )

10 * stream_idx = i ;

11

12 return streams [ i ] ;

13 }

14 }

15

16 for ( unsigned in t i = 0; i < NUM_STREAMS; i ++) {

17 i f ( ! streams [ i ] ) {

18

19 streams [ i ] = new OggVorbisStream ;

20

21 i f ( stream_idx )

22 * stream_idx = i ;

Page 92: Mars2030 Thesis Booklet

92

23

24 return streams [ i ] ;

25 }

26 }

27

28 std : : c e r r << ” Al l a v a i l a b l e streams are a l l o c a t ed and cur ren t l y

playing ! Cannot open a new stream ! ” << std : : endl ;

29 return NULL;

30 }

31

32 AudioSource * AudioManager : : reques t_source ( i n t * source_ idx )

33 {

34 fo r ( unsigned in t i = 0; i < NUM_SOURCES; i ++) {

35

36 i f ( sources [ i ] && ! sources [ i ]−> i s _p l ay ing ( ) ) {

37

38 i f ( source_ idx )

39 * source_ idx = i ;

40

41 return sources [ i ] ;

42 }

43 }

44

45 for ( unsigned in t i = 0; i < NUM_SOURCES; i ++) {

46

47 i f ( ! sources [ i ] ) {

48

49 sources [ i ] = new AudioSource ;

50

51 i f ( source_ idx )

52 * source_ idx = i ;

53

54 return sources [ i ] ;

55 }

56 }

57

58 std : : c e r r << ”Maximum number of sources a l l o c a t ed and are playing

a sample ! Cannot play the sample sp e c i f i e d ! ” << std : : endl ;

Page 93: Mars2030 Thesis Booklet

93

59 return NULL;

60 }

Page 94: Mars2030 Thesis Booklet

94

Κεφάλαιο 9

Oculus Rift

Το Rift είναι μία περιφερειακή συσκευή απεικόνισης εικονικής πραγ-

ματικότητας που φοριέται στο κεφάλι και αναπτύσσεται από την εταιρία

Oculus VR. Η ιδέα αρχικά προτάθηκε σε μία καμπάνια του Kickstarter, κατά

τη διάρκεια της οποίας η Oculus VR (που εκείνη την περίοδο ήταν ανεξάρ-

τητη εταιρία) συγκέντρωσε 2.4 εκατομμύρια δολάρια για την ανάπτυξη του

προϊόντος.

Διάγραμμα 9.1: Λογότυπο της εταιρίας Oculus VR.

Η πρώτη έκδοση του Rift έτοιμη για τους καταναλωτές θα κυκλοφορή-

σει στις αγορές το πρώτο τέταρτο του 2016, καθιστώντας το ένα από τα

πρώτα περιφερειακά εικονικής πραγματικότητας που θα απευθύνεται σε

καταναλωτές. Η ανάλυση της οθόνης του είναι 1080x1200 για κάθε μάτι,

έχει 90Hz συχνότητα ανανέωσης και μεγάλο κώνο θέασης. Το Rift παρέχει

πλήρη ανίχνευση κίνησης και περιστροφής σε κάθε κατεύθυνση (6 degree of

Page 95: Mars2030 Thesis Booklet

95

freedom tracking). Η ανίχνευση κίνησης πραγματοποιείται από μία ξεχωρι-

στή μονάδα ανίχνευσης, η οποία συνήθως τοποθετείται πάνω στο γραφείο

του χρήστη. Το σύστημα επιτρέπει τη χρήση του Rift σε καθιστή ή όρθια θέση

και επιτρέπει την κίνηση του χρήστη μέσα στο ίδιο δωμάτιο που βρίσκεται

η συσκευή ανίχνευσης.

Το Rift έχει περάσει από πολλές εκδόσεις πρωτοτύπων από την περίοδο

της καμπάνιας στο Kickstarter μέχρι και σήμερα, για πέντε από τα οποία

έγιναν επιδείξεις στο κοινό. Δύο από αυτά τα πρωτότυπα δόθηκαν προς πώ-

ληση ως ”development kits”, το DK1 στα τέλη του 2012 και το DK2 στα μέσα

το 2014, για να έχουν οι προγραμματιστές την ευκαιρία να δημιουργήσουν

αρκετό υλικό το οποίο θα ήταν έτοιμο μέχρι την κυκλοφορία της έκδοσης που

απευθύνεται στους υπόλοιπους καταναλωτές. Παρ’ όλα αυτά, και τα δύο

development kits αγοράστηκαν από μεγάλο αριθμό θαυμαστών της εικονι-

κής πραγματικότητας οι οποίοι ήθελαν να αποκτήσουν μία πρώιμη εμπειρία

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

σε δημόσιο επίπεδο από εταιρίες ως εργαλείο marketing, από διάφορα talk

shows, ακόμα και από τον στρατό για εξομοιώσεις. Για τη συγκεκριμένη

πτυχιακή εργασία χρησιμοποιήθηκε το development kit 2 (DK2) το οποίο

έχει οθόνη ανάλυσης 960x1080 για κάθε μάτι, low persistance OLED οθόνη

και συχνότητα ανανέωσης 60Hz.

Διάγραμμα 9.2: Rift Development Kit 2.

Page 96: Mars2030 Thesis Booklet

96

9.1 Έννοιες Στερεοσκοπικής Απόδοσης

Για να επιτευχθεί το στερεοσκοπικό τρισδιάστατο εφέ στο Oculus Rift,

η σκηνή χρειάζεται να ζωγραφιστεί σε split-screen χρησιμοποιώντας κάθε

τμήμα της για το κάθε μάτι του χρήστη. Όταν ο χρήστης χρησιμοποιεί το

Rift, το αριστερό του μάτι βλέπει την αριστερή πλευρά της οθόνης και το

δεξί του μάτι τη δεξιά. Οι κόρες των ματιών των ανθρώπων απέχουν μεταξύ

τους περίπου 65mm και διαφέρει από άνθρωπο σε άνθρωπο. Η τιμή αυτή

είναι γνωστή και ως interpupillary distance (IPD). Οι κάμερες της εφαρ-

μογής πρέπει να ρυθμιστούν με παρόμοια απόσταση μεταξύ τους. Αξίζει

να σημειωθεί ότι αυτή η διαδικασία εκτελείται με μετακίνηση της κάμερας,

όχι με περιστροφή και αυτή η μετακίνηση (μαζί με το εφέ παραλλαγής που

προέρχεται απ’ αυτήν) προκαλούν το στερεοσκοπικό εφέ. Αυτό σημαίνει ότι

η εφαρμογή χρειάζεται να αποδώσει ολόκληρη τη σκηνή δύο φορές, μία από

την οπτική γωνία της αριστερής εικονικής κάμερας και μία από την οπτική

γωνία της δεξιάς.

Οι φακοί που βρίσκονται μέσα στο Rift μεγεθύνουν την εικόνα για να

δημιουργήσουν ένα πολύ ευρύ πεδίο θέασης (FOV) το οποίο αυξάνει την

αίσθηση του χρήστη ότι βρίσκεται στο χώρο που απεικονίζει η εφαρμογή.

Παρ’ όλα αυτά, αυτή η διαδικασία παραμορφώνει την εικόνα σημαντικά. Αν

η μηχανή γραφικών απεικόνιζε την εικόνα στο Rift όπως θα την απεικόνιζε

και σε μία κανονική οθόνη, ο χρήστης θα παρατηρούσε ότι έχουν υποστεί

κοίλη παραμόρφωση (Pincushion Distortion).

Διάγραμμα 9.3: Μορφές παραμόρφωσης εικόνων.

Για να αντιμετωπίσει αυτήν την παραμόρφωση, το λογισμικό πρέπει να

Page 97: Mars2030 Thesis Booklet

97

επεξεργαστεί την τελική εικόνα με μία ίση και αντίθετη κυρτή παραμόρ-

φωση (Barrel Distortion) έτσι ώστε η μία να ακυρώνει την άλλη. Επιπρό-

σθετα το λογισμικό πρέπει να διορθώσει την χρωματική εκτροπή (chromatic

aberration), η οποία είναι ο διαχωρισμός των χρωμάτων του φωτός που εκ-

πέμπεται από την οθόνη του Rift όταν αυτό περνάει από τους φακούς. Παρ’

ότι οι ακριβείς παράμετροι εξαρτώνται από τα χαρακτηριστικά των φακών

και τη θέση των ματιών σε σχέση με τους φακούς, το Oculus SDK πραγμα-

τοποιεί όλους τους απαραίτητους υπολογισμούς όταν δημιουργεί το πλέγμα

πολυγώνων παραμόρφωσης.

Όταν αποδίδεται σκηνές για το Rift, οι άξονες προβολής πρέπει να είναι

παράλληλοι μεταξύ τους, και τα αριστερά και δεξιά σημεία θέασης πρέπει

να είναι εντελώς ανεξάρτητα το ένα από το άλλο. Αυτό σημαίνει ότι η ρύθ-

μιση των εικονικών καμερών είναι παρόμοια με αυτήν που χρησιμοποιείται

για τη μη στερεοσκοπική απόδοση, εκτός από το γεγονός ότι οι κάμερες

είναι μετακινημένες πλάγια για να προσαρμοστούν στη θέση του κάθε μα-

τιού. Ακολουθεί υλοποίηση συνάρτησης απόδοσης για το Rift από τη μηχανή

Διάγραμμα 9.4: Προβολές των εικόνων στο Rift για κάθε μάτι.

γραφικών:

1 void Cred i t sSc reen : : render_ovr ( )

2 {

3 i f ( ! game : : engine : : o v r _ i n i t i a l i z e d ) {

4 std : : cout << ”Ovr HMD not i n i t i a l i z e d ! ” << std : : endl ;

5 return ;

6 }

7

Page 98: Mars2030 Thesis Booklet

98

8 l t −>s e t _ l i g h t ( ) ;

9

10 s e t _un i s t a t e ( ” s t _ l i g h t _ i n t e n s i t y ” , ( f l o a t ) 1 .0 ) ;

11

12 ovrMatr ix4f pro j ;

13 ovrPosef pose [ 2 ] ;

14

15 / * Drawing s t a r t s with a c a l l to ovrHmd_BeginFrame . * /

16 ovrHmd_BeginFrame(game : : engine : : ovr_data .hmd, 0) ;

17

18 / * S t a r t drawing onto our t ex tu r e render t a r g e t . * /

19 game : : engine : : ovr_r ta rg . bind (RT_COLOR_AND_DEPTH) ;

20 g lC l ea rCo lo r (0 , 0 , 0 , 1) ;

21 g lC l e a r (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;

22

23 / / Update the p a r t i c l e s .

24 game : : engine : : nuc_manager−>update ( dt , get_msec ( ) ) ;

25

26 game : : engine : : rndr_pass_type = RNDR_PASS_COLOR;

27

28 / * fo r each eye . . . * /

29 fo r ( unsigned in t i = 0; i < 2; i ++) {

30

31 ovrEyeType eye = game : : engine : : ovr_data .hmd−>EyeRenderOrder [ i ] ;

32 / * −− Viewport Transformation −−

33 * Setup the viewport to draw in the l e f t ha l f of the framebuffer

when we ’ re

34 * rendering the l e f t eye ’ s view (0 , 0 , width / 2 .0 , he ight ) , and

in the r i gh t ha l f

35 * of the frambuffer fo r the r i gh t eye ’ s view (width / 2 .0 , 0 ,

width / 2 .0 , he ight )

36 * /

37 i n t fb_width = game : : engine : : ovr_r ta rg . get_fb_width ( ) ;

38 i n t fb_he ight = game : : engine : : ovr_r ta rg . ge t _ fb_he igh t ( ) ;

39

40 glViewport ( eye == ovrEye_Left ? 0 : fb_width / 2 , 0 , fb_width /

2 , fb_he ight ) ;

41

Page 99: Mars2030 Thesis Booklet

99

42 / / Send the Viewport s i z e to the shader .

43 s e t _un i s t a t e ( ” s t _ s c r e en _ s i z e ” , Vector2 ( fb_width / 2 .0 , fb_he ight )

) ;

44

45 / * −− Pro j e c t i on Transformation −−

46 * We’ l l j u s t have to use the p ro j e c t i on matrix suppl ied but he

oculus SDK for t h i s eye .

47 * Note tha t l i bov r matr i ces are the transpose of what OpenGL

expects , so we have to

48 * send the transposed ovr p ro j e c t i on matrix to the shader . * /

49 pro j = ovrMat r i x4 f_Pro j e c t i on (game : : engine : : ovr_data .hmd−>

DefaultEyeFov [ eye ] , 0 .01 , 40000.0 , t rue ) ;

50

51 Matrix4x4 proj_mat ;

52 memcpy( proj_mat [ 0 ] , pro j .M, 16 * s i z e o f ( f l o a t ) ) ;

53

54 / * Send the Pro j e c t i on matrix to the shader . * /

55 s e t _p ro j e c t i on_ma t r i x ( proj_mat ) ;

56

57 / * −−view / camera tranformat ion −−

58 * We need to cons t ruc t a view matrix by combining a l l the

informat ion provided by

59 * the oculus SDK, about the pos i t i on and o r i en t a t i on of the user

’ s head in the world .

60 * /

61 pose [ eye ] = ovrHmd_GetHmdPosePerEye (game : : engine : : ovr_data .hmd,

eye ) ;

62

63 view . r e s e t _ i d e n t i t y ( ) ;

64

65 view . t r a n s l a t e ( Vector3 (game : : engine : : ovr_data . eye_rdesc [ eye ] .

HmdToEyeViewOffset . x , game : : engine : : ovr_data . eye_rdesc [ eye ] .

HmdToEyeViewOffset . y , game : : engine : : ovr_data . eye_rdesc [ eye ] .

HmdToEyeViewOffset . z ) ) ;

66

67 / * Construct a quaternion from the data of the oculus SDK and

ro t a t e the view matrix * /

68 Quaternion q = Quaternion ( pose [ eye ] . Or i en ta t i on .w, pose [ eye ] .

Page 100: Mars2030 Thesis Booklet

100

Or ien ta t i on . x , pose [ eye ] . Or i en ta t i on . y , pose [ eye ] . Or i en ta t i on .

z ) ;

69 view . r o t a t e (q . inver se ( ) . normalized ( ) ) ;

70

71

72 / * Trans la te the view matrix with the po s i t i ona l t rack ing * /

73 view . t r a n s l a t e ( Vector3(−pose [ eye ] . Pos i t i on . x , −pose [ eye ] . Pos i t i on

. y , −pose [ eye ] . Pos i t i on . z ) ) ;

74

75 / * Send the View matrix to the shader . * /

76 set_v iew_matr ix ( view ) ;

77

78 / * Render c a l l s * /

79 game : : engine : : current_sdr = game : : engine : : dimmed_sky_sdr ;

80 g lD i sab l e (GL_DEPTH_TEST) ;

81 sky . render (RENDER_OBJ) ;

82 glEnable (GL_DEPTH_TEST) ;

83

84 glEnable (GL_BLEND) ;

85 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;

86 game : : engine : : current_sdr = game : : engine : : main_no_shad_sdr ;

87 s td : : l i s t <Scene * > : : i t e r a t o r i t = scenes . begin ( ) ;

88

89 while ( i t != scenes . end ( ) ) {

90 ( * i t )−>render (RENDER_OBJ , get_msec ( ) ) ;

91 i t ++;

92 }

93

94 i f ( ! s t r i n g s . empty ( ) ) {

95 g lD i sab l e (GL_CULL_FACE) ;

96 c r ed i t s _ t x t −>render ( get_msec ( ) ) ;

97 glEnable (GL_CULL_FACE) ;

98 }

99

100 g lD i sab l e (GL_BLEND) ;

101

102 game : : engine : : nuc_manager−>render (RENDER_PSYS , get_msec ( ) ) ;

103 }

Page 101: Mars2030 Thesis Booklet

101

104

105 / * Af ter drawing both eyes in to the t ex tu r e render ta rge t , r e v e r t

to drawing d i r e c t l y to the display ,

106 * and we c a l l ovrHmd_EndFrame , to l e t the Oculus SDK draw both

images properly , compensated fo r l ens

107 * d i s t o r t i o n and chromatic aber ra t ion onto the HMD screen .

108 * /

109 game : : engine : : ovr_r ta rg . unbind ( ) ;

110

111 ovrHmd_EndFrame(game : : engine : : ovr_data .hmd, pose , &game : : engine : :

ovr_data . fb_ovr_ tex [ 0 ] . Texture ) ;

112 }

Page 102: Mars2030 Thesis Booklet

102

Παράρτημα 1

Πλέγματα Πολυγώνων.

Το πλέγμα πολυγώνων είναι μία συλλογή από κορυφές (vertices), πλευ-

ρές (edges) και όψεις (faces), η οποία ορίζει το σχήμα ενός πολύεδρου αντι-

κειμένου στα γραφικά ηλεκτρονικών υπολογιστών και στον μοντελισμό στε-

ρεών αντικειμένων. Οι όψεις συνήθως αποτελούνται από τρίγωνα, τετρά-

πλευρα ή άλλα απλά κυρτά πολύγωνα, μιας και απλοποιεί το rendering.

Διάγραμμα 1.1: Πλέγμα Πολυγώνων

Page 103: Mars2030 Thesis Booklet

103

Παράρτημα 2

Computer Animation

Το computer animation είναι η τέχνη της δημιουργίας κινούμενων εικό-

νων χρησιμοποιώντας ηλεκτρονικούς υπολογιστές. Η χρήση τρισδιάστατων

γραφικών για την δημιουργία animation γίνεται όλο και μεγαλύτερη, παρ’

όλα αυτά χρησιμοποιούνται ακόμα δισδιάστατα γραφικά για στιλιστικούς

λόγους και για για λόγους καλύτερης απόδοσης σε εφαρμογές rendering

πραγματικού χρόνου. Μερικές φορές τα animation χρησιμοποιούνται στους

ηλεκτρονικούς υπολογιστές, μερικές φορές όμως χρησιμοποιούνται και σε

άλλα μέσα, όπως οι ταινίες. Το animation είναι επίσης γνωστό ως CGI

(Computer-Generated Imagery or Computer-Generated imaging), ειδικά όταν

χρησιμοποιείται σε ταινίες. Οι εικονικές οντότητες που χρησιμοποιούνται

στο animation μπορεί να περιέχουν ή να ελέγχονται από διάφορα γνωρί-

σματα (attributes), όπως τιμές μετασχηματισμών (location, orientation, scale)

αποθηκευμένα μέσα στον πίνακα μετασχηματισμού του αντικειμένου. Το

animation είναι η αλλαγή ενός γνωρίσματος του αντικειμένου στον χρόνο.

Υπάρχουν πολλοί τρόποι για να επιτευχθεί αυτό. Ο ποιό στοιχειώδης εί-

ναι βασισμένος στη δημιουργία και την επεξεργασία των keyframes, από τα

οποία το καθ’ ένα αποθηκεύει μία τιμή σε μία χρονική στιγμή ανά γνώρισμα

που θα μεταβληθεί. Τα λογισμικά επεξεργασίας και δημιουργίας γραφικών

(ή και μία δικιά σας game engine) δημιουργούν ενδιάμεσες τιμές των γνωρι-

σμάτων ανάλογα με τον χρόνο χρησιμοποιώντας διάφορες τεχνικές μαθημα-

τικής παρεμβολής (interpolation). Για να δημιουργηθεί η ψευδαίσθηση της

κίνησης, προβάλλονται στην οθόνη διαφορετικά στιγμιότυπα της εικόνας με

Page 104: Mars2030 Thesis Booklet

104

μεγάλη ταχύτητα. Αυτή η τεχνική είναι ακριβώς η ίδια με την ψευδαίσθηση

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

Page 105: Mars2030 Thesis Booklet

105

Παράρτημα 3

Απόδοση (Rendering)

Το rendering είναι η διαδικασία απεικόνισης ενός τρισδιάστατου ή δισ-

διάστατου μοντέλου χρησιμοποιώντας προγράμματα υπολογιστών. Ένα αρ-

χείο σκηνής περιέχει αντικείμενα που ορίζονται σε μία αυστηρά ορισμένη

γλώσσα ή δομή. Περιέχει δηλαδή πληροφορίες για τη γεωμετρία, την οπτική

γωνία, τα textures, το φωτισμό, τη σκίαση κ.ο.κ. της σκηνής. Τα δεδομένα

αυτά έπειτα στέλνονται σε ένα πρόγραμμα rendering για να υποστούν επε-

ξεργασία και να εξαχθεί το αποτέλεσμα σε μία ψηφιακή εικόνα η σε μία

εικόνα raster (bitmap). Το πρόγραμμα rendering είναι συνήθως χτισμένο

πάνω σε κάποιο λογισμικό γραφικών. Παρ’ ότι το γεγονός ότι οι τεχνικές

λεπτομέρειες των μεθόδων rendering διαφέρουν μεταξύ τους, η γενική πρό-

κληση που τίθεται είναι η παραγωγή μιας δισδιάστατης εικόνας από μία

τρισδιάστατη αντιπροσώπευση μίας σκηνής αποθηκευμένης σε ένα αρχείο.

Η διαδικασία αντιμετώπισης αυτής της πρόκλησης αναφέρεται συνήθως με

το όνομα “pipeline γραφικών” (Graphics Pipeline) και επιτελείται με τη βο-

ήθεια μίας συσκευής rendering, όπως μία GPU (Κάρτα γραφικών). Η GPU

είναι μία συσκευή που έχει την ικανότητα να βοηθήσει την CPU (Κεντρική

Μονάδα Επεξεργασίας) στην εκτέλεση υπολογισμών. Αν θέλουμε μία σκηνή

να φανεί σχετικά ρεαλιστική χρησιμοποιώντας εικονικό φωτισμό, το λογι-

σμικό rendering πρέπει να επιλύσει την εξίσωση του rendering. Η εξίσωση

του rendering δεν υπολογίζει όλα τα φυσικά φαινόμενα του φωτισμού, αλλά

είναι ένα γενικό μοντέλο φωτισμού για computer-generated εικόνες. Ο όρος

“rendering” χρησιμοποιείται επίσης για να περιγράψει την διαδικασία του

Page 106: Mars2030 Thesis Booklet

106

υπολογισμού των εφέ σε αρχεία επεξεργασίας βίντεο, για να παραχθεί το

τελικό αποτέλεσμα.

Διάγραμμα 3.1: Απόδοση Τρισδιάστατων Σφαιρών

Page 107: Mars2030 Thesis Booklet

107

Παράρτημα 4

Χαρτογράφηση Υφής (Texture

Mapping)

Η χαρτογράφηση υφής είναι μία μέθοδος για απόδοση ρεαλισμού, υφής

η χρώματος στις επιφάνειες ενός τρισδιάστατου μοντέλου. Η εφαρμογή της

τεχνικής αυτής στα γραφικά ηλεκτρονικών υπολογιστών εφευρέθηκε και

εφαρμόστηκε από τον Dr. Edwin Catmull το 1974. Ένας χάρτης υφής εφαρ-

μόζεται στην επιφάνεια ενός σχήματος ή πολυγώνου. Η εφαρμογή πολλών

τέτοιων υφών στις επιφάνειες ονομάζεται Mutlitexturing.

Διάγραμμα 4.1: Χαρτογράφηση Υφής

Page 108: Mars2030 Thesis Booklet

108

Γλωσσάρι

OpenGL Open Graphics Library

VBO Vertex Buffer Object

FBO Frame Buffer Object

FSAA Full Scene Anti-Aliasing

PCF Percentage Closer Filtering

CPU Central Processing Unit

GPU Graphics Processing Unit

SDK Software Development Kit

API Application Programming Interface

CGI Computer-Generated Imagery

HMD Head-Mounted Display

IPD Interpupillary Distance

FOV Field Of View

VR Virtual Reality

OpenAL Open Audio Library

HUD Heads Up Display

H/Y Ηλεκτρονικός Υπολογιστής

Page 109: Mars2030 Thesis Booklet

109

Βιβλιογραφία

Authors: Tomas Akenine-Möller, Eric Haines και Naty Hoffman (2012). Real-

Time Rendering. CRC Press. isbn: 978-1-56881-424-7.

Wikipedia. Computer animation. url: https://en.wikipedia.org/wiki/

Computer_animation.

— Computer graphics. url: https://en.wikipedia.org/wiki/Computer_

graphics.

— Cube mapping. url: https : / / en . wikipedia . org / wiki / Cube _

mapping.

— Gouraud shading. url: https://en.wikipedia.org/wiki/Gouraud_

shading.

— Oculus Rift. url: https://en.wikipedia.org/wiki/Oculus_Rift.

— OpenGL. url: https://en.wikipedia.org/wiki/OpenGL.

— Phong reflection model. url: https ://en.wikipedia.org/wiki/

Phong_reflection_model.

— Phong shading. url: https://en.wikipedia.org/wiki/Phong_

shading.

— Polygon mesh. url: https://en.wikipedia.org/wiki/Polygon_

mesh.

— Shading. url: https://en.wikipedia.org/wiki/Shading.

— Shadow mapping. url: https://en.wikipedia.org/wiki/Shadow_

mapping.

— Texture mapping. url: https://en.wikipedia.org/wiki/Texture_

mapping.

Page 110: Mars2030 Thesis Booklet

Η εργασία αυτή στοιχειοθετήθηκε με το πρόγραμμα X ELATEX. Για τη στοιχειοθέτηση της βιβλιογραφίας χρησιμο-

ποιήθηκε το πρόγραμμα biber και biblatex. Οι γραμματοσειρές που χρησιμοποιήθηκαν είναι οι Times New

Roman και Courier New.

Page 111: Mars2030 Thesis Booklet