Αποκοπή και Απόκρυψη
Το οπτικό μας πεδίο είναι περιορισμένο ενώ παράλληλα υπάρχει παρεμπόδιση μεταξύ αντικειμένων βλέπουμε ένα πολύ μικρό κομμάτι των αντικειμένων που αποτελούν τον κόσμο Οι αλγόριθμοι περικοπής αφαιρούν αντικείμενα που δεν σχετίζονται με την δημιουργία της εικόνας συγκεκριμένου καρέ επειδή: –Βρίσκονται εκτός του οπτικού πεδίου (περικοπή στο οπτικό πεδίο) –Παρεμποδίζονται από άλλα αντικείμενα (περικοπή παρεμποδιζομένων) –Παρεμποδίζονται από έμπροσθεν όψεις του ίδιου αντικειμένου (περικοπή πίσω όψεων) Περικοπή στο οπτικό πεδίο: –Αφαιρεί τα στοιχειώδη αντικείμενα εκτός του πεδίου παρατήρησης –Υλοποιείται με 3D αλγόριθμους αποκοπής Εισαγωγή
Περικοπή πίσω όψεων: –Αφαιρεί τα στοιχειώδη σχήματα που αποκρύπτονται από μπροστινά στοιχειώδη σχήματα του ίδιου αντικειμένου –Χρησιμοποιεί γι’αυτό τα κανονικά διανύσματα Περικοπή παρεμποδιζομένων: –Καθορισμός των ορατών αντικειμένων σε κάθε τμήμα της εικόνας –Επιλύεται με τον υπολογισμό του πρώτου αντικειμένου που τέμνεται από κάθε ακτίνα προερχόμενη από το σημείο παρατήρησης –Για σωστή δημιουργία εικόνας πρέπει να λυθεί το πρόβλημα της παρεμπόδισης Εισαγωγή
Line Clipping Clipping άκρων Αν x min < x < x max και y min < y < y max Τότε εσωτερικό σημείο (X min, Y min ) (X max, Y max )
Line Clipping Ανάλυση άκρων για γραμμές: –αν και τα δύο σημεία μέσα, αποδεχτό –αν ένα μέσα, ένα έξω, πρέπει να κόψουμε (clip) –αν και τα δύο σημεία έξω, δεν γνωρίζουμε Χοντρικό clip: ταυτόχρονη επίλυση εξισώσεων χρησιμοποιώντας y = mx + b για τη γραμμή και τα τέσσερα άκρα –Χειρίζεται μόνον γραμμές, –δεν χειρίζεται κάθετες γραμμές
Παραμετρική γραμμή X = x 0 + t(x 1 – x 0 ) 0 < t < 1 Y = y 0 + t(y 1 – y 0 ) P(t) = P 0 + t(P 1 – P 0 ) Τομή, εάν s edge και t line στο [0,1] ταυτόχρονα
Χωρίζουμε το πλάνο σε 9 περιοχές Υπολογίστε το πρόσημο τεσσάρων συγκρίσεων μεταξύ κορυφής και ακμής –y max – y; y – y min ; x max – x; x - x min –σημείο βρίσκεται μέσα μόνον εάν όλα για τα bits προσήμου είναι 0, αλλιώς υπερβαίνει άκρη 2D Clipping γραμμής: Cohen- Sutherland
Ο 4-bit δείχνει τη θέση σε σχέση με τα άκρα του παραθύρου: Πρώτο bit: πάνω από το πάνω άκρο Δεύτερο bit: κάτω από το κάτω άκρο Τρίτοbit: δεξιότερα του δεξιού άκρου Τέταρτο bit: αριστερότερα του αριστερού 2D Clipping: Cohen-Sutherland
παρόμοια με 2D Χωρίζει τον όγκο τους σε 27 περιφέρειες 6-bit κώδικα Top plane (above) (below) Bottom plane (above) (below) Front plane (in front) (behind) Left plane (to left of) (to right of) Right plane (to left of) (to right of) Back plane (in front) (behind) 3D Clipping γραμμής: Cohen- Sutherland
Πρώτο bit: Πίσω από το πίσω επίπεδο Δεύτερο bit: Μπροστά από το μπροστινό επίπεδο Τρίτο bit: Πάνω από το πάνω επίπεδο Τέταρτο bit: Κάτω από το κάτω επίπεδο Πέμπτο bit:Δεξιότερα από το δεξιό επίπεδο Έκτο bit: Αριστερότερα από το αριστερό επίπεδο 3D Clipping γραμμής: Cohen- Sutherland Top plane (above) (below) Bottom plane (above) (below) Front plane (in front) (behind) Left plane (to left of) (to right of) Right plane (to left of) (to right of) Back plane (in front) (behind)
Αν δεν μπορούμε ούτε να απορρίψουμε ούτε να αποδεχθούμε, διαιρούμε και ξαναεξετάζουμε Clip rectangle D C B A E F G H I Αλγόριθμος Cohen-Sutherland
Χρησιμοποιούμε μια ακμή για να κόψουμε τη γραμμή Χρησιμοποιούμε τους κώδικες για να επιλέξουμε την ακμή που διασχίζεται Υπολογίστε το σημείο τομής Clip rectangle D C B A E F G H I Cohen-Sutherland Algorithm
ComputeOutCode(x0, y0, outcode0) ComputeOutCode(x1, y1, outcode1) repeat check for trivial reject or trivial accept pick the point that is outside the clip rectangle if TOP then x = x0 + (x1 – x0) * (ymax – y0)/(y1 – y0); y = ymax; else if BOTTOM then x = x0 + (x1 – x0) * (ymin – y0)/(y1 – y0); y = ymin; else if RIGHT then y = y0 + (y1 – y0) * (xmax – x0)/(x1 – x0); x = xmax; else if LEFT then y = y0 + (y1 – y0) * (xmin – x0)/(x1 – x0); x = xmin; if (x0, y0 is the outer point) then x0 = x; y0 = y; ComputeOutCode(x0, y0, outcode0) else x1 = x; y1 = y; ComputeOutCode(x1, y1, outcode1) until done Ψευδοκώδικας Cohen- Sutherland
Sutherland-Hodgman Clipping
Cyrus-Beck/Liang-Barsky Clipping Παραμετρικής Γραμμής Χρησιμοποιούμε την παραμετρική μορφή της γραμμής P(t) = P 0 + (P 1 – P 0 )t Εξετάζουμε αν η γραμμή τέμνει τις ακμές. For any point P E i on edge E i
Για να βρούμε αν υπάρχει τομή του P 0 P 1 με την ακμή E i λύνουμε: N i [P(t) – P E i ] = 0 N i [P 0 + (P 1 – P 0 )t – P E i ] = 0 N i [P 0 – P E i ] + N i [P 1 – P 0 ]t = 0 Αν D η απόσταση από P 0 στο P 1 = (P 1 – P 0 ), τότε για το t: Ισχύει μόνο αν: N i 0 (μόνο από λάθος) D 0 (P 1 P 0 ) N i D 0 (Η E i και η D δεν είναι παράλληλες). Cyrus-Beck/Liang-Barsky Clipping Παραμετρικής Γραμμής
Δεν μας ενδιαφέρουν οι λύσεις του t εκτός [0 1] Κινούμαστε από P 0 to P 1, για δεδομένη ακμή πριν την τομή: –Αν N i D < 0 Πιθανή είσοδος (PE) –Αν N i D > 0 Πιθανή έξοδος (PL) –t E > 0, t L < 1. –Αν t L < t E, δεν υπάρχει τομή Cyrus-Beck/Liang-Barsky Clipping Παραμετρικής Γραμμής
Pre-calculate N i and select P E i for each edge; for each line segment to be clipped if P 1 = P 0 then line is degenerate so clip as a point; else begin t E = 0; t L = 1; for each candidate intersection with a clip edge if Ni D 0 then {Ignore edges parallel to line} begin calculate t; {of line and clip edge intersection} use sign of N i D to categorize as PE or PL; if PE then t E = max(t E,t); if PL then t L = min(t L,t); end if t E > t L then return nil else return P(t E ) and P(t L ) as true clip intersections end Cyrus-Beck/Liang-Barsky Clipping Ψευδοκώδικας
Απομάκρυνσης Κρυμμένων Επιφαν. ή Ορισμός Ορατών Επιφανειών Δεδομένου ενός συνόλου 3D αντικειμένων και μιας άποψης (κάμερα), ορίζουμε ποιες γραμμές ή επιφάνειες των αντικειμένων είναι ορατές. Η αποκοπή (clipping) αφορά ένα αντικείμενο ενώ η απόκρυψη (occlusion) είναι global.
Αλγόριθμοι Ορισμού Ορατών Επιφανειών Ιστορικά πρώτες προσεγγίσεις Σύγκριση κάθε ακμής με κάθε αντικείμενο - εξάλειψη αόρατων ακμών ή μέρη των ακμών. –Πολυπλοκότητα: χειρότερα από O (n 2 ), δεδομένου ότι κάθε αντικείμενο πρέπει να συγκριθεί με όλες τις ακμές Κάθε πολύγωνο ψαλιδίζεται από τις προβολές όλων των άλλων πολυγώνων μπροστά του –Οι αόρατες επιφάνειες εξαλειφονται και δημιουργούνται νέες ορατές (υπο-πολύγωνα) –ΑΡΓΟ, ειδικές περιπτώσεις, για πολύγωνα μόνο
Ο αλγόριθμος του ζωγράφου Ακρίβεια στην Εικόνα Δημιουργήστε ιεραρχία στα σχέδια, κάθε πολύγωνο αντικαθιστά τα προηγούμενα. Αυτό εγγυάται την σωστή προβολή σε κάθε pixel ανάλυση. Η στρατηγική είναι να εργαζόμαστε από πίσω προς τα εμπρός. Βρίσκουμε έναν τρόπο για να ταξινομήσουμε τα πολύγωνα κατά βάθος (z), στη συνέχεια, τα απεικονίζουμε με αυτή τη σειρά: –Δημιουργούμε μια πρόχειρη ταξινόμηση των πολυγώνων από τη μικρότερη (πιο απομακρυσμένη) z-συντεταγμένη σε κάθε πολύγωνο –Απεικονίζουμε το πιο μακρινό πολύγωνο πρώτο, συνεχίζουμε προς τα μπρος προς το σημείο άποψης
Ορισμός Ορατών επιφανειών –Πρώτα εφαρμόζουμε μετασχηματισμό προοπτικής στις κορυφές
Αν το κανονικό διάνυσμα είναι στην ίδια κατεύθυνση με το LOS (line of sight), είναι πίσω πλευρά: Αν LOS N obj > 0, μη ορατό – απόκρυψη πολυγώνου Μετά τα ορατά πολύγωνα τα κανονικοποιούμε ως προς τον οπτικό όγκο (-1 < x < 1), (-1 < y < 1), (0 < z < 1) N obj Ορισμός Ορατών επιφανειών
Μένει ακόμα να ορίσουμε την απόκρυψη αντικειμένου Το P2 αποκρύπτει το P1 Πως ορίζουμε πιο σημείο είναι πιο κοντά; Ορισμός Ορατών επιφανειών
Z-buffer αρχικοποιείται στην τιμή του background (πιο μακρινό επίπεδο του οπτικού όγκου = 1,0) Για κάθε αντικείμενο που συναντάμε, συγκρίνουμε τις z-τιμές όλων των σημείων του με τη z-τιμή στη (x, y) θέση στο Z-buffer Αν το νέο σημείο έχει z-τιμή μικρότερη από την προηγούμενη (δηλαδή, πιο κοντά στο μάτι), η z-τιμή του τοποθετείται στο z- buffer και το χρώμα του τίθεται στο frame buffer στο (x, y) Αλλιώς τα προηγούμενα παραμένουν αμετάβλητα Το βάθος μπορεί να αποθηκευτεί, ως ακέραιους ή float Πχ. για 8-bit (1 byte) ακέραιο z-buffer, θέτουμε 0,0 -> 0 και 1,0 -> 255 Η ακρίβεια του z-buffer μπορεί να έχει δραματικές συνέπειες για την τελική εικόνα Αλγόριθμος Z-buffer
Απαιτεί δύο “ buffers ” Frame Buffer ο γνωστός μας RGB buffer αρχικοποιημένος στο χρώμα του φόντου Depth ( “ Z ” ) Buffer Βάθος της σκηνής σε κάθε pixel αρχικοποιείται στο μεγαλύτερο βάθος = 255 Αλγόριθμος Z-buffer
Όταν pixels επικαλύπτονται, χρησιμοποιούμε το Z- buffer για να αποφασίσουμε ποιο πολύγωνο "παίρνει" το pixel = = Αλγόριθμος Z-buffer