Απεικόνιση καμπυλών και επιφανειών Αφού μοντελοποιήσουμε τα αντικείμενα αλληλεπιδραστικά με καμπύλες και επιφάνειες πρέπει να τα απεικονίσουμε Αν χρησιμοποιούμε ray tracing πρέπει να υπολογίσουμε τομές των ακτινών με τις επιφάνειες Εκτός από τα quadrics η εύρεσητωντομών απαιτεί επίλυση μη γραμμικών εξισώσεων υψηλού βαθμού.
Απεικόνιση καμπυλών και επιφανειών Εναλλακτικά μπορούμε να υπολογίσουμε σημεία των καμπυλών και επιφανειών και να τις προσεγγίσουμε με ευθύγραμμα τμήματα ή πολύγωνα που ορίζονται από τα σημεία αυτά.
Υπολογισμός των τιμών πολυωνύμων pu ( ) n = k = 0 k uck Υπολογισμός των τιμών της p(u) σε σύνολο τιμών u k του u και χρήση πολυγωνικής γραμμής (GL_LINE_STRIP) για προσέγγιση και απεικόνιση. Απλός αλλά «ακριβός» τρόπος: χρήση του ορισμού
Υπολογισμός των τιμών πολυωνύμων Ομαδοποίηση των υπολογισμών, μέθοδος Horner Για n=3 p( u) = c0 + u( c1+ u( c2+ uc3)) Πολλαπλασιασμούς όσους και o βαθμός n του πολυωνύμου Αν τα u k είναι ισαπέχοντα (u k+1 -u k =h) μπορώ να χρησιμοποιήσω τη μέθοδο των πρόσω διαφορών (forward differences) για να υπολογίσω τα p(u κ ) με Ο(n) προσθέσεις, χωρίς πολλαπλασιασμούς.
Υπολογισμός των τιμών πολυωνύμων p p 0 Δ ( uk) = ( uk) 1 Δ p( uk) = p( uk+ 1) p( uk) m+ 1 m m Δ p uk =Δ p uk+ 1 Δ p uk ( ) ( ) ( ) Για πολυώνυμο βαθμού n το Δ n p(u k ) ίδιο για όλα τα u k Βασιζόμαστε σε αυτό για να υπολογίσουμε τα p(u k ) Χρειαζόμαστε τις n+1 πρώτες τιμές p(u 0 ), p(u 1 ).. p(u n ) για τον υπολογισμό του Δ n p(u k )
Υπολογισμός των τιμών πολυωνύμων n=3
Αναδρομική υποδιαίρεση καμπυλών Bezier Δεν απαιτείται ποτέ ο υπολογισμός τιμών του πολυωνύμου από τον ορισμό, χρησιμοποιούνται μόνο οι τιμές των σημείων ελέγχου Το πολυώνυμο Βezier πάντα εντός του convex hull. Υποδιαιρώ το p(u) σε δύο επίσης κυβικά πολυώνυμα l(u), r(u) u l =2u p u r =2u p -1
Αναδρομική υποδιαίρεση καμπυλών Bezier Κάθε νέο πολυώνυμο έχει 4 σημεία ελέγχου {l 0, l 1, l 2, l 3 }, {r 0, r 1, r 2, r 3 } που ορίζουν και το convex hull του. Τα νέα convex hulls εντός του αρχικού.
Αναδρομική υποδιαίρεση καμπυλών Bezier Για κάθε τμήμα ελέγχω πόσο «ευθύγραμμο» είναι Πόσο αποκλίνουν τα l 1, l 2 από το ευθ. τμήμα που ορίζεται από τα l 0, l 3 Αν είναι αρκετά επίπεδο το παριστάνω με το ευθύγραμμο τμήμα l 0, l 3 Αν όχι το υποδιαιρώ περαιτέρω Δεν χρειάζεται να υπολογίσω τιμές του πολυωνύμου, υπολογίζω μόνο νέα σημεία ελέγχου από τα προηγούμενα
Αναδρομική υποδιαίρεση καμπυλών Bezier Πως υπολογίζουμε τα νέα σημεία ελέγχου? T T p( u) = u M p= b( u) p B 3 (1 u) 2 T 3 u(1 u) b( u) = MBu= 2 3 u (1 u) 3 u
Αναδρομική υποδιαίρεση καμπυλών Bezier Το l(u), πρέπει να περνάει από τα p(0), p(1/2) l(0) = l0 = p0 l(1) = l = p(1/ 2) = (1/ 8)( p + 3p + 3 p + p ) 3 0 1 2 3 H κλίση του l(u), πρέπει να είναι ίδια με του p(u) στα p(0), p(1/2) u l =2u p και du l =2du p l'(0) = 3( l1 l0) = p'(0) = (3/ 2)( p1 p0) l'(1) = 3( l l ) = p'(1/ 2) = (3 / 8)( p p + p + p ) 3 2 0 1 2 3
Αναδρομική υποδιαίρεση καμπυλών Bezier Γεωμετρικός υπολογισμός Ταυτόχρονος και για τα δύο τμήματα. Υπολογισμός μόνο με shifts και προσθέσεις
Αναδρομική υποδιαίρεση επιφανειών Bezier Επέκταση της υποδιαίρεσης καμπυλών: Χωρισμός της επιφάνειας σε 4 επιφάνειες και υπολογισμός των 16 σημείων ελέγχου για κάθε υπο-επιφάνεια Εργάζομαι σε δύο βήματα: Υποδιαίρεση προς την κατεύθυνση του v των 4 καμπυλών που ορίζόνται για σταθερό u=0, 1/3, 2/3, 1 7 σημεία ελέγχου (παλιά και καινούργια) για κάθε καμπύλη
Αναδρομική υποδιαίρεση επιφανειών Bezier
Αναδρομική υποδιαίρεση επιφανειών Bezier Υποδιαίρεση προς την κατεύθυνση του u των 7 καμπυλών που ορίζόνται για σταθερό v από τα νέα σημεία 7 σημεία ελέγχου (παλιά και καινούργια) για κάθε καμπύλη. Συνολικά 49 σημεία ελέγχου που χωρίζονται σε 4 ομάδες των 16 (με επικαλύψεις) για την κατασκευή των 4 υπο-επιφανειών.
Αναδρομική υποδιαίρεση επιφανειών Bezier
Απεικόνιση άλλων τύπων καμπυλών με χρήση αναδρομικής υποδιαίρεσης Ευκολία/ταχύτητα της μεθόδου αναδρομικής υποδιαίρεσης για τα Bezier Κάθετύποςκαμπύληςμπορείναμετατραπεί σε άλλο τύπο με επιλογή νέων, κατάλληλων σημείων ελέγχου. Μετατρέπω πολυώνυμα παρεμβολής & spline σε Bezier και τα απεικονίζω με αναδρομική υποδιαίρεση.
Μετατροπή τύπων καμπύλης p( u) = T u MBp T p( u) = u Mq p = M Mq 1 B Από τα q της αρχικής μορφής υπολογίζω τα p της μορφής Bezier με την χρήση των κατάλληλων πινάκων
Επιφάνειες 2ου βαθμού (Quadrics) Επιφάνειες σε πεπλεγμένη μορφή με όρους x i y j z k και άθροισμα δυνάμεων μικρότερο ή ίσο του 2 Ελλειψοειδή, ελλειπτικοί κώνοι (κώνοι με τομή έλλειψη) & κύλινδροι, παραβολοειδή, υπερβολοειδή 2 2 2 a x + 2a xy+ a y + 2a yz+ a z + 2a xz+ bx+ b y+ b z+ c= 0 11 12 22 23 33 13 1 2 3
Επιφάνειες 2ου βαθμού (Quadrics) Παράσταση σε τετραγωνική μορφή T T pap+ bp+ c = 0 a a 11 12 a13 b1 x A= a a 12 22 a23, b 2, y b= p= a b 13 a23 a 33 3 z Μετασχηματισμός σε τυπική μορφή για κατάταξη σε κάποια οικογένεια Ευθυγράμμιση των αξόνων με τους άξονες συντεταγμένων. Συνδυασμός περιστροφής και μετατόπισης
Επιφάνειες 2ου βαθμού (Quadrics) Αντικατάσταση p=mp +d Ο A αντικαθίσταται από τον D=M T AM Ο M μπορεί να επιλεγεί ώστε ο νέος πίνακας να είναι διαγώνιος Τα στοιχεία του D χαρακτηρίζουν τον τύπο του quadric
Απεικόνιση αλγεβρικών επιφανειώνquadrics Ηαπεικόνισηquadrics με ray tracing εύκολη, ητομήμεευθεία(ακτίνα) υπολογίζεται απλά p(a)=p 0 +ad Αντικατάσταση στην εξίσωση του quadric δίνει εξίσωση 2oυ βαθμού ως προς το a. 0, 1, 2 λύσεις. Κάθετο διάνυσμα n=2ap+b
Απεικόνιση αλγεβρικών επιφανειώνquadrics Ανάλογη μέθοδο για εύρεση τομής με επιφάνειες μεγαλύτερου βαθμού Για όρους x i y j z k μπορώ να έχω μέχρι και ι+j+k σημεία τομής. Υπολογισμός δύσκολος, με αριθμητικές μεθόδους.
Αναδρομική υποδιαίρεση καμπυλών και επιφανειών Εναλλακτική θεώρηση της αναδρομικής υποδιαίρεσης καμπυλών Bezier. Πολυγωνική γραμμή με κόμβους τα σημεία ελέγχου που υποδιαιρείται διαρκώς με όριο την καμπύλη Bezier.
Αναδρομική υποδιαίρεση καμπυλών και επιφανειών Κάθε νέα πολυγωνική καμπύλη βελτίωση της προηγούμενης. Σταματάω όταν πετύχω την ομαλότητα που χρειάζομαι για την συγκεκριμένη εφαρμογή. Γενίκευση σε άλλα είδη καμπυλών Αντίστοιχα και για επιφάνειες-αναδρομική υποδιαίρεση για προσέγγιση σφαίρας. Προσέγγιση γενικής επιφάνειας με πολυγωνικό πλέγμα συνεχώς υποδιαιρούμενο.
Αναδρομική υποδιαίρεση καμπυλών και επιφανειών Γεωμετρικά απλή σύλληψη αλλά δύσκολη στην μαθηματική της έκφραση και στην ανάλυση/υλοποίηση Πως αποθηκεύουμε τα νέα σημεία και πως τα συμβολίζουμε Δυσκολία στην γενική περίπτωση πολυγωνικού πλέγματος (όχι μόνο τρίγωνα) Κενά στο σχήμα
Αναδρομική υποδιαίρεση καμπυλών και επιφανειών Πλειάδα μεθόδων για δημιουργία/αναπαράσταση καμπυλών με υποδιαίρεση
Καμπύλες και επιφάνειες στην OpenGL Η OpenGL υποστηρίζει καμπύλες και επιφάνειες Bezier Evaluators: μηχανισμός υπολογισμού σημείων στις Bezier. Μπορούμε να δημιουργήσουμε σημεία άλλων ειδών καμπυλών & επιφανειών μετατρέποντας τες σε Bezier Υπολογισμός σημείων ελέγχου Bezier.
Καμπύλες και επιφάνειες στην OpenGL Evaluators μιας διάστασης: μια παράμετρος u Δημιουργία 1, 2, 3, 4-διαστατων δεδομένων Καμπύλες σε 2, 3 & 4 (ομογενείς) διατάσεις Κάθετα διανύσματα Χρώματα RGBA, συντεταγμένες υφής Evaluators δύο διαστάσεων: δύο παράμετροι u, v Επιφάνειες σε 3 & 4 (ομογενείς) διατάσεις
Evaluators 1 διάστασης glmap1f(type, u_min, u_max, stride, order, point_array) Type: είδος δεδομένων που θα μας δώσει ο evaluator GL_MAP1_VERTEX_3: x,y,z GL_MAP1_VERTEX_4: x,y,z,w GL_MAP1_NORMAL: κάθετα διανύσματα GL_MAP1_COLOR4: RGBA
Evaluators 1 διάστασης u_min, u_max: όρια της παραμέτρου u Order: τάξη πολυωνύμου (βαθμός+1 ) point_array: σημεία ελέγχου (όσα και η τάξη) διάσταση: αντίστοιχα με τον τύπο Stride: απόσταση δεδομένων στον πίνακα που αντιστοιχούν σε διαδοχικά σημεία ελέγχου. Μπορούμε να ορίσουμε και να χρησιμοποιήσουμε πολλούς evaluators ταυτόχρονα (σημεία και κάθετα διανύσματα)
Καμπύλες Bezier τάξης n (βαθμού n-1) Ορίζονται από n σημεία ελέγχου p 0 p n-1 Η καμπύλη κείται εντός του convex hull των σημείων ελέγχου, έχει αρχή το p 0 και τέλος το p n-1, και τα εφαπτόμενα διανύσματα στο p 0 και στο p n-1 είναι ίδιας διεύθυνσης και φοράς με τα p 1 - p 0 και p n-1 p n-2 p n 1 n 1 ( u) = Bi ( u) i= 0 p i
Evaluators 1 διάστασης Ενεργοποίηση: glenable(type) Υπολογισμός τιμής της καμπύλης για συγκεκριμένο u: glevalcoord1f(u) Μπορεί να αντικαταστήσει εντολές glvertex, glcolor, glnormal ανάλογα με το type.
Evaluators 1 διάστασης Σχεδίαση πολυγωνικής γραμμής 100 σημείων που προσεγγίζει καμπύλη Bezier στο u=[0,1] glbegin(gl_line_strip) For(i=0;i<100;i++) glevalcoord1f((float)i/100) glend
Evaluators 1 διάστασης Aν οι τιμές του u όπου επιθυμώ υπολογισμό τηςκαμπύληςείναιισαπέχουσες: glmapgrid1f(points,u_min,u_max) glevalmesh1(gl_line,p_min,p_max) Εναλλακτικά: GL_POINT
Evaluators 2 διαστάσεων glmap2f(type, u_min, u_max, ustride, uorder, v_min, v_max, vstride, vorder, point_array) Type: ίδιο με των evaluators 1 διάστασης, αντί για MAP1 MAP2 Για δικυβική Βezier επιφάνεια στο [0,1]x[0,1] (16 σημεία ελέγχου) glmap2f(gl_map2_vertex_3, 0, 1, 3, 4, 0,1, 12, 4, point_array)
Evaluators 2 διαστάσεων Για πλέγμα For(j=0;j<100;j++){ glbegin(gl_line_strip); For(i=0;i<100;i++) glevalcoord2f(i/100, j/100); glend(); glbegin(gl_line_strip); For(i=0;i<100;i++) glevalcoord2f(j/100, i/100); glend(); }
Evaluators 2 διαστάσεων Για ομοιόμορφο πλέγμα (τιμές των u,v όπου επιθυμώ υπολογισμό της επιφάνειας είναι ισαπέχουσες): glmapgrid2f(u_points,u_min,u_max, v_points,v_min,v_max) glevalmesh2(gl_line,u_p_min,u_p_max, v_p_min,v_p_max) Εναλλακτικά: GL_POINT, GL_FILL
Evaluators 2 διαστάσεων Αυτόματος υπολογισμός κάθετων διανυσμάτων της επιφάνειας καθώς χρησιμοποιούνται οι evaluators: glenable(gl_auto_normal)
Quadrics και OpenGL Υποστήριξη στην GLU: κύλινδροι, σφαίρες, δακτυλίους GLUQuadricObj *p; p=glunewquadric(); gluquadricdrawstyle(p,glu_line); glucylinder(p,τop_radius, BOTTOM_RADIUS, HEIGHT, 5,5) Κύλινδρος με κέντρο την αρχή και άξονα τον y, απεικονισμένος με wireframe