Download - The ModelView Matrix

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