Μάθημα 2ο

Δεύτερο Μάθημα Γραφικών – OpenGL

Τη θεωρία και τον κώδικα του μαθήματος μπορείτε να τα βρείτε εδώ.
Τις θεωρητικές και πρακτικές ασκήσεις του μαθήματος μπορείτε να τις βρείτε εδώ.

1ο βήμα


Η glRect φτιάχνει ορθογώνια. Παίρνει σαν ορίσματα την κάτω αριστερή και πάνω δεξιά γωνία του ορθογωνίου. Για οποιοδήποτε πιο πολύπλοκο σχήμα πρέπει να χρησιμοποιηθούν οι glBegin και glEnd. Βάλτε σε σχόλια το κομμάτι 00.

Οι glBegin και glEnd οριοθετούν vertices που καθορίζουν ένα σχήμα. Η glBegin δέχεται ένα όρισμα που διευκρινίζει με ποιον από δέκα τρόπους θα συνδυαστούν τα vertices. Αφαιρέστε τα σχόλια από το κομμάτι 01 και πειραματισθείτε με τις διάφορες παραμέτρους (προσοχή, αφήστε μόνο ένα glBegin σε χρήση). Οι παράμετροι που χρησιμοποιούνται σε αυτό το κομμάτι κώδικα είναι οι ακόλουθες:
GL_POINTS
Μεταχειρίζεται κάθε vertex ως ανεξάρτητο σημείο. Η glPointSize ,πριν τη glBegin, μας καθορίζει το μέγεθός τους.
GL_LINES
Μεταχειρίζεται κάθε ζευγάρι vertices ως μία ανεξάρτητη γραμμή. Οπότε από Ν σημεία ορίζονται Ν/2 γραμμές.
GL_LINE_STRIP
Ζωγραφίζει μια συνδεδεμένη ομάδα ευθύγραμμων τμημάτων από το πρώτο vertex στο τελευταίο. Με Ν σημεία, ζωγραφίζονται Ν-1 τμήματα.
GL_LINE_LOOP
Ζωγραφίζει μια συνδεδεμένη ομάδα ευθύγραμμων τμημάτων από το πρώτο vertex στο τελευταίο, έπειτα πίσω στο πρώτο. Με Ν σημεία, ζωγραφίζονται Ν τμήματα

GL_TRIANGLES
Μεταχειρίζεται κάθε τριάδα vertices ως ανεξάρτητο τρίγωνο. Δηλαδή από Ν σημεία ζωγραφίζονται Ν/3 τρίγωνα.

Υπάρχουν ακόμη οι εξής παράμετροι: GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS , GL_QUAD_STRIP, GL_POLYGON


2ο βήμα

Τώρα θα δούμε τους μετασχηματισμούς των αντικειμένων.
Η glTranslatef(x,y,z) μετατοπίζει το αντικείμενο κατά το διάνυσμα x,y,z
Η glRotatef(θ,x,y,z) περιστρέφει το αντικείμενο κατά θ μοίρες γύρω από τον άξονα που καθορίζεται από διάνυσμα x,y,z
Η glScalef(sx,sy,sz) κλιμακώνει το αντικείμενο κατά sx,sy,sz

Να θυμάστε ότι το OpenGL είναι μια μηχανή καταστάσεων. Κάθε μετασχηματισμός θα ισχύει για όλα τα μετέπειτα αντικείμενα, μέχρι να εφαρμοστεί ο αντίστροφός του ή να φορτώσουμε τον μοναδιαίο πίνακα.

Για να δείτε την επίδραση των μετασχηματισμών ξεσχολιάστε τα κομμάτια κώδικα (02a)-(02c) και «παίξτε» με τις τιμές.

Στα κομμάτια κώδικα (02d-*) φαίνεται η διαφορά στην εφαρμογή πρώτα ενός μετασχηματισμού περιστροφής και μιας μεταφοράς και στην εφαρμογή τους με την αντίστροφη σειρά. Μπορείτε να το δείτε και στην παρακάτω εικόνα.

Free Image Hosting
Εικόνα 1 Περιστροφή και μεταφορά vs. μεταφοράς και περιστροφής

Τέλος στα κομμάτια κώδικα (02e-*) μπορείτε να δείτε ότι δύο μετασχηματισμοί μεταφοράς, είναι ισοδύναμοι με έναν όπου η μεταφορά σε κάθε άξονα είναι το άθροισμα των δύο άλλων.

3ο βήμα

Παρατηρούμε μια νέα συνάρτηση (που είναι δηλωμένη στο .h αρχείο), την idle. Στο αρχείο main.cpp , στη main χρησιμοποιούμε την εντολή:
glutIdleFunc(Idle);
Με την εντολή αυτή υποδεικνύουμε στο glut ποια συνάρτηση (που δεν παίρνει ορίσματα και δεν επιστρέφει τιμή) θα χρησιμοποιείται όταν το glut δεν «ασχολείται» με κάτι άλλο (κατάσταση «ηρεμίας»), δηλαδή όταν δεν κάνει render τα γραφικά μας και δεν δέχεται είσοδο από το πληκτρολόγιο ή το ποντίκι. Η κατάσταση ηρεμίας έρχεται όταν τελειώνει η επεξεργασία ενός καρέ, οπότε η Idle() μπορεί να χρησιμοποιηθεί για να δημιουργήσουμε κίνηση. Εδώ ορίζουμε τη συνάρτηση αυτή ‘Idle’, αλλά μπορείτε να την ονομάσετε όπως θέλετε. Ξεσχολιάστε τα τμήματα κώδικα (03) στην main() και render() και τρέξτε το πρόγμαμμα.

Ουσιαστικά χρησιμοποιούμε την Idle για να δώσουμε κίνηση (animation) στην σκηνή μας. Ανανεώνουμε τις μεταβλητές που επηρεάζουν την κίνηση στην Idle και τις χρησιμοποιύμε μέσα σε μετασχηματισμούς στην Render.





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

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου