the modelview matrix

44
The ModelView Matrix Το modelview matrix στην ουσία είναι ένα σύστημα αξόνων που μας βοηθάει να τοποθετούμε και περιστρέφουμε αντικείμενα. Είναι ένας πίνακας 4 X 4 ο οποίος ή μετασχηματίζει κορυφές (vertices) ή μετασχηματίζεται ο ίδιος σε συνδυασμό με άλλους πίνακες. Για να μετασχηματίσω μια κορυφή απλα πολλαπλασιάζω το modelview matrix με το σημείο και προκύπτει ένα νέο σημείο στον χώρο που είναι το τελικο αποτέλεσμα.

Upload: fuller

Post on 07-Jan-2016

26 views

Category:

Documents


3 download

DESCRIPTION

The ModelView Matrix. Το modelview matrix στην ουσία είναι ένα σύστημα αξόνων που μας βοηθάει να τοποθετούμε και περιστρέφουμε αντικείμενα. Είναι ένας πίνακας 4 X 4 ο οποίος ή μετασχηματίζει κορυφές (vertices) ή μετασχηματίζεται ο ίδιος σε  συνδυασμό με άλλους πίνακες. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: The ModelView Matrix

The ModelView Matrix

• Το modelview matrix στην ουσία είναι ένα σύστημα αξόνων που μας βοηθάει να τοποθετούμε και περιστρέφουμε αντικείμενα.

• Είναι ένας πίνακας 4 X 4 ο οποίος ή μετασχηματίζει κορυφές (vertices) ή μετασχηματίζεται ο ίδιος σε  συνδυασμό με άλλους πίνακες.

• Για να μετασχηματίσω μια κορυφή απλα πολλαπλασιάζω το modelview matrix με το σημείο και προκύπτει ένα νέο σημείο στον χώρο που είναι το τελικο αποτέλεσμα.

Page 2: The ModelView Matrix

Τhe Modelview Matrix

• Είναι το default matrix που μας μεταφέρει η OpenGL αλλα μπορούμε να μεταβούμε σε αυτο και με την βοήθεια της συνάρτησης. glMatrixMode(GL_MODELVIEW)

• Συνηθώς οταν αρχίζουμε το render code θέλουμε να μεταφερθούμε στο σημείο (0,0,0) του ModelView Matrix.Αυτο το κάνουμε με την χρήση της συνάρτησης glLoadIdentity()

Page 3: The ModelView Matrix

Translation

• Οταν μετακινώ ένα αντικείμενο απο ένα σημειο του χώρου σε ένα αλλο τοτε κάνω translation.

• Translation στην OpenGL μπορώ να κάνω με την βοήθεια της συνάρτησης glTranslate(d,f)(TYPE x,TYPE y,TYPE z).

• Ως ορίσματα η συνάρτηση δέχεται το ποσοστό μετακίνησης στους άξονες.

• Για παράδειγμα αμα είμαι στο σημείο 3,4,-10 και θέλω να πάω στο σημείο 7,-4,-5 θα περάσω ως όρισμα στην συνάρτηση glTranslatef(4,-8,5).

Page 4: The ModelView Matrix

Translation

• Παντα την πράξη του translation την εκτελούμε πριν ζωγραφίσουμε τα αντικειμενά μας.

• πχ.glLoadIdentity();glTranslatef(,4,-8,5)renderCube();

Page 5: The ModelView Matrix

Rotation

• Rotation κάνουμε οταν θέλουμε να περιστρέψουμε ένα αντικείμενο σε κάποιο άξονα.

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

• Οταν περιστρέφω κατι τοτε το σύστημα αξόνων αλλάζει.• Στην ΟpenGL μπορώ να περιστρέψω ένα αντικείμενο με

την συνάρτηση glRotate(d,f)(TYPE angle,TYPE x,TYPE y,TYPE z).

Page 6: The ModelView Matrix

Rotation

• H συνάρτηση glRotate δέχεται ως ορίσματα την γωνία περιστροφής και το σημείο που γινέται (χ,y,z).

• Για παράδειγμα αν θέλω να περιστραφώ 90 μοίρες γύρω απο τον άξονα y τότε δίνω την εντολήglRotatef(90.0f,0.0,1.0,0.0).

• Η OpenGL στις περιστροφές πηγαίνει με counter-clockwise λογική δηλαδή αμα ήθελα να περιστραφώ κατα 90 μοίρες clockwise θα έδινα -90.0 ως όρισμα.

Page 7: The ModelView Matrix

Rotation

• Αν θέλω να περιστραφώ γύρω απο έναν άξονα περα των βασικών x,y,z αυτο που πρέπει να κάνω είναι να περάσω ως όρισμα στην συνάρτηση το σημείο που θέλω (χ,y,z).

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

• Την glRotate απο και την glTranslate τις εκτελώ πριν το render code μου.

Page 8: The ModelView Matrix

Scale

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

• Δηλαδή όταν εκτελώ πράξεις scaling τοτε στην ουσία πολλαπλασιάζω τις συντεταγμένες ενός σημείο με ενα scale factor και έχω το τελικό αποτέλεσμα.

• Scaling στην OpenGL πραγματοποιώ με την συνάρτησηglScale(d,f)(TYPE x,TYPE y,TYPE z).

Page 9: The ModelView Matrix

Scale

• H συνάρτηση glScale δέχεται ως όρισμα τις τιμές του scale factor για τους άξονες.

• Δηλαδή αν θέλω να ζωγραφίσω έναν κύβο διπλάσιο στον άξονα χ  αλλά στους άλλους άξονες να μην αλλάξει το μέγεθος του τοτε θα δώσω glScalef(2.0,1.0,1.0).

• Aλλα άμα θέλω να κάνω shrink το αντικείμενο τοτε θα δώσω τιμές απο 0 μέχρι 1.

Page 10: The ModelView Matrix

Scale

• Aμα δώσω αρνητικές τιμές στον scale factor τοτε το αντικείμενο μας θα κάνει flip.

• Aυτο είναι ένα στοιχείο που βοηθάει πολύ οταν θέλω να έχω reflections.

Page 11: The ModelView Matrix

Matrix Stacks

• Μέχρι στιγμής έχουμε δει το modelview matrix,που στην ουσία είναι η κορυφή μιας στοίβας απο πίνακες(matrices).

• Υπάρχουν matrix stacks για όλα τα έιδη των πινάκων.Δηλαδή υπάρχει η projection matrix stack,texture matrix stack,color matrix stack κτλ.

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

Page 12: The ModelView Matrix

Matrix Stacks

Για παράδειγμα αμα είμαι στο σημείο 0,0,0 και κάνω Push Matrix και αμέσως μετα κάνω 2 πράξεις translate (10,0,0) και (10,5,3) τοτε θα βρίσκομαι στο σημείο (20,5,3).• Αμα κάνω pop απο την στοίβα τοτε θα ξαναμεταρφεθώ στο

σημείο (0,0,0) κτλ.

Page 13: The ModelView Matrix

Matrix Stacks

Page 14: The ModelView Matrix

Matrix Stacks

• Για να μεταφέρουμε ένα matrix στην στοίβα χρησιμοποιούμε την συνάρτηση glPushMatrix() ενώ για να κάνουμε Pop την συνάρτηση glPopMatrix().

• Aυτες η συναρτήσεις δεν δέχονται ορίσματα και τις εκτελούμε πριν απο μια πράξη translation,rotation,scale(glPushMatrix) και αμα θέλω να κάνω pop μετα απο ένα render code block.

Page 15: The ModelView Matrix

Texture Mapping

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

• Τα χρώματα ομως δεν δείχνουν και τόσο ωραία και είναι δύσκολο να έχουν έναν υψηλό βαθμό αληθοφάνειας.

• Χρησιμοποιώντας όμως την τεχνική του texture mapping μπορούμε να έχουμε μια δραματική αύξηση του ρεαλισμού στις σκηνές μας.

Page 16: The ModelView Matrix

Texture Mapping

• Texture mapping ονομάζουμε την τεχνική προσαρμογής μια εικόνας πάνω σε μια επιφάνεια.

• Ενά texture map είναι ένα ορθογώνιο που περιέχει χρωματικές πληροφορίες και κάθε χρωματικό στοιχείο ονομάζεται texel.

• Μπορεί ένα texture map να είναι ένα ορθογώνιο ομως προσαρμόζεται και σε αλλες επιφάνειες με την χρήση texture coordinates.

Page 17: The ModelView Matrix

Παράδειγμα Texture Map

Page 18: The ModelView Matrix

Texture Mapping

• Ένα τυπικό texture map είναι μια δισδιάστατη εικόνα με ύψος και πλάτος.

• Αλλα μερικά effects μπορούν να χρησιμοποιούν ειτε 1-dimension map ειτε τρισδιάστατα maps με πλάτος,ύψος και βάθος.

Page 19: The ModelView Matrix

Texture Mapping in OpenGL

• Για να μπορώ να προσαρμόσω ένα tex map πάνω σε μια επιφάνεια με την χρήση της OpenGL θα πρέπει πρώτα να εκτελέσω καποια βήματα

• Το πρώτο βήμα που πρέπει να κάνω είναι να ορίσω το texture container.

Page 20: The ModelView Matrix

Binding a Texture Map

• Για να μπορέσω να ορίσω ένα tex container θα πρέπει να χρησιμοποιήσω την συνάρτηση glGenTextures(GLsizei n,GLuint *tex);

• H συνάρτηση glGenTextures δέχεται ως όρισμα των αριθμό των unique “names” που θα δημιουργήσει για τα texture containers και το δευτέρο ονόμα είναι ποια είναι αυτα τα “names”.

Page 21: The ModelView Matrix

Binding a Texture Map

• Για παράδειγμα

GLuint mytexture;glGenTextures(1,&mytexture);

GLuint many_textures[3];glGenTextures(3,many_textures);

Page 22: The ModelView Matrix

Binding a Texture Map

• Και αφού έχω δημιουργήσει ένα texture container με unique name πρέπει να καλέσω την συνάρτηση glBindTexture(GLenum target,GLuint texture) για να το ορίσω.

• Για παράδειγμα glBindTexture(GL_TEXTURE_2D,mytexture);

• H παράμετρος target μπορεί να πάρει τις τιμές GL_TEXTURE_(1D,2D,3D)GL_TEXTURE_CUBE_MAPTEXTURE_(1D,2D)_ARRAY.

Page 23: The ModelView Matrix

Binding a Texture Map

• Oι τιμές που περνάμε στο target βοηθάνε την OpenGL να προσδιορίσει την δίασταση του texture.

• Μπορούμε να αλλάξουμε τον τύπο ενος texture θέτοντας αλλο target ως όρισμα.

Page 24: The ModelView Matrix

Texture Mapping

• Επόμενο βήμα είναι να αντιστοιχίσουμε τα στοιχεία της εικόνας με το texture container φορτώνοντας από ένα αρχείο εικόνας.

• Αυτο μπορούμε να το κάνουμε με την βοήθεια μιας οικογένειας συναρτήσεων που μας παρέχει η OpenGL.glTexImage(1,2,3)Dανάλογα τις διαστάσεις ενός texture.

Page 25: The ModelView Matrix

Tex Image

• void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * data);

• Η συνάρτηση glTexImage2D μεταφέρει τα στοιχεία μιας εικόνας σε ένα 2D texture container.

Page 26: The ModelView Matrix

Tex Image

• Tα ορίσματα της συνάρτησης είναι τα εξής:target:Το ίδιο με την συνάρτηση bind(GL_TEXTURE_2D κτλ.).• level:Χρησιμοποιήτε για την παραγωγή mipmaps με διάφορα στάδια

λεπτομέρειας.Αμα περάσουμε τον αριθμό 0 τοτε δεν παράγουμε mipmaps.

• InternalFormat:Καθορίζει τον αριθμό και το τύπο απο τα στοιχεία του texture.Δηλαδη απο ποσα χρώματα αποτελουνται τα δεδομένα του texture.Πχ. Μια παράμετρος είναι η GL_RGBA8 που είναι και η ποιο συνηθησμένη που λέει στην ουσία 4 χρώματα απο 8 bit το καθένα.

• Οι παράμετροι width & height και border(0 ή 1) είναι oι διαστάσεις της εικόνας.

• Και οι παράμετροι format & type καθορίζoυν το πως θα είναι τα pixels στην εικόνα που θα περάσουμε ως όρισμα στην τελευταία παράμετρο data.

Page 27: The ModelView Matrix

Παράδειγμα

• glTexImage2D (GL_TEXTURE_2D,0,GL_RGBA8,128,128,0,GL_RGBA,GL_UNSIGNED_BYTE,imagedata).

• Aυτο θα μας παράξει ένα texture χωρίς mipmaps,με 8 bit για το κάθε κανάλι,128 width,128 height,0 border με χρωματικά δεδομένα RGBA που θα αποθηκευτούν ως ένας πίνακας unsigned byte.

Page 28: The ModelView Matrix

Tex Image

• H συναρτήσεις glTexImage1D και glTexImage3D δουλεύουν με τον ίδιο τρόπο.

• Απλός στην 1D δεν έχουμε ύψος και στην 3D έχουμε και βάθος.

Page 29: The ModelView Matrix

Texture Filtering

• Oταν προσαρμόζω μια εικόνα πάνω σε ένα πολύγωνο τοτε το ποιο πιθανό είναι κάθε texel του texture να αντιστοιχίζεται με ένα pixel.

• Εαν όμως φέρω το αντικείμενο μου κοντά στην οθόνη τοτε ένα pixel θα είναι ένα μερος ενος texel ή αντίθετα αμα πάω το αντικείμενο μου ποιο μακριά τότε ένα pixel θα περιέχει παραπάνω απο ένα texel.

• Aυτα τα φαινόμενα λέγονται magnifιcation & minifιcation αντιστοίχα.

Page 30: The ModelView Matrix

Texture Filtering

• H ΟpenGL σε αυτες τις περιπτώσεις πρέπει να υπολογίσει το χρώμα του pixel.

• Το πως θα γίνει αυτο απο την OpenGL το καθορίζουμε με χρησιμοποιώντας Texture Filtering.

• Αυτο μπορούμε να το κάνουμε με τις συναρτήσεις.glTexParameteri(i,f)(GLenum target,GLenum pname,TYPE param)glTexParameteri(i,f)v(GLenum target,GLenum pname,TYPE param)

Page 31: The ModelView Matrix

Texture Filtering

• H παράμετρος target είναι η ιδία με τις υπόλοιπες GL_TEXTURE_2D.

• Η παράμετρος pname παίρνει 2 τιμές GL_TEXTURE_MAG_FILTER ή GL_TEXTURE_MIN_FILTER ανάλογα την περίπτωση.

• Eφόσον έχουμε ορίσει το target και pname η παράμετρος param παίρνει και αυτη κυριως 2 τιμές(εαν δεν έχω mipmaps).

Page 32: The ModelView Matrix

Nearest Filtering

• Εαν θέσω το mag_filter να είναι GL_NEAREST τοτε λέω στην OpenGL να χρησιμοποιεί το texel που είναι ποιο κοντά στο κέντρο του pixel.

• Aυτη η μέθοδος είναι γνωστή επίσης ως point sample.

Page 33: The ModelView Matrix

Nearest Filtering

• Είναι η ποιο φθηνή μέθοδος filtering απο άποψη πολυπλοκοτητας.

• Αλλα μπορεί να παράγει φαινόμενα τετραγονοποιήσης ενός texture.

Page 34: The ModelView Matrix

Nearest Filtering

Page 35: The ModelView Matrix

Linear Filtering

• Οταν λεω στην OpenGL να χρησιμοποιήσει GL_LINEAR ως mag_filter τοτε λέω να πάρει κατα καποιον τρόπο το μέσο όρο των χρωμάτων απο τα 4 texel που είναι ποιο κοντά στο κέντρο του pixel.

• Αυτη η τεχνική λέγεται και bilinear filtering.

Page 36: The ModelView Matrix

Linear Filtering

• Mε αυτη την τεχνική καταπολεμάμε σε μεγάλο βαθμό το φαινόμενο τον blocky textures.

Page 37: The ModelView Matrix

Linear Filtering

Page 38: The ModelView Matrix

Texture Filtering

• Οσο αναφόρα τα mig filters οι επιλογές είναι οι ίδιες μονο που έχει και τις ίδιες επιλογές για τα mipmaps.

• Πχ. GL_LINEAR_MIPMAP_LINEARΕδω διαλέγει τα 2 mipmaps ποιο κοντά στην ανάλυση του πολυγώνου και μετα μέσω γραμμικού interpolation βγαζει το τελικό χρώμα.

• Αυτη η τεχνική είναι γνωστή και ως trilinear filtering.

Page 39: The ModelView Matrix

Texture Coordinates

• Tα textures είναι ορθογώνια που πρέπει με κάποιο τρόπο να μπορούν να τοποθετηθούν πάνω σε οποιοδήποτε πολύγωνο.

• Τα texture coordinates δείχνουν ποιο κομμάτι του texture θα “πατήσει” πάνω σε ένα πολύγωνο.

Page 40: The ModelView Matrix

Texture Coordinates

• Κάθε γώνια του texture έχει 2D συντεταγμένες (0.0,0.0) για την κάτω αριστερα γωνία και (1.0,1.0) για την πάνω δεξιά.

• Οι συνταταγμένες ενος texture καθορίζονται ανα vertex οταν κάνουμε render ένα primitive.

Page 41: The ModelView Matrix

Texture Coordinates

Page 42: The ModelView Matrix

Texture Coordinates

• Οταν αναφερόμαστε σε συντεταγμένες ενός πολυγώνου τοτε τις αναφέρουμε ως x,y,z,w

• Στα textures είναι s(u),t(v),r,q.• Τα textures μπορούν να προσαρμοστούν

κατάλληλα πάνω σε ένα πολύγωνο ετσι ώστε να φαίνεται μονο το texture ως τελικό αποτέλεσμα.

Page 43: The ModelView Matrix

Texture Coordinates

• Για παράδειγμα έχουμε ένα τεράγωνο που αποτελείται απο 2 τρίγωνα

• Αμα τοποθετήσω το texture σωστά πάνω σε κάθε τρίγωνο θα φαίνεται ομοιόμορφο και θα καλύπτει όλο το πολύγωνο.

• Εαν όμως δώσω τις ίδιες συντεταγμένες για το texture στις κοίνες γωνίες.

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

Page 44: The ModelView Matrix

Texture Coordinates