1 / 44

The ModelView Matrix

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

fuller
Download Presentation

The ModelView Matrix

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Τhe Modelview Matrix Είναι το default matrix που μας μεταφέρει η OpenGL αλλα μπορούμε να μεταβούμε σε αυτο και με την βοήθεια της συνάρτησης. glMatrixMode(GL_MODELVIEW) Συνηθώς οταν αρχίζουμε το render code θέλουμε να μεταφερθούμε στο σημείο (0,0,0) του ModelView Matrix.Αυτο το κάνουμε με την χρήση της συνάρτησης glLoadIdentity()

  3. Translation Οταν μετακινώ ένα αντικείμενο απο ένα σημειο του χώρου σε ένα αλλο τοτε κάνω translation. Translation στην OpenGL μπορώ να κάνω με την βοήθεια της συνάρτησης glTranslate(d,f)(TYPE x,TYPE y,TYPE z). Ως ορίσματα η συνάρτηση δέχεται το ποσοστό μετακίνησης στους άξονες. Για παράδειγμα αμα είμαι στο σημείο 3,4,-10 και θέλω να πάω στο σημείο 7,-4,-5 θα περάσω ως όρισμα στην συνάρτηση glTranslatef(4,-8,5).

  4. Translation Παντα την πράξη του translation την εκτελούμε πριν ζωγραφίσουμε τα αντικειμενά μας. πχ.glLoadIdentity();glTranslatef(,4,-8,5)renderCube();

  5. Rotation Rotation κάνουμε οταν θέλουμε να περιστρέψουμε ένα αντικείμενο σε κάποιο άξονα. Oταν περιστρέφω ένα αντικείμενο γύρω απο έναν άξονα τοτε ο άξονας περιστροφής παραμένει σταθερός. Οταν περιστρέφω κατι τοτε το σύστημα αξόνων αλλάζει. Στην ΟpenGL μπορώ να περιστρέψω ένα αντικείμενο με την συνάρτηση glRotate(d,f)(TYPE angle,TYPE x,TYPE y,TYPE z).

  6. Rotation H συνάρτηση glRotate δέχεται ως ορίσματα την γωνία περιστροφής και το σημείο που γινέται (χ,y,z). Για παράδειγμα αν θέλω να περιστραφώ 90 μοίρες γύρω απο τον άξονα y τότε δίνω την εντολήglRotatef(90.0f,0.0,1.0,0.0). Η OpenGL στις περιστροφές πηγαίνει με counter-clockwise λογική δηλαδή αμα ήθελα να περιστραφώ κατα 90 μοίρες clockwise θα έδινα -90.0 ως όρισμα.

  7. Rotation Αν θέλω να περιστραφώ γύρω απο έναν άξονα περα των βασικών x,y,z αυτο που πρέπει να κάνω είναι να περάσω ως όρισμα στην συνάρτηση το σημείο που θέλω (χ,y,z). Μετα ο άξονας που σχηματίζεται απο την αρχή των αξόνων μέχρι το σημείο που έδωσα ως όρισμα είναι ο καινούργιος άξονας περιστροφής. Την glRotate απο και την glTranslate τις εκτελώ πριν το render code μου.

  8. Scale To scaling πρακτικά είναι η αλλαγή μεγέθους ενός αντικειμένου ή σύστημα αξόνων. Δηλαδή όταν εκτελώ πράξεις scaling τοτε στην ουσία πολλαπλασιάζω τις συντεταγμένες ενός σημείο με ενα scale factor και έχω το τελικό αποτέλεσμα. Scaling στην OpenGL πραγματοποιώ με την συνάρτησηglScale(d,f)(TYPE x,TYPE y,TYPE z).

  9. Scale H συνάρτηση glScale δέχεται ως όρισμα τις τιμές του scale factor για τους άξονες. Δηλαδή αν θέλω να ζωγραφίσω έναν κύβο διπλάσιο στον άξονα χ  αλλά στους άλλους άξονες να μην αλλάξει το μέγεθος του τοτε θα δώσω glScalef(2.0,1.0,1.0). Aλλα άμα θέλω να κάνω shrink το αντικείμενο τοτε θα δώσω τιμές απο 0 μέχρι 1.

  10. Scale Aμα δώσω αρνητικές τιμές στον scale factor τοτε το αντικείμενο μας θα κάνει flip. Aυτο είναι ένα στοιχείο που βοηθάει πολύ οταν θέλω να έχω reflections.

  11. Matrix Stacks Μέχρι στιγμής έχουμε δει το modelview matrix,που στην ουσία είναι η κορυφή μιας στοίβας απο πίνακες(matrices). Υπάρχουν matrix stacks για όλα τα έιδη των πινάκων.Δηλαδή υπάρχει η projection matrix stack,texture matrix stack,color matrix stack κτλ. Αυτο γίνεται γιατι μας βοηθάει να κάνουμε διάφορες μεταμορφώσεις και μετα να πιστρέφουμε στην τελευταία αποθηκευμένη χωρίς να κάνω τις πράξεις για να επανέλθω.

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

  13. Matrix Stacks

  14. Matrix Stacks Για να μεταφέρουμε ένα matrix στην στοίβα χρησιμοποιούμε την συνάρτηση glPushMatrix() ενώ για να κάνουμε Pop την συνάρτηση glPopMatrix(). Aυτες η συναρτήσεις δεν δέχονται ορίσματα και τις εκτελούμε πριν απο μια πράξη translation,rotation,scale(glPushMatrix) και αμα θέλω να κάνω pop μετα απο ένα render code block.

  15. Texture Mapping Mέχρι τώρα χρησιμοποιούσαμε χρώματα στα αντικείμενα μας. Τα χρώματα ομως δεν δείχνουν και τόσο ωραία και είναι δύσκολο να έχουν έναν υψηλό βαθμό αληθοφάνειας. Χρησιμοποιώντας όμως την τεχνική του texture mapping μπορούμε να έχουμε μια δραματική αύξηση του ρεαλισμού στις σκηνές μας.

  16. Texture Mapping Texture mapping ονομάζουμε την τεχνική προσαρμογής μια εικόνας πάνω σε μια επιφάνεια. Ενά texture map είναι ένα ορθογώνιο που περιέχει χρωματικές πληροφορίες και κάθε χρωματικό στοιχείο ονομάζεται texel. Μπορεί ένα texture map να είναι ένα ορθογώνιο ομως προσαρμόζεται και σε αλλες επιφάνειες με την χρήση texture coordinates.

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

  18. Texture Mapping Ένα τυπικό texture map είναι μια δισδιάστατη εικόνα με ύψος και πλάτος. Αλλα μερικά effects μπορούν να χρησιμοποιούν ειτε 1-dimension map ειτε τρισδιάστατα maps με πλάτος,ύψος και βάθος.

  19. Texture Mapping in OpenGL Για να μπορώ να προσαρμόσω ένα tex map πάνω σε μια επιφάνεια με την χρήση της OpenGL θα πρέπει πρώτα να εκτελέσω καποια βήματα Το πρώτο βήμα που πρέπει να κάνω είναι να ορίσω το texture container.

  20. Binding a Texture Map Για να μπορέσω να ορίσω ένα tex container θα πρέπει να χρησιμοποιήσω την συνάρτηση glGenTextures(GLsizei n,GLuint *tex); H συνάρτηση glGenTextures δέχεται ως όρισμα των αριθμό των unique “names” που θα δημιουργήσει για τα texture containers και το δευτέρο ονόμα είναι ποια είναι αυτα τα “names”.

  21. Binding a Texture Map Για παράδειγμαGLuint mytexture;glGenTextures(1,&mytexture);GLuint many_textures[3];glGenTextures(3,many_textures);

  22. 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.

  23. Binding a Texture Map Oι τιμές που περνάμε στο target βοηθάνε την OpenGL να προσδιορίσει την δίασταση του texture. Μπορούμε να αλλάξουμε τον τύπο ενος texture θέτοντας αλλο target ως όρισμα.

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

  25. 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.

  26. 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.

  27. Παράδειγμα 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.

  28. Tex Image H συναρτήσεις glTexImage1D και glTexImage3D δουλεύουν με τον ίδιο τρόπο. Απλός στην 1D δεν έχουμε ύψος και στην 3D έχουμε και βάθος.

  29. Texture Filtering Oταν προσαρμόζω μια εικόνα πάνω σε ένα πολύγωνο τοτε το ποιο πιθανό είναι κάθε texel του texture να αντιστοιχίζεται με ένα pixel. Εαν όμως φέρω το αντικείμενο μου κοντά στην οθόνη τοτε ένα pixel θα είναι ένα μερος ενος texel ή αντίθετα αμα πάω το αντικείμενο μου ποιο μακριά τότε ένα pixel θα περιέχει παραπάνω απο ένα texel. Aυτα τα φαινόμενα λέγονται magnifιcation & minifιcation αντιστοίχα.

  30. 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)

  31. Texture Filtering H παράμετρος target είναι η ιδία με τις υπόλοιπες GL_TEXTURE_2D. Η παράμετρος pname παίρνει 2 τιμές GL_TEXTURE_MAG_FILTER ή GL_TEXTURE_MIN_FILTER ανάλογα την περίπτωση. Eφόσον έχουμε ορίσει το target και pname η παράμετρος param παίρνει και αυτη κυριως 2 τιμές(εαν δεν έχω mipmaps).

  32. Nearest Filtering Εαν θέσω το mag_filter να είναι GL_NEAREST τοτε λέω στην OpenGL να χρησιμοποιεί το texel που είναι ποιο κοντά στο κέντρο του pixel. Aυτη η μέθοδος είναι γνωστή επίσης ως point sample.

  33. Nearest Filtering Είναι η ποιο φθηνή μέθοδος filtering απο άποψη πολυπλοκοτητας. Αλλα μπορεί να παράγει φαινόμενα τετραγονοποιήσης ενός texture.

  34. Nearest Filtering

  35. Linear Filtering Οταν λεω στην OpenGL να χρησιμοποιήσει GL_LINEAR ως mag_filter τοτε λέω να πάρει κατα καποιον τρόπο το μέσο όρο των χρωμάτων απο τα 4 texel που είναι ποιο κοντά στο κέντρο του pixel. Αυτη η τεχνική λέγεται και bilinear filtering.

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

  37. Linear Filtering

  38. Texture Filtering Οσο αναφόρα τα mig filters οι επιλογές είναι οι ίδιες μονο που έχει και τις ίδιες επιλογές για τα mipmaps. Πχ. GL_LINEAR_MIPMAP_LINEARΕδω διαλέγει τα 2 mipmaps ποιο κοντά στην ανάλυση του πολυγώνου και μετα μέσω γραμμικού interpolation βγαζει το τελικό χρώμα. Αυτη η τεχνική είναι γνωστή και ως trilinear filtering.

  39. Texture Coordinates Tα textures είναι ορθογώνια που πρέπει με κάποιο τρόπο να μπορούν να τοποθετηθούν πάνω σε οποιοδήποτε πολύγωνο. Τα texture coordinates δείχνουν ποιο κομμάτι του texture θα “πατήσει” πάνω σε ένα πολύγωνο.

  40. Texture Coordinates Κάθε γώνια του texture έχει 2D συντεταγμένες (0.0,0.0) για την κάτω αριστερα γωνία και (1.0,1.0) για την πάνω δεξιά. Οι συνταταγμένες ενος texture καθορίζονται ανα vertex οταν κάνουμε render ένα primitive.

  41. Texture Coordinates

  42. Texture Coordinates Οταν αναφερόμαστε σε συντεταγμένες ενός πολυγώνου τοτε τις αναφέρουμε ως x,y,z,w Στα textures είναι s(u),t(v),r,q. Τα textures μπορούν να προσαρμοστούν κατάλληλα πάνω σε ένα πολύγωνο ετσι ώστε να φαίνεται μονο το texture ως τελικό αποτέλεσμα.

  43. Texture Coordinates Για παράδειγμα έχουμε ένα τεράγωνο που αποτελείται απο 2 τρίγωνα Αμα τοποθετήσω το texture σωστά πάνω σε κάθε τρίγωνο θα φαίνεται ομοιόμορφο και θα καλύπτει όλο το πολύγωνο. Εαν όμως δώσω τις ίδιες συντεταγμένες για το texture στις κοίνες γωνίες. Εαν έκανα το αντιθέτο το αποτέλεσμα δεν θα ήταν ίδιο λόγο της διαγωνίου.

  44. Texture Coordinates

More Related