Γραφικά µε Υπολογιστές



Σχετικά έγγραφα
Υλικά, φωτισμός και χρωματισμός

Μάθημα 1 ο : Εντολές κίνησης


Φωτισµός και σκίαση. Μέχρι τώρα θεώρηση: κάθε επιφάνεια µε ένα µοναδικό χρώµα. Τι λείπει; Αλληλεπίδραση φωτόςαντικειµένων. «Επίπεδη» όψη αντικειµένων

Ειδικά Θέματα Υπολογιστικής Όρασης και Γραφικής ΦΩΤΙΣΜΟΣ/ΣΚΙΑΣΕΙΣ. Ευάγγελος Θεοδωρίδης

Σηµερινό Μάθηµα! Γραφικά. Επιφάνεια µεκάθεταδιανύσµατα. Προσέγγιση εφαπτόµενου επιπέδου. Μοντέλα φωτισµού (Illumination models)

Φώτα - Εκτύπωση Αποθήκευση εικόνας

α) Κύκλος από δύο δοσµένα σηµεία Α, Β. Το ένα από τα δύο σηµεία ορίζεται ως κέντρο αν το επιλέξουµε πρώτο. β) Κύκλος από δοσµένο σηµείο και δοσµένο ευ

Μοντέλο φωτισμού Phong

ζωγραφίζοντας µε τον υπολογιστή

Κεφάλαιο 6 ο Φωτορεαλισµός

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

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

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

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

I λ de cos b (8.3) de = cos b, (8.4)

Άσκηση 10 Φωτισµός. Στόχος της άσκησης

ΕΡΓΑΣΙΑ ΕΞΑΜΗΝΟΥ - ΜΕΡΟΣ Γ'

Οδηγίες για την κατασκευή του αρχείου «Ταυτότητα (α+β) 2» 1. Αποκρύπτουµε τους άξονες και το παράθυρο άλγεβρας: Παράθυρο προβολή

Γραφικά Υπολογιστών: Φωτισμός

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

Τεχνολογία Ψυχαγωγικού Λογισμικού και Εικονικοί Κόσμοι Ενότητα 4η - 3Δ γραφικά

Το παράθυρο αυτό ενεργοποιείται με το κουμπί που βρίσκεται στην Βασική γραμμή εργαλείων (Toolbar) με την παρακάτω μορφή εικονιδίου

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

Π.Τ..Ε. Σηµειώσεις Σεµιναρίου «Τα µήλα των Εσπερίδων», Η ζωγραφική (Paint) Τα µενού της ζωγραφικής

Γυµ.Ν.Λαµψάκου Α Γυµνασίου Γεωµ.Β2.6 γωνίες από 2 παράλληλες + τέµνουσα 19/3/10 Φύλλο εργασίας

ΗΜΙΟΥΡΓΙΑ ΜΟΝΤΕΛΟΥ (1 ος ΤΡΟΠΟΣ)

Άσκηση 11 Υλικά. Στόχος της άσκησης

ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD

Σηµαντικές παρατηρήσεις σχετικά µε το backround:

ΚΑΙ ΓΡΑΦΙΚΩΝ. Μοντέλα και Αλγόριθμοι Φωτισμού

πως αντιγράφουµε ή µεταφέρουµε κείµενο

Αρχίστε αµέσως το πρόγραµµα xline Εσόδων Εξόδων.

Εισαγωγή στην Τεχνολογία - ΗΜΜΥ 101

ΠΕΡΙΕΧΟΜΕΝΑ. Περιγραφή της αρχικής οθόνης κάθε τάξης α. Εικονίδια επιλογής θεµατικών ενοτήτων β. Εικονίδια διαφυγής...

Σηµαντικές παρατηρήσεις σχετικά µε το backround:

παράθυρα ιδακτικό υλικό µαθητή Πλήκτρα για να το παράθυρο Λωρίδα τίτλου Πλαίσιο παραθύρου

ιαµόρφωση σελίδας Προεπισκόπηση Εκτύπωση

Μετασχηµατισµοί. Μετασχηµατισµοί είναι πράξεις (Τελεστές) που επιδρούν πάνω στις συντεταγµένες των σηµείων που απαρτίζουν ένα γεωµετρικό σχήµα M(V)

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

Μοντέλα & Αλγόριθµοι Φωτισµού

Θα συµπληρώσετε τα απαραίτητα στοιχεία που βρίσκονται µε έντονα γράµµατα για να δηµιουργήσετε την νέα εταιρεία.

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

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 1,β ΜΕΤΡΗΣΗ ΜΗΚΟΥΣ ΚΥΜΑΤΟΣ ΜΟΝΟΧΡΩΜΑΤΙΚΗΣ ΑΚΤΙΝΟΒΟΛΙΑΣ

γλώσσα προγραµµατισµού Logo

Οδηγίες για το Βιβλίο Κοστολογίου στα Γ κατηγορίας βιβλία

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

ιάθλαση. Ολική ανάκλαση. ιάδοση µέσα σε κυµατοδηγό.

ουλεύοντας µε το Finale (6η συνέχεια)

προγραµµατίζοντας τον υπολογιστή

Δημιουργώντας 3D μοντέλα - Εργαλείο Spin

( ) Κλίση και επιφάνειες στάθµης µιας συνάρτησης. x + y + z = κ ορίζει την επιφάνεια µιας σφαίρας κέντρου ( ) κ > τότε η

Εισαγωγή. Γιατί γραφικά υπολογιστών; Προσέγγιση «από πάνω προς τα κάτω» (top-down). Βαθµίδα διασύνδεσης προγραµµατιστή εφαρµογών (API)

Σχήµα 2.1: Εισαγωγή array στο Front Panel.

ΦΩΤΟΡΕΑΛΙΣΜΟΣ & ΚΙΝΗΣΗ (ΘΕΩΡΙΑ)

ΜΕΤΡΗΣΗ ΜΗΚΟΥΣ ΚΥΜΑΤΟΣ LASER

Μάθηµα 1. Κεφάλαιο 1o: Συστήµατα. γ R παριστάνει ευθεία και καλείται γραµµική εξίσωση µε δύο αγνώστους.

Οδηγίες χρήσης του λογισµικού "Πολλαπλασιασµός"

γράφοντας µε τον υπολογιστή

Περίθλαση από ακµή και από εµπόδιο.

4.5.6 ΡΗΤΑ ΠΟΛΥΩΝΥΜΙΚΑ ΤΜΗΜΑΤΑ Η ΑΠΕΙΚΟΝΙΣΗ ΣΗΜΕΙΟΥ ΜΕ ΒΑΡΟΣ ΤΟ ΚΥΚΛΙΚΟ ΤΜΗΜΑ

Εφαρµογή EXTRA. ιαδικασία ιαχείρισης Εκτύπωσης Ισοζυγίου Γενικού - Αναλυτικών Καθολικών

Σχήµα 4.1: Εισαγωγή βρόγχου while-loop.

Ανάκλαση Είδωλα σε κοίλα και κυρτά σφαιρικά κάτοπτρα. Αντώνης Πουλιάσης Φυσικός M.Sc. 12 ο ΓΥΜΝΑΣΙΟ ΠΕΡΙΣΤΕΡΙΟΥ

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


2.2.3 Η εντολή Εκτύπωσε

Πόλωση ηλεκτρικού πεδίου

Κεφάλαιο 32 Φως: Ανάκλασηκαι ιάθλαση. Copyright 2009 Pearson Education, Inc.

ΤΕΙ ΠΕΙΡΑΙΑ Τµήµα Μηχανολογίας

ΑΝΑΖΗΤΩΝΤΑΣ ΤΟΝ ΥΠΕΡΚΥΒΟ

ΣΕΤ ΑΣΚΗΣΕΩΝ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ Προθεσµία: 10/12/2014, 22:00

Shift+γράμμα. Πατάμε τον τόνο (δί[λα στο L) και μετά το φωνήεν. Πως βάζουμε διαλυτικά; Πατάμε το Shift+ τόνο και μετά το φωνήεν (ι ή υ)

ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ 2. Σύνταξη μπλοκ εντολών. Δραστηριότητα 1

2. Κάντε κλικ στο παράθυρο όψης Top για να το ενεργοποιήσετε, ώστε να σχεδιάσετε το πάτωµα του δωµατίου.

Οδοραµα mobile ΑΠΟΘΗΚΗ

Φύλλο Εργασίας «Προσέγγιση της γραφής Braille µέσω Scratch»

2 Ο Ε.Κ.Φ.Ε. ΗΡΑΚΛΕΙΟΥ. Οδηγίες χρήσης PDFCreator

#11 Έγχρωµο και Ασπρόµαυρο Φως

Εφαρµογή EXTRA. ιαδικασία εξαγωγής της Μηχανογραφικής. έκδοσης ισοζυγίου στην εφαρµογή Extra Λογιστική ιαχείριση.

Κ α τ α σ κ ε υ ή µ ο ν τ έ λ ο υ σ τ ο λ ο γ ι σ µ ι κ ό E c o t e c t

Ο ΗΓΟΣ ΧΡΗΣΗΣ ΓΕΩΜΕΤΡΙΑ

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

Κεφάλαιο 6 Μοντέλα Φωτισμού

Ο ΗΓΙΕΣ ΓΙΑ ΤΟ ΚΛΕΙΣΙΜΟ ΧΡΗΣΗΣ ΣΤΟ DYNAMICS NAV INNOVERA ERP

Εφαρµογή Βusiness. ιαδικασίες Μετασχηµατισµών Παραστατικών

Αρχές Ψηφιακής Επεξεργασίας Εικόνας

Άσκηση 7 Τρισδιάστατα εφέ (3D effects) στο Director

ΕΙΣΑΓΩΓΗ ΣΤΟ MATLAB- SIMULINK

Αρκετές φορές θα έχεις τυφλώσει τους φίλους σου με τον ήλιο. Μπορείς να εξηγήσεις:

Έστω οι παρακάτω περιπτώσεις τοµής ενός κώνου µε ένα επίπεδο:

TSA1233FW-00 ΓΙΑ ΤΗΝ ΙΚΗ ΣΑΣ ΑΣΦΑΛΕΙΑ: ΠΡΟ ΙΑΓΡΑΦΕΣ: ΕΓΚΑΤΑΣΤΑΣΗ - ΣΥΝ ΕΣΗ:

T (K) m 2 /m

ΚΕΦΑΛΑΙΟ 5 Ο ΒΑΣΙΚΕΣ ΑΡΧΕΣ ΣΧΕΔΙΟΥ ΔΡ ΛΕΩΝΙΔΑΣ ΑΝΘΟΠΟΥΛΟΣ, ΕΠΙΚΟΥΡΟΣ ΚΑΘΗΓΗΤΗΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΔΙΑΧΕΙΡΙΣΗΣ ΕΡΓΩΝ ΤΕΙ ΛΑΡΙΣΑΣ

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

Μάθημα 5 ο : Μετάδοση Μηνυμάτων

EΞΟΙΚΕΙΩΣΗ ΜΕ ΤΟ MOVIE MAKER

Περιεχόμενα. Τοπογραφικό... 9 Σκάλα Φωτορεαλισμός Αντικείμενα Ανοίγματα Γραμμές Επεξεργασία Περιβάλλον...

ΗΜΙΟΥΡΓΙΑ ΠΑΙΧΝΙ ΙΟΥ ΣΤΟ SCRATCH ΒΗΜΑ ΠΡΟΣ ΒΗΜΑ

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

Transcript:

Ιόνιο Πανεπιστήµιο, Τµήµα Πληροφορικής Γραφικά µε Υπολογιστές Εργαστήριο 3 Υλικά, φωτισµός και χρωµατισµός Στο εργαστήριο αυτό θα δούµε το µοντέλο φωτισµού που υποστηρίζει η OpenGL, και πώς να αλλάζουµε τις ιδιότητες των υλικών των τριδιάστατων µοντέλων στη σκηνή. Φωτισµός στην OpenGL Η OpenGL υποστηρίζει ένα απλοποιηµένο µοντέλο τοπικού φωτισµού (local lighting model) που βασίζεται στην σύνθεση έµµεσου (ambient), διάχυτος (diffuse), και κατευθυνόµενης ανάκλασης (specular) φωτισµού. Ι = m a *s a + (nl) m d *s d + (rv) m m s *s s Θυµίζουµε ότι το m a, m d, m s είναι τα χρώµατα υλικού, και τα s a, s d, s s είναι τα χρώµατα των συστατικών του φωτός (θα τα δούµε αργότερα). Κάθε συνθετικό του µοντέλου φωτισµού µπορεί να παραµετροποιηθεί ξεχωριστά µέσω ενός σετ εντολών της OpenGL. Έµµεσος φωτισµός (ambient light) s a Ο έµµεσος φωτισµός δεν έχει κάποια συγκεκριµένη τοποθεσία και κατεύθυνση στην σκηνή. Θεωρείται ότι προέρχεται από την συνολική ανάκλαση του φωτός σε όλες τις επιφάνειες της σκηνής. Έχει σταθερή ένταση για όλη την σκηνή και χρησιµοποιείται για να δώσει κάποιο φωτισµό στα αντικείµενα έστω και αν δεν φωτίζονται απευθείας από µια φωτεινή πηγή. ιάχυτος φωτισµός (diffuse light) s d Ο διάχυτος φωτισµός έχει τοποθεσία και κατεύθυνση και ανακλάται οµοιόµορφα στην επιφάνεια (χωρίς να δηµιουργεί γυαλάδες, όπως θα ανακλούταν πάνω σε ένα τοίχο). Ο διάχυτος φωτισµός εξαρτάται µόνο από την γωνία που πέφτει το φως στην επιφάνεια. Κώστας Αναγνώστου Σελίδα 1 26/11/2008

Φωτισµός κατευθυνόµενης ανάκλασης (specular light) s s Ο διάχυτος φωτισµός Κατευθυνόµενης ανάκλασης έχει τοποθεσία και κατεύθυνση όπως και ο διάχυτος αλλά σε αντίθεση µε αυτό δηµιουργεί έντονες ανακλάσεις (γυαλάδες) στην επιφάνεια. Η ανάκλαση αυτή εξαρτάται από την θέση του παρατηρητή. Ορίζοντας ένα φως στην OpenGL Ένα φως ορίζεται στην OpenGL σαν «φυσική» οντότητα, έχει δηλαδή θέση, κατεύθυνση και ένταση. Ορισµένος αριθµός φώτων υποστηρίζονται από την OpenGL και αυτό εξαρτάται από την κάρτα γραφικών στην οποία τρέχει. Συνήθως θα είναι πάνω από 8 και θα έχουν ονοµασία GL_LIGHT0 µέχρι GL_LIGHT{Max_Number}. Τα φώτα είναι και αυτά µέρος του state machine της OpenGL δηλαδή οποιαδήποτε παραµετροποίηση τους θα παραµείνει µέχρι να την αλλάξουµε ή να κλείσουµε την εφαρµογή. Η µορφή της εντολή που χρησιµοποιούµε για να θέσουµε µια παράµετρο σε ένα φως έχει την µορφή gllightfv(gl_light0, όνοµα_παραµέτρου, τιµή_παραµέτρου); Ο όνοµα_παραµέτρου καθορίζει ποια παράµετρο του φωτός θέλουµε να αλλάξουµε πχ GL_DIFFUSE αν θέλουµε να θέσουµε το διάχυτο χρώµα του φωτός ή GL_SPECULAR αν θέλουµε να αλλάξουµε το χρώµα της γυαλάδας ή GL_POSITION αν θέλουµε να θέσουµε την τοποθεσία του φωτός. Σύµφωνα µε τους κανόνες ονοµατολογίας που αναφέραµε στο εισαγωγικό εργαστήριο, η εντολή αυτή παίρνει σαν όρισµα (τιµή παραµέτρου) ένα διάνυσµα (vector) από αριθµού κινητής υποδιαστολής (floating point). Ένα διάνυσµα κρατάει τέσσερεις αριθµούς. Αντί για GL_LIGHT0 µπορούµε φυσικά να χρησιµοποιήσουµε όποιο φως θέλουµε. Για να θέσουµε το έµµεσο φωτισµό (ambient light) δεν µπορούµε να χρησιµοποιήσουµε την εντολή gllightfv διότι αυτή αφορά ένα συγκεκριµένο φως και Κώστας Αναγνώστου Σελίδα 2 26/11/2008

ο έµµεσος φωτισµός είναι κοινός για όλη την σκηνή (δεν προέρχεται από κάποιο συγκεκριµένο φως δηλαδή). Οπότε για να θέσουµε τον έµµεσο φωτισµό χρησιµοποιούµε την ειδική εντολή gllightmodelfv(gl_light_model_ambient,lightambientcolour); όπου lightambientcolour το διάνυσµα του περιέχει το χρώµα του έµµεσου φωτισµού για όλη την σκηνή. Έστω ότι ορίζουµε τις παραµέτρους ενός φωτός ως: GLfloat lightambientcolour[] = { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat lightdiffusecolour[] = { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat lightspecularcolour[] = { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat lightposition[] = { 1.0f, 0.0f, 0.0f, 1.0f }; Τότε για να ορίσω τον φωτισµό στην σκηνή µου µε ένα φως: gllightmodelfv(gl_light_model_ambient,lightambientcolour); gllightfv(gl_light0,gl_diffuse,lightdiffusecolour); gllightfv(gl_light0,gl_specular,lightspecularcolour); gllightfv(gl_light0,gl_position, lightposition); glenable(gl_light0); Το φως που µόλις δηµιουργήσαµε πρέπει να το «ανάψουµε» µε την χρήση της glenable() πριν το χρησιµοποιήσουµε. Μπορούµε αντίστοιχα να το σβήσουµε µε την χρήση της gldisable(). Αυτό µας επιτρέπει να δηµιουργήσουµε όσα φώτα χρειαζόµαστε σε µια σκηνή και µετά να τα ανάβουµε και να τα σβήνουµε κατά βούληση. Το φως είναι ένα πραγµατικό αντικείµενο για την OpenGL. Αυτό σηµαίνει ότι ο µετασχηµατισµός ModelView το επηρεάζει µε αποτέλεσµα να µπορεί να µετακινηθεί και να περιστραφεί σαν κανονικό αντικείµενο. Υλικά στην OpenGL Είδαµε πώς να δηµιουργήσουµε ένα φως στην OpenGL, και πώς ορίζουµε τις παραµέτρους του s a, s d, s s. Το φως όµως είναι ένα µόνο συστατικό του µοντέλου φωτισµού. Το πώς θα φανεί πραγµατικά το αντικείµενο (αν θα είναι µατ, γυαλιστερό κλπ) εξαρτάται από το υλικό το οποίο είναι «φτιαγµένο». Στην OpenGL µπορούµε να ορίσουµε τις ιδιότητες ενός υλικού (material) και το πώς αυτό θα συµπεριφέρεται όταν πέσει φως επάνω του. Ορίζουµε κάθε υλικό να έχει κάποιο «χρώµα» m =(r, g, b, a) για συστατικό του φωτός (έµµεσο, διάχυτο, κατευθυνόµενης ανάκλασης φωτισµό). Για να καθορίσουµε το πώς θα φανεί το υλικό κάτω από ένα φως πολλαπλασιάζουµε στοιχείο προς στοιχείο τα αντίστοιχα χρώµατα. Παράδειγµα έστω ένα φως µε έµµεσο φωτισµό s a = (1.0,1.0,1.0,1.0) και ένα υλικό µε αντίστοιχο χρώµα m a = (0.5, 0.0, 0.0, 1.0). Τότε αν φωτίσουµε το υλικό µε αυτό το φως θα έχουµε: Κώστας Αναγνώστου Σελίδα 3 26/11/2008

Φως µε s a = (1.0, 1.0, 1.0, 1.0). R = 1.0 G = 1.0 B = 1.0 1.0x0.5=0.5 1.0x0.0=0.0 1.0x0.0=0.0 Υλικό µε m a = (0.5, 0.0, 0.0, 1.0). To φως που θα ανακλαστεί από την επιφάνεια µε το υλικό αυτό θα είναι κόκκινο (0.5, 0.0, 0.0, 1.0) µιας µόνο το κόκκινο φως µπορεί να ανακλαστεί από το υλικό αυτό. Όπως και µε ένα φως, η OpenGL επιτρέπει να ορίσουµε το υλικό µια επιφάνειας µέσω της εντολής glmaterialfv(gl_front, όνοµα_παραµέτρου, τιµή_παραµέτρου); H παράµετρος GL_FRONT καθορίζει ότι θέλουµε να ορίσουµε το υλικό µόνο για την «µπροστά» πλευρά του τριγώνου, δηλαδή την πλευρά που βλέπει προς την κάµερα. Τι είναι µπροστά και τι πίσω πλευρά ενός τριγώνου; Ένα τρίγωνο στο τριδιάστατο χώρο είναι ένα «φυσικό» αντικείµενο το οποίο έχει 2 πλευρές και κατά κανόνα πρέπει να τις φωτίσουµε και να ορίσουµε υλικό και για τις δυο. Για να ξεχωρίσουµε τις δυο αυτές πλευρές ορίζουµε την σειρά µε την οποία τις διατρέχουµε. v1 v1 180 o περιστροφή v3 v2 v2 v3 Ας υποθέσουµε ότι στο αρχικό τρίγωνο ορίζουµε τις κορυφές µε τη σειρά v1, v2, v3 και ορίζουµε αυτή την φορά ως δεξιόστροφη (clockwise). Αν περιστρέψουµε το τρίγωνο 180 ο ως προς την κάθετο και δοκιµάσουµε να το διατρέξουµε µε την σειρά που ορίσαµε τις κορυφές θα πάρουµε αριστερόστροφη (counter-clockwise) φορά (δηλαδή η πλευρά που στο αρχικό «έβλεπε» προς τα εµάς τώρα «βλέπει» προς τα πίσω. Με αυτή τη γνώση µπορούµε να εφαρµόσουµε µερικές βελτιστοποιήσεις κατά την απεικόνιση. Όταν το τρίγωνο είναι µέρος ενός κλειστού µοντέλου (µιας σφαίρας, ενός κύβου, ενός κυλίνδρου) µόνο η µία του πλευρά είναι πάντα ορατή (η άλλη δείχνει στο εσωτερικό του αντικειµένου). Οπότε µπορούµε να επιλέξουµε να «βάψουµε» µόνο τα δεξιόστροφα τρίγωνα. Όπως επίσης µπορούµε να επιλέξουµε καθόλου τα τρίγωνα που βλέπουν προς τα «πίσω» γιατί βρίσκονται στην πλευρά του αντικειµένου που δεν είναι ορατή από την κάµερα. Η τεχνική αυτή λέγεται culling και κάνει την απεικόνιση πολύ γρηγορότερη (µειώνει µέχρι και σχεδόν 50% τον αριθµό των τρίγωνων που πρέπει να απεικονιστούν. Στην OpenGL ενεργοποιούµε το culling µε 2 εντολές //ενεργοποίηση glenable(gl_cull_face); //ορισµός τρίγωνου «αριστερόστροφης» φοράς ως µπροστά glfrontface(gl_ccw); Κώστας Αναγνώστου Σελίδα 4 26/11/2008

Υπάρχουν και άλλες τιµές για την πρώτη παράµετρο όπως GL_BACK ή GL_FRONT_AND_BACK που ορίζουν σε ποιες πλευρές να εφαρµόσουµε το υλικό, όµως κατά κανόνα θα χρησιµοποιούµε µόνο το GL_FRONT. Μπορούµε να θέσουµε τιµή σε έναν αριθµό παραµέτρων υλικού µε την εντολή αυτή όπως GL_AMBIENT, GL_DIFFUSE και GL_SPECULAR, που αντιστοιχούν στα χρώµατα m a, m d, m s στο µοντέλο φωτισµού που αναφέραµε. Η εντολή όπως φανερώνει και το όνοµα της δέχεται ένα διάνυσµα 4 αριθµών κινητής υποδιαστολής. Υπάρχει και µια παραλλαγή της εντολής αυτή, η glmateriali(gl_front, όνοµα_παραµέτρου, τιµή_παραµέτρου ); που δέχεται ένα ακέραιο σαν τιµή παραµέτρου. Μπορεί να χρησιµοποιηθεί για παραµέτρους υλικού που δέχονται έναν αριθµό πχ η GL_SHININESS που ορίζει πόσο γυαλιστερή είναι η επιφάνεια και παίρνει τιµές από 1 µέχρι 128. Αν για παράδειγµα θέλουµε να ορίσουµε ένα υλικό για τα αντικείµενα µας τότε κάνουµε τα εξής: GLfloat materialambientcolour[] = { 0.2125f, 0.1275f, 0.054f, 1.0f }; GLfloat materialdiffusecolour[] = { 0.714f, 0.4284f, 0.18144f, 1.0f }; GLfloat materialspecularcolour[] = { 0.393548f, 0.271906f, 0.166721f, 1.0f}; glmaterialfv(gl_front, GL_AMBIENT,materialAmbientColour); glmaterialfv(gl_front, GL_DIFFUSE,materialDiffuseColour); glmaterialfv(gl_front, GL_SPECULAR,materialSpecularColour); glmateriali(gl_front,gl_shininess,128); Ορίζοντας το φως και το υλικό του αντικειµένου έχουµε ορίσει πλήρως το µοντέλο φωτισµού της σκηνής. Είδη φώτων στην OpenGL Η OpenGL υποστηρίζει τα 3 πιο διαδεδοµένα ήδη φώτων Σηµειακό φως (point light): έχει θέση και χρώµα άλλα όχι κατεύθυνση. Ακτινοβολεί το φως εξίσου προς όλες τις κατευθύνσεις Προβολέας (spot light): έχει θέση και χρώµα και κατεύθυνση. Ακτινοβολεί το φως εξίσου µε µορφή κώνου προς µια κατεύθυνση (σαν φακός) Κατευθυνόµενο φως (directional light): έχει χρώµα και κατεύθυνση αλλά όχι θέση. Θεωρείται ότι η πηγή του βρίσκεται απείρως µακριά και όλες οι ακτίνες φωτός είναι παράλληλες (όπως ο ήλιος) Ένα φως στην OpenGL είναι εξορισµού σηµειακό. Αν θέλουµε να το κάνουµε κατευθυνόµενο (directional) το µόνο που έχουµε να κάνουµε είναι να µηδενίσουµε την τελευταία τιµή του διανύσµατος θέσης του: GLfloat lightposition[] = { 1.0f, 0.0f, 0.0f, 0.0f }; gllightfv(gl_light0,gl_position, lightposition); Αν θέλουµε να δηµιουργήσουµε ένα φως-προβολέα πρέπει να ορίσουµε 2 παραµέτρους, την γωνία του κώνου φωτός που δηµιουργεί το προβολέας GL_SPOT_CUTOFF και την κατεύθυνση GL_SPOT_DIRECTION του κώνου φωτός. gllightf(gl_light0,gl_spot_cutoff,20.0f); gllightfv(gl_light0,gl_spot_direction,spotdir); Κώστας Αναγνώστου Σελίδα 5 26/11/2008

Χρωµατισµός στην OpenGL Από την στιγµή που έχουµε υπολογίσει το χρώµα εφαρµόζοντας το µοντέλο φωτισµού σε κάποιο σηµείο (ή και περισσότερα σηµεία), πρέπει να σκεφτούµε πως θα χρησιµοποιήσουµε αυτό το χρώµα για να βάψουµε το τρίγωνο. Αυτή η διαδικασία λέγεται χρωµατισµός (shading). Η OpenGL υποστηρίζει 2 τρόπους χρωµατισµού αντικειµένου: 1. Σταθερός χρωµατισµός (Flat shading) 2. Gouraud χρωµατισµός (Gouraud shading) Σταθερός χρωµατισµός (Flat shading) Με αυτή την µέθοδο χρησιµοποιούµε το µοντέλο φωτισµό (ή κάποια άλλη µέθοδο) για να υπολογίσουµε ένα χρώµα. Έπειτα χρησιµοποιούµε αυτό το ένα χρώµα για να βάψουµε όλο το τρίγωνο. Είναι πολύ γρήγορη µέθοδος χρωµατισµού, αλλά δεν παράγει καλά οπτικά αποτελέσµατα παρά µόνο όταν αριθµός των τριγώνων στο αντικείµενο είναι µεγάλος. n O σταθερός χρωµατισµός ενεργοποιείται στην OpenGL µε την χρήση της εντολής glshademodel(gl_flat); Gouraud χρωµατισµός (Gouraud shading) Με αυτή την µέθοδο χρησιµοποιούµε το µοντέλο φωτισµό (ή κάποια άλλη µέθοδο) για να υπολογίσουµε ένα χρώµα ανά κορυφή τριγώνου. Έπειτα χρησιµοποιούµε γραµµική παρεµβολή (linear interpolation) αυτών των 3 χρωµάτων για να υπολογίσουµε το χρώµα σε οποιοδήποτε σηµείο του τριγώνου. Η µέθοδος αυτή παράγει καλύτερα οπτικά αποτελέσµατα από την προηγούµενη. Απαιτεί και αυτή όµως σχετικά µεγάλο αριθµό τριγώνων στο αντικείµενο για να κάνει καλή απεικόνιση κατευθυνόµενων αντανακλάσεων (specular reflections) n 1 n 3 n 2 Κώστας Αναγνώστου Σελίδα 6 26/11/2008

O χρωµατισµός Gouraud ενεργοποιείται στην OpenGL µε την χρήση της εντολής glshademodel(gl_smooth); Εφαρµογή µοντέλου φωτισµού στην OpenGL Στην σηµερινή εργαστηριακή άσκηση θα εφαρµόσουµε το µοντέλο φωτισµού της OpenGL και ένα υλικό σε ένα αντικείµενο για να καταλάβουµε καλύτερα τον ρόλο των παραµέτρων του φωτισµού και του υλικού στην τελική εµφάνιση του αντικειµένου. Φορτώστε το project lab3.dev στο περιβάλλον ανάπτυξης εφαρµογών DevC++. Ο κώδικας της εφαρµογής βρίσκεται στο αρχείο main.cpp. Ο κώδικας περιέχει σχόλια για όλα τα σηµεία του προγράµµατος που µας ενδιαφέρουν. Κοµµάτια του κώδικα και άλλες παραµετροποιήσεις δεν µας αφορούν σε αυτή την άσκηση και µένουν ασχολίαστα. Η εφαρµογή ακολουθεί το γνωστό σκελετό που χρησιµοποιούµε στις εργαστηριακές ασκήσεις µε µία προσθήκη. Στην σηµερινή άσκηση θα χρησιµοποιήσουµε µια συνάρτηση για να «διαβάσουµε» το πληκτρολόγιο και τα cursor keys ώστε να µετακινήσουµε το µοντέλο µας ανάλογα µε την είσοδο του χρήστη. Η συνάρτηση που το κάνει αυτό είναι η void specialkeypress(int key, int x, int y); και ο τρόπος που την ορίζουµε (κάνουµε register στο GLUT) είναι µέσω της glutspecialfunc(specialkeypress); Καλούµε αυτή την συνάρτηση για να ορίσουµε την specialkeypress() µέσα από την συνάρτηση main(). Η specialkeypress() καλείται κάθε φορά που πατούµε από τα «ειδικά» πλήκτρα, όπως CTRL, SHIFT, cursor keys. Αν είναι κάποιο από το cursor keys αλλάζουµε τη γωνία περιστροφής του αντικειµένου ανάλογα init() Σε αυτό το εργαστήριο κάνουµε µερικές επιπλέον αρχικοποιήσεις στην συνάρτηση init() που έχουν να κάνουµε µε το φωτισµό του µοντέλου. Ορίζουµε τον έµµεσο φωτισµό στην σκηνή µε την εντολή gllightmodelfv(gl_light_model_ambient,lightambientcolour); Και δηµιουργούµε ένα diffuse (διάχυτο) φως και ένα υλικό µε τις εντολές gllightfv(gl_light0,gl_diffuse,lightdiffusecolour); glenable(gl_light0); glmaterialfv(gl_front, GL_AMBIENT,materialAmbientColour); glmaterialfv(gl_front, GL_DIFFUSE,materialDiffuseColour); Επίσης επιλέγουµε σταθερό χρωµατισµό (flat shading) για τα αντικείµενα µας glshademodel(gl_flat); renderscene() Κώστας Αναγνώστου Σελίδα 7 26/11/2008

Οι κυριότερες αλλαγές αφορούν τον φωτισµό της σκηνής. Για να οπτικοποιήσουµε το φως της σκηνής µας, θα το ζωγραφίσουµε σαν µια µικρή κίτρινη σφαίρα που έχει την ίδια θέση µε το πραγµατικό φως. Το πραγµατικό φως το τοποθετούµε στην θέση lightpos µέσω της εντολής: gllightfv(gl_light0,gl_position,lightpos); Επίσης ελέγχουµε αν πρέπει να περιστρέψουµε το φως και την σφαίρα που το αναπαριστά: //περίστρεψε το φως γύρω από τον Z glrotatef(lightangle, 0.0f, 0.0f, 1.0f); //έλεγξε άν πρέπει να αλλάξουµε την γωνία περιστροφής του φωτός if (RotateLight) { LightAngle += 0.1; } Τέλος περιστρέφουµε το αντικείµενο ανάλογα µε την είσοδο του χρήστη και το απεικονίζουµε στην οθόνη //περίστρεψε το αντικείµενο γύρω απο τον X και Y ανάλογα µε την //γωνία που έχει καθορίσει ο χρήστης. glrotatef(xrot, 1.0f, 0.0f, 0.0f); glrotatef(yrot, 0.0f, 1.0f, 0.0f); glscalef(0.3,0.3,0.3); //επέλεξε τι θα ζωγραφίσουµε if ( ModelID == 1) { //ζωγράφισε το µοντέλο του διαστηµοπλοίου rendermodel(object); } else { //ζωγράφισε την σφαίρα glutsolidsphere(15.0,20,20); } Πατώντας το πλήκτρο m επιλέγουµε αν θα απεικονίσουµε την σφαίρα ή ένα διαστηµόπλοιο. Επίσης µε το πλήκτρο a µπορούµε να εµφανίσουµε και να κρύψουµε το σύστηµα αξόνων του κόσµου µας. Με το spacebar µπορούµε να κάνουµε το φως να περιστρέφεται γύρω από το αντικείµενο µας. Τέλος µε τα cursor keys (βελάκια) µπορούµε να περιστρέψουµε το αντικείµενο µας. Πράγµατα να δοκιµάσετε Α) Αυξήστε τον αριθµό των πολυγώνων που χρησιµοποιούνται για την απεικόνιση της σφαίρας. glutsolidsphere(15.0,20,20); Κάντε τους δυο τελευταίους αριθµούς (100, 100) και (300, 300). Τι συµβαίνει µε την ποιότητα απεικόνισης; Κώστας Αναγνώστου Σελίδα 8 26/11/2008

Β) Στην σφαίρα µε τον αρχικό αριθµό πολυγώνων δοκιµάστε να αλλάξτε το χρωµατισµό σε Gouraud (συνάρτηση init()) glshademodel(gl_smooth); οκιµάστε πάλι να αυξήσετε τον αριθµό πολυγώνων της σφαίρας. Γ) Αλλάξτε πάλι τη µέθοδο χρωµατισµού σε glshademodel(gl_flat); και την σφαίρα στο αρχικό αριθµό πολυγώνων glutsolidsphere(15.0,20,20); Τώρα προσθέστε κατευθυνόµενη ανάκλαση στο φως και στο υλικό. Αυτό θα γίνει στην init() Κάτω από την gllightfv(gl_light0,gl_diffuse,lightdiffusecolour); Προσθέστε (µε copy-paste) gllightfv(gl_light0,gl_specular,lightspecularcolour); Και κάτω από την glmaterialfv(gl_front, GL_DIFFUSE, materialdiffusecolour); Προσθέστε (µε copy-paste) glmaterialfv(gl_front, GL_SPECULAR, materialspecularcolour); glmateriali(gl_front,gl_shininess,128); ) οκιµάστε πάλι τα βήµατα Α και Β Ε) Κάντε το φως της σκηνής κατευθυνόµενο (directional) µηδενίζοντας το τελευταίο στοιχείο του διανύσµατος θέσης lightpos[] = { 9.0f, 9.0f, 0.0f, 1.0f }; Ζ) Κάντε το φως της σκηνής προβολέα. Επαναφέρετε το lightpos στην αρχική του τιµή και προσθέστε τις εξής εντολές στο πρόγραµµα Στην init() κάτω από την gllightfv(gl_light0,gl_specular,lightspecularcolour); Προσθέστε την εντολή gllightf(gl_light0,gl_spot_cutoff,20.0f); Στην renderscene() κάτω από την gllightfv(gl_light0,gl_position,lightpos); Προσθέστε την εντολή Κώστας Αναγνώστου Σελίδα 9 26/11/2008

gllightfv(gl_light0,gl_spot_direction,spotdir); Η) Αλλάξτε τις παραµέτρους του υλικού (material) δοκιµάζοντας διάφορα υλικά από τον πίνακα. ( Θα θέσετε τις νέες τιµές στα διανύσµατα material*colour[] στην κορυφή του αρχείου main.cpp. εν θα αλλάξετε τα φώτα. ) Κώστας Αναγνώστου Σελίδα 10 26/11/2008