7 | 'ΓΡΑΦΙΚΑ ΚΑΙ ΕΙΚΟΝΙΚΗ ΠΡΑΓΜΑΤΙΚΟΤΗΤΑ' | Μουστάκας Κ., Παλιόκας Ι., Τσακίρης A., Τζοβάρας Δ. |
Πατήστε πάνω στους τίτλους των υποκεφαλαίων ή μεταφερθείτε στην αρχική σελίδα.
2015 |
ΚΕΦΑΛΑΙΟ 7: ΔΙΑΧΕΙΡΙΣΗ ΣΚΗΝΗΣ
|
|
ΣύνοψηΣτο κεφάλαιο αυτό θα μελετήσουμε τις έννοιες, τις χρήσεις και την υλοποίηση συστημάτων διαχείρισης σκηνών τρισδιάστατων γραφικών. Με το όρο «σκηνή» αναφερόμαστε στο σύνολο των τρισδιάστατων αντικειμένων και των σχέσεων μεταξύ τους που περιγράφουν την απεικόνιση ενός εικονικού τρισδιάστατου κόσμου. Θα δούμε αρχικά πώς μπορούμε να χρησιμοποιήσουμε αφαιρετικές δομές για να περιγράψουμε πολύπλοκα αντικείμενα και σχέσεις μεταξύ αυτών. Στη συνέχεια, θα περιγράψουμε τους τρόπους οργάνωσης της πληροφορίας που περιέχεται σε μια τρισδιάστατη σκηνή μέσα από τη χρήση διάφορων δομών, καταλήγοντας στην περιγραφή των δενδρικών δομών και δομών γράφου που χρησιμοποιούμε συνηθέστερα. Με τη γνώση των δομών αυτών, θα συνεχίσουμε περιγράφοντας τους τρόπους οργάνωσης μιας σκηνής σε γράφο καθώς και τον τρόπο που μπορούμε να υλοποιήσουμε τέτοιες δομές προγραμματιστικά. Προχωρώντας πέρα από την οργάνωση μιας σκηνής θα αναφερθούμε στη σημασία της ορατότητας των αντικειμένων σε μια σκηνή και στο πώς αυτή επηρεάζει την πολυπλοκότητα της επεξεργασίας της. Για να μειώσουμε αυτήν την πολυπλοκότητα, θα μελετήσουμε τους τρόπους με τους οποίους μπορούμε μέσω της χρήσης κατάλληλων δομών να κατατμήσουμε μια σκηνή και να δημιουργήσουμε ένα σύστημα που θα αποφαίνεται με ταχύτητα σχετικά με την ορατότητα των αντικειμένων. Τέλος, θα περιγράψουμε τους τρόπους με τους οποίους οι διεργασίες κατάτμησης και απεικόνισης μιας σκηνής μπορούν να κατανεμηθούν σε πολλαπλές υπολογιστικές μονάδες. Προαπαιτούμενη γνώσηΑπαιτείται βασική γνώση γραμμικής άλγεβρας και διακριτών μετασχηματισμών. Απαιτείται ένα στοιχειώδες επίπεδο αντίληψης των βασικών εννοιών των συστημάτων συντεταγμένων, των δομών οργάνωσης δεδομένων και κυρίως δενδρικών δομών και δομών γράφου. Αν και δεν απαιτείται προηγούμενη προσωπική εμπειρία προγραμματισμού συστημάτων τρισδιάστατων γραφικών, ωστόσο αναμένεται να είναι γνωστές οι βασικές αρχές προγραμματισμού αντικειμενοστραφών γλωσσών προγραμματισμού. |
Με τον όρο μοντέλο ως γενική έννοια εννοούμε αφαιρέσεις του κόσμου, τόσο του πραγματικού κόσμου στον οποίο ζούμε όσο και των εικονικών κόσμων που έχουμε δημιουργήσει με τους υπολογιστές. Είμαστε όλοι εξοικειωμένοι με μαθηματικά μοντέλα που χρησιμοποιούνται σε όλους τους τομείς της επιστήμης και της μηχανικής. Τα μοντέλα αυτά χρησιμοποιούν εξισώσεις για την περιγραφή των φυσικών φαινομένων που θέλουμε να μελετήσουμε. Στην επιστήμη των υπολογιστών, χρησιμοποιούμε αφηρημένους τύπους δεδομένων για τη μοντελοποίηση των οργανώσεων των αντικειμένων. Στα γραφικά υπολογιστών, χτίζουμε το μοντέλο του κόσμου μας με γεωμετρικά αντικείμενα. Όταν χτίζουμε ένα μαθηματικό μοντέλο, πρέπει να επιλέξουμε προσεκτικά ποιος τύπος μαθηματικών ταιριάζει με τα φαινόμενα που θέλουμε να μοντελοποιήσουμε. Αν και οι συνήθεις διαφορικές εξισώσεις μπορεί να είναι κατάλληλες για τη μοντελοποίηση της δυναμικής συμπεριφοράς του συστήματος ελατηρίων και των μαζών, θα χρησιμοποιούσαμε κατά πάσα πιθανότητα μερικές διαφορικές εξισώσεις για το μοντέλο τυρβώδους ροής ρευστού. Ακολουθώντας ανάλογες διαδικασίες στα γραφικά υπολογιστών, επιλέγουμε τα πρότυπα που θα χρησιμοποιήσουμε για να δημιουργήσουμε τα μοντέλα μας και να αναδείξουμε τις σχέσεις μεταξύ τους. Συχνά, όπως ισχύει όταν επιλέγουμε ένα μαθηματικό μοντέλο, υπάρχουν πολλαπλές πιθανές προσεγγίσεις, οπότε αναζητούμε μοντέλα που να μπορούν να αξιοποιήσουν τις δυνατότητες των συστημάτων γραφικών μας.
Σε αυτό το κεφάλαιο, θα διερευνήσουμε διαφορετικές προσεγγίσεις για τη δημιουργία και χειρισμό μοντέλων γεωμετρικών αντικειμένων. Ως μοντέλα θεωρούμε τρισδιάστατα αντικείμενα που χρησιμοποιούν ως δομικά στοιχεία ένα σύνολο από απλά γεωμετρικά σχήματα: αυτά αποτελούν είτε βασικά αρχέτυπα που υποστηρίζονται από συστήματα γραφικών είτε ένα σύνολο αντικειμένων που ορίζονται από το χρήστη και βασίζονται σε αυτά τα αρχέτυπα. Οι μετασχηματισμοί που αναλύθηκαν σε προηγούμενο Κεφάλαιο θα παρουσιαστούν και εδώ, ενώ θα διευρυνθούν ώστε να περιλαμβάνουν και ιεραρχικές σχέσεις μεταξύ των αντικειμένων. Οι τεχνικές που αναπτύσσουμε είναι κατάλληλες για εφαρμογές, όπως η ρομποτική και η κινηματική χαρακτήρων, όπου η δυναμική συμπεριφορά των αντικειμένων χαρακτηρίζεται από τις σχέσεις μεταξύ των τμημάτων του μοντέλου.
Η έννοια της ιεραρχίας είναι βασική και αποτελεί αναπόσπαστο μέρος σε αντικειμενοστραφείς μεθοδολογίες. Θα επεκτείνουμε τα ιεραρχικά μοντέλα των αντικειμένων σε ιεραρχικά μοντέλα ολόκληρων σκηνών, συμπεριλαμβανομένων στοιχείων όπως κάμερες, φώτα, και οι ιδιότητες των υλικών. Τέτοια μοντέλα μας επιτρέπουν να επεκτείνουμε τις βιβλιοθήκες προγραμματισμού γραφικών σε πιο αντικειμενοστραφή συστήματα και επιπλέον, μας δίνουν μια εικόνα του τρόπου ανάπτυξης των συστημάτων για τη χρήση γραφικών σε δίκτυα και κατανεμημένα περιβάλλοντα, όπως ο παγκόσμιος ιστός.
Αρχικό μας μέλημα είναι πώς θα αναπαραστήσουμε και κατά συνέπεια αποθηκεύσουμε είτε στη μνήμη είτε σε μια μονάδα αποθήκευσης ένα μοντέλο που πιθανώς να συμπεριλαμβάνει πολλαπλά εξελιγμένα αντικείμενα. Αντιμετωπίζουμε δύο βασικά ζητήματα: α. πώς ορίζουμε ένα αντικείμενο πιο πολύπλοκο από όσα έχουμε ορίσει ώς τώρα και β. πώς αναπαριστούμε μια συλλογή τέτοιων αντικειμένων. Τα περισσότερα συστήματα γραφικών ακολουθούν μια μινιμαλιστική λογική απέναντι στα αρχέτυπα αντικειμένων: υποστηρίζουν ένα ελάχιστο πλήθος από αυτά, δίνοντας τη δυνατότητα στο χρήστη να δημιουργήσει πιο σύνθετα αντικείμενα συνδυάζοντας τα αρχέτυπα αυτά.
Μπορούμε να ακολουθήσουμε μια μη-ιεραρχική προσέγγιση σχετικά με τη μοντελοποίηση αντιμετωπίζοντας τα αρχέτυπα αντικείμενα ως σύμβολα/πρότυπα, αυτό έχει ως συνέπεια να μοντελοποιούμε τον κόσμο μας ως ένα σύνολο προτύπων. Τα πρότυπα αυτά μπορούν να συμπεριλαμβάνουν γεωμετρικά αντικείμενα, γραμματοσειρές και γραφικά σύμβολα. Συνήθως, αναπαριστούμε τα πρότυπα αυτά βάσει βολικών συμβάσεων ως προς τη θέση/περιστροφή και το μέγεθός τους. Για παράδειγμα, όταν δημιουργούμε έναν κύβο τοποθετούμε μια από τις ακμές του στο κέντρο των αξόνων, τον προσανατολίζουμε ως παράλληλο προς τους άξονες και με μοναδιαία διάσταση, όπως φαίνεται στην Εικόνα 7.1.
Τα περισσότερα συστήματα τρισδιάστατων γραφικών διακρίνουν μεταξύ του πλαισίου ορισμού του προτύπου (πλαίσιο μοντέλου) και του πλαισίου χρήσης ή αναφοράς (πλαίσιο αντικειμένου ή κόσμου). Η διάκριση αυτή βοηθάει όταν τα πρότυπα αποτελούν αμιγώς σχήματα, όπως για παράδειγμα σύμβολα ηλεκτρονικών κυκλωμάτων σε μία εφαρμογή CAD που δεν εμπεριέχουν φυσικές ιδιότητες. Στην OpenGL [Segal, 1992] για παράδειγμα, χρειάζεται να ορίσουμε το μετασχηματισμό από το πλαίσιο του μοντέλου στο πλαίσιο του κόσμου για να αναπαραστήσουμε το αντικείμενο στο σύστημα συντεταγμένων μιας εφαρμογής. Επομένως, ο πίνακας μετασχηματισμού παρατήρησης για κάθε πρότυπο είναι το γινόμενο ενός πίνακα μετασχηματισμού που τοποθετεί ένα στιγμιότυπο του προτύπου στο σύστημα συντεταγμένων του κόσμου και του πίνακα μετασχηματισμού της παρατήρησης της σκηνής. Για το στιγμιότυπο ενός αντικειμένου κύβου cubeinst θα έχουμε:
ΜΣΣΠ = ΜΣΣΠ * Μ(cubeinst), όπου Μ(cubeinst) = ΜS(cubeinst) * ΜR (cubeinst) * ΜT(cubeinst),
με ΜS(cubeinst) τον πίνακα κλιμάκωσης, ΜR(cubeinst) τον πίνακα περιστροφής και ΜT(cubeinst) τον πίνακα μετακίνησης.
Δημιουργούμε, δηλαδή, ένα αντίγραφο του πρότυπου αντικειμένου (στην περίπτωση του παραδείγματος έναν κύβο) και το αντίγραφο αυτό μέσω των μετασχηματισμών αποτελεί πλέον ένα ξεχωριστό στιγμιότυπο με τα δικά του χαρακτηριστικά. Το αποτέλεσμα των μετασχηματισμών φαίνεται στην Εικόνα 7.2.
Ας υποθέσουμε ότι θέλουμε να δημιουργήσουμε ένα κινηματικό μοντέλο ενός αυτοκινήτου. Μπορούμε να συνθέσουμε το μοντέλο από πέντε μέρη, το σασί και τους τέσσερις τροχούς (Εικόνα 7.3) - καθέναν από τους οποίους μπορούμε να περιγράψουμε με τη χρήση ενός στιγμιότυπου του πρότυπου μοντέλου «τροχός» μετασχηματίζοντάς το κατάλληλα ώστε να τοποθετηθεί στη σωστή θέση. Δύο καρέ της κινηματικής που παρουσιάζουν μια απλή κίνηση του μοντέλου παρουσιάζονται στην Εικόνα 7.4.
Θα μπορούσαμε να γράψουμε ένα πρόγραμμα που να εκτελεί την παραπάνω κινηματική αν θυμηθούμε πως μία περιστροφική κίνηση των τροχών κατά 360° μεταφράζεται σε αντίστοιχη γραμμική κίνηση του αυτοκινήτου κατά 2πR, όπου R η ακτίνα των τροχών. Υπολογίζοντας, δηλαδή, την ταχύτητα, την κατεύθυνση και το χρόνο που διαρκεί η κίνηση, μπορούμε να σχεδιάσουμε σε κάθε καρέ τη νέα θέση και τη νέα περιστροφή του σασί και κάθε τροχού. Μια αρνητική πτυχή κατά τη χρήση αυτού του είδους προγράμματος, όμως, είναι πως ακολουθεί μια γραμμική λογική και δεν εκμεταλλεύεται ούτε τη σχέση μεταξύ των τροχών και του σασί ως μέρη ενός συνολικού αντικειμένου, ούτε το χαρακτηριστικό ότι κάθε τροχός είναι απλά αντίγραφο ενός προτύπου σε διαφορετική θέση και ότι η περιστροφή είναι κοινή για όλους τους τροχούς ενός αυτοκινήτου.
Αυτό που θέλουμε είναι να αναπαραστήσουμε τις σχέσεις μεταξύ των αντικειμένων τόσο αφαιρετικά όσο και οπτικά με γράφους. Μαθηματικά, ένας γράφος αποτελείται από ένα σύνολο κόμβων και ένα σύνολο ακμών. Οι ακμές μπορούν να είναι κατευθυνόμενες και συνδέουν ζευγάρια από κόμβους ή και έναν κόμβο στον εαυτό του. Οι γράφοι που χρησιμοποιούμε στην οργάνωση σκηνών τρισδιάστατων μοντέλων είναι όλοι κατευθυνόμενοι γράφοι, δηλαδή κάθε ακμή ξεκινά από έναν κόμβο και καταλήγει σε έναν άλλο.
Η πιο σημαντική δομή γράφου για εφαρμογές γραφικών είναι οι δενδρικές δομές. Ένα συνδεδεμένο δέντρο αποτελεί έναν κατευθυνόμενο γράφο χωρίς βρόχους ή κλειστές διαδρομές μεταξύ κόμβων. Επιπρόσθετα, κάθε κόμβος πέρα από τον κόμβο-ρίζα έχει μια ακμή που καταλήγει σε αυτόν. Κατά συνέπεια, κάθε κόμβος έχει ένα κόμβο-γονέα και μπορεί να έχει έναν ή περισσότερους κόμβους-παιδιά, ή φύλλα. Ένας τερματικός κόμβος που δε διαθέτει κόμβους-παιδιά αποκαλείται τερματικός κόμβος ή φύλλο. Στην Εικόνα 7.5 βλέπουμε πώς αναπαριστούμε τις σχέσεις μεταξύ των κόμβων στο μοντέλο του αυτοκινήτου που είδαμε προηγουμένως σε δενδρική δομή. Το αυτοκίνητο είναι ο κόμβος-ρίζα του δέντρου που με τη σειρά του εμπεριέχει το σασί και αυτό στη συνέχεια έχει ως κόμβους-παιδιά τους 4 τροχούς.
Παρότι ένας γράφος με τη μαθηματική του έννοια είναι μια συλλογή από ορισμένα στοιχεία, στην πράξη, τόσο οι ακμές και οι κόμβοι μπορούν να περιέχουν πρόσθετες πληροφορίες. Για παράδειγμα, στο αυτοκίνητό μας, κάθε κόμβος μπορεί να περιέχει πληροφορίες για τον καθορισμό των γεωμετρικών αντικειμένων που σχετίζονται με αυτό. Οι πληροφορίες σχετικά με τη θέση και τον προσανατολισμό των τροχών μπορούν να αποθηκευτούν είτε στους κόμβους είτε στις ακμές που τους συνδέουν με τους κόμβους-γονείς τους.
Στα περισσότερα αυτοκίνητα οι τέσσερις τροχοί είναι πανομοιότυποι, οπότε αν αποθηκεύουμε τις ίδιες πληροφορίες (γεωμετρία, χρώμα, υφές, φυσικές ιδιότητες κλπ.) σε καθέναν από αυτούς είναι αναποτελεσματικό. Με το ίδιο σκεπτικό πίσω από τη λογική προτύπου-στιγμιότυπου μπορούμε να χρησιμοποιήσουμε ένα μόνο πρότυπο-τροχό στο μοντέλο μας, τοποθετώντας 4 στιγμιότυπα αυτού. Με τον τρόπο αυτόν, μπορούμε να αντικαταστήσουμε τη δομή δέντρου με κατευθυνόμενο ακυκλικό γράφο όπως στην Εικόνα 7.6.
Στους κατευθυνόμενους ακυκλικούς γράφους, αν και υπάρχουν περιπτώσεις βρόχων, δεν επιτρέπουμε την κυκλική διάσχυση. Έτσι, αν ακολουθήσουμε μια διαδρομή από έναν κόμβο, αυτή θα τερματίσει σε διαφορετικό. Στην περίπτωση του αυτοκινήτου, μπορούμε να αποθηκεύσουμε την πληροφορία θέσης και προσανατολισμού κάθε στιγμιότυπου του τροχού είτε στον κόμβο του σασί είτε στον κόμβο του προτύπου του τροχού στις ακμές.
Και οι δύο δομές (δένδρα και κατευθυνόμενοι ακυκλικοί γράφοι) αποτελούν ιεραρχικές μεθόδους οργάνωσης των σχέσεων μεταξύ των αντικειμένων που αποτελούν ένα φυσικό μοντέλο. Σε καθεμία από τις δύο δομές, διάφορα χαρακτηριστικά του μοντέλου μπορούν να συσχετισθούν με άλλα μέρη –προγόνους και απογόνους. Στο πλαίσιο των εφαρμογών τρισδιάστατων γραφικών θα δούμε πώς εκφράζονται αυτές οι σχέσεις.
Η λογική των ιεραρχικών μοντέλων γίνεται εύκολα αντιληπτή σε συστήματα που αποτελούν αρθρωτούς σκελετούς όπως στο ανθρώπινο σώμα ή σε αυτό ενός ζώου, σε ρομποτικά συστήματα, σε αρθρωτά μηχανήματα όπως γερανοί, εκσκαφείς κλπ. Ας πάρουμε το παράδειγμα του εκσκαφέα στην Εικόνα 7.7. Μπορούμε να τον μοντελοποιήσουμε χρησιμοποιώντας πέντε απλά αντικείμενα ή πρότυπα, π.χ. με έναν κύλινδρο που αντιπροσωπεύει τη βάση του εκσκαφέα, και τέσσερα παραλληλεπίπεδα που αντιπροσωπεύουν τους τρεις βραχίονες και το σκαπτικό του.
Ο μηχανισμός του εκσκαφέα έχει πέντε βαθμούς ελευθερίας, τέσσερις από τους οποίους μπορεί να περιγραφούν με τις γωνίες των συνδέσμων ανάμεσα στα μέρη που αποτελούν το βραχίονα και το σκαπτικό ενώ το πέμπτο από τη γωνία που σχηματίζει η βάση σε σχέση με ένα σταθερό σημείο επί του εδάφους. Στο μοντέλο μας, κάθε γωνία κόμβου καθορίζει πώς τοποθετείται κάθε κομμάτι του βραχίονα σε σχέση με το κομμάτι στο οποίο συνδέεται, ή στην περίπτωση της βάσης σε σχέση με τον περιβάλλοντα χώρο.
Κάθε γωνία άρθρωσης μετράται στο τοπικό πλαίσιο του κάθε κόμβου∙ όπως η βάση του εκσκαφέα κατά τον κατακόρυφο άξονα y κατά γωνία φ1. Ο πρώτος βραχίονας συνδέεται με τη βάση μέσω μιας άρθρωσης που επιτρέπει στο βραχίονα να περιστραφεί κατά τον τοπικό άξονα x της βάσης γύρω από το σημείο ένωσης με τη βάση κατά γωνία φ2. Με τον ίδιο τρόπο οι βραχίονες 2 και 3 συνδέονται κατά σειρά με τον άξονα 1 και 2 και περιστρέφονται κατά τον άξονα x γύρω από το σημείο της σύνδεσης κατά γωνίες φ3 και φ4 αντίστοιχα. Τέλος, το σκαπτικό συνδέεται με το βραχίονα 3 και περιστρέφεται κατά τον άξονα x γύρω από το σημείο της σύνδεσης κατά γωνία φ5. Μεταβάλλοντας τις επιμέρους γωνίες μπορούμε να τοποθετήσουμε το σκαπτικό οπουδήποτε στις τρεις διαστάσεις.
Ας υποθέσουμε ότι θέλουμε να απεικονίσουμε τον εκσκαφέα. Αντί να τοποθετήσουμε κάθε επιμέρους αντικείμενο ξεχωριστά στη σκηνή και να χειριστούμε την κίνησή του ανεξάρτητα από των υπολοίπων. ακολουθούμε μια σταδιακή προσέγγιση. Ξεκινώντας από τη βάση μπορούμε να την περιστρέψουμε γύρω από τον άξονα y οπότε περιγράφουμε την κίνησή της εφαρμόζοντας έναν πίνακα περιστροφής Ry(φ1). Προχωρώντας στον πρώτο βραχίονα για να περιγράψουμε την περιστροφή του Rx(φ2) περί τη βάση γύρω από τον τοπικό άξονα x αυτής κατά γωνία φ2, πρέπει πρώτα να μετακινήσουμε το κέντρο της περιστροφής του βραχίονα στο σημείο σύνδεσης με έναν πίνακα μετατόπισης T(x1,y1,z1) όπου x1,y1,z1 το σημείο σύνδεσης του πρώτου βραχίονα με τη βάση. Όταν θα περιστραφεί η βάση, θα περιστραφεί μαζί της και ο βραχίονας. Η νέα θέση του βραχίονα προκύπτει από το γινόμενο των μετασχηματισμών Ry(φ1) T(x1,y1,z1) Rx(φ2). Ο επιμέρους μετασχηματισμός Ry(φ1) T(x1,y1,z1) είναι αυτός που τοποθετεί το βραχίονα σε σχέση με τη βάση.
Αντίστοιχα, επεκτείνουμε την ίδια λογική και για τους υπόλοιπους βραχίονες και το σκαπτικό ώστε να τα τοποθετήσουμε σε σχέση με το αντικείμενο με το οποίο συνδέονται. Οι σχετικές τοποθετήσεις δηλαδή των μερών του εκσκαφέα θα είναι:
Το αποτέλεσμα των μετασχηματισμών φαίνεται στην Εικόνα 7.8. Παρατηρούμε ότι η απεικόνιση των επιμέρους αντικειμένων είναι ανεξάρτητη από την τοποθέτησή τους στο χώρο. Επομένως, με τη διατήρηση των μετατοπίσεων και περιστροφών μπορούμε να αλλάξουμε τη γραφική αναπαράσταση αλλάζοντας τις μεθόδους απεικόνισης κάθε επιμέρους στοιχείου. Για παράδειγμα, αν αντικαταστήσουμε τα στιγμιότυπα κυλίνδρων και παραλληλεπιπέδων με πιο πολύπλοκα τρισδιάστατα αντικείμενα, και διατηρήσουμε τους ίδιους μετασχηματισμούς θα έχουμε το αποτέλεσμα που φαίνεται στην Εικόνα 7.9.
Με τον τρόπο που ο διαχωρισμός της τοποθέτησης στη σκηνή μέσω της απεικόνισης μας επιτρέπει να αντικαθιστούμε τις συναρτήσεις σχεδίασης των αντικειμένων, μας δίνει επιπρόσθετα τη δυνατότητα να γράψουμε προγράμματα που να κινούν τον εκσκαφέα έτσι ώστε να λειτουργεί αρθρωτά.
Οι σχέσεις μεταξύ των επιμέρους αντικειμένων που συνθέτουν τον εκσκαφέα μπορούν να εκφραστούν με δενδρική αναπαράσταση με κόμβους και ακμές όπως στην Εικόνα 7.10.
Αν οι απαραίτητες παράμετροι τοποθέτησης και απεικόνισης κάθε αντικειμένου αποθηκευτούν στον αντίστοιχο κόμβο παρά στην ακμή, τότε κάθε κόμβος θα πρέπει να ενσωματώνει τα παρακάτω στοιχεία:
Ασφαλώς, μπορούμε να συμπεριλάβουμε άλλες πληροφορίες σε έναν κόμβο, όπως ένα σύνολο ιδιοτήτων (χρώμα, υφή, ιδιότητες υλικού) που ισχύει για τον κόμβο. Η απεικόνιση ενός αντικειμένου που περιγράφεται από ένα τέτοιο δέντρο απαιτεί την εκτέλεση μιας διάσχισης του δέντρου. Δηλαδή, θα πρέπει να επισκεφτούμε κάθε κόμβο, να υπολογίσουμε τον πίνακα μετασχηματισμού που ισχύει για τα πρότυπα που υποδεικνύονται από τον κόμβο και να σχεδιάσουμε αυτά τα πρότυπα.
Στο παράδειγμα του εκσκαφέα που η δομή του δέντρου είναι απλή και κάθε κόμβος έχει μόνο ένα παιδί, η διάσχιση είναι τετριμμένη. Στην επόμενη παράγραφο θα μιλήσουμε για το πώς διασχίζουμε πιο πολύπλοκα μοντέλα.
Η Εικόνα 7.11 απεικονίζει μια αναπαράσταση ενός μοντέλου ανθρώπου που μπορεί να χρησιμοποιηθεί για μια φυσική προσομοίωση της ανθρώπινης κίνησης ή σε μια εφαρμογή εικονικής πραγματικότητας. Αν θεωρήσουμε ως οστά τις αναπαραστάσεις με απλές γεωμετρίες της Εικόνα 7.11 (β) και ότι κάθε οστό αντιστοιχεί σε έναν κόμβο με τις ακμές που συνδέουν τους κόμβους μεταξύ τους να αντιστοιχούν στις αρθρώσεις μεταξύ των οστών, μπορούμε να αναπαραστήσουμε το σκελετό του μοντέλου με το δέντρο που φαίνεται στην Εικόνα 7.12.
Από τη στιγμή που θα τοποθετήσουμε το οστό-ρίζα (root bone), η θέση και ο προσανατολισμός των άλλων τμημάτων του μοντέλου καθορίζονται από τις γωνίες των αρθρώσεων. Μπορούμε να κινήσουμε το μοντέλο, καθορίζοντας τις κινήσεις των αρθρώσεών του [Watt, 1992]. Σε ένα βασικό μοντέλο, οι αρθρώσεις του γόνατου, του αγκώνα και των δακτύλων πέραν του αντίχειρα μπορεί να έχουν το καθένα μόνο ένα βαθμό ελευθερίας, ενώ άλλες αρθρώσεις, όπως του λαιμού ή του ώμου, 2 ή και 3 βαθμούς ελευθερίας.
Ας υποθέσουμε ότι έχουμε υλοποιήσει συναρτήσεις, όπως head και left_upper_arm, που απεικονίζουν τα επιμέρους τμήματα (πρότυπα) στο τοπικό τους σύστημα συντεταγμένων. Μπορούμε τώρα να δημιουργήσουμε ένα σύνολο κόμβων για το δέντρο μας ορίζοντας μετασχηματισμούς που τοποθετούν το κάθε μέρος σε σχέση με τον κόμβο-γονέα του, ακριβώς όπως κάναμε για τον εκσκαφέα. Αν υποθέσουμε ότι κάθε γεωμετρία που αναπαριστά το αντίστοιχο μέρος του σώματος έχει οριστεί στο επιθυμητό μέγεθος, καθένας από αυτούς τους μετασχηματισμούς είναι το γινόμενο ενός μετασχηματισμού μετατόπισης και ενός περιστροφής. Μπορούμε να απεικονίσουμε αυτούς τους μετασχηματισμούς, με τη χρήση συμβόλων των αντίστοιχων πινάκων στις ακμές μεταξύ των κόμβων.
Είναι σημαντικό να έχουμε κατά νου ότι κάθε πίνακας αναπαριστά τη βαθμιαία μεταβολή θέσης και προσανατολισμού καθώς πηγαίνουμε από κάθε κόμβο σε έναν από τους απογόνους του.
Το ενδιαφέρον μέρος αυτού του παραδείγματος είναι πώς θα κάνουμε τη διάσχιση του δέντρου για να απεικονίσουμε το μοντέλο. Καταρχήν, θα μπορούσαμε να χρησιμοποιήσουμε οποιοδήποτε αλγόριθμο διάσχισης δέντρου, όπως αναζήτηση κατά βάθος ή κατά πλάτος. Αν και σε πολλές εφαρμογές δεν έχει σημασία ο αλγόριθμος διάσχισης που χρησιμοποιείται, θα δούμε ότι υπάρχουν καλοί λόγοι για να χρησιμοποιείται πάντα ο ίδιος αλγόριθμος για τη διάσχιση των γράφων μας. Στην περίπτωση διαχείρισης γραφικών αντικειμένων σε μια τρισδιάστατη σκηνή πάντα διασχίζουμε τα δέντρα από αριστερά προς δεξιά, κατά προτεραιότητα βάθους. Δηλαδή, ξεκινάμε με τον αριστερό κλάδο, τον ακολουθούμε προς τα αριστερά μέχρι το μέγιστο βάθος που μπορούμε, επιστρέφουμε στον πρώτο κλάδο προς τα δεξιά και συνεχίσουμε αναδρομικά όπως στην Εικόνα 7.13.
Εν γένει, εκφράζουμε ένα κόμβο (στόχος) που σχετίζεται με έναν άλλο (κόμβος αναφοράς) με μια αλλαγή του συστήματος συντεταγμένων αναφοράς σύμφωνα με τους ενδιάμεσους μετασχηματισμούς:
Ο μετασχηματισμός ενός κόμβου στο επίπεδο k σε ένα κλαδί A που σχετίζεται με έναν άλλο κόμβο που βρίσκεται στο επίπεδο m σε ένα κλαδί B με κοινή ρίζα στο επίπεδο r είναι:
{Εξ. 7.1} |
Μπορούμε να γράψουμε μια συνάρτηση διάσχισης δέντρου με δύο τρόπους. Αφενός να υλοποιήσουμε τη διάσχιση ρητά στον κώδικα της εφαρμογής, με στοίβες, για να αποθηκεύσουμε τους απαιτούμενους πίνακες μετασχηματισμού και ιδιοτήτων του αντικειμένου καθώς προχωράμε μέσα από το δέντρο. Αφετέρου, μπορούμε ς να κάνουμε τη διάσχιση αναδρομικά. Σε αυτήν τη δεύτερη προσέγγιση, ο κώδικας είναι απλούστερος, επειδή η αποθήκευση των πινάκων μετασχηματισμού και των ιδιοτήτων γίνεται σιωπηρά σε χαμηλότερο επίπεδο του υποσυστήματος γραφικών.
Παρά το γεγονός ότι έχουμε εισάγει πολλαπλά πρότυπα γραφικών, η ανάπτυξη μας ως τώρα έχει σε μεγάλο βαθμό βασιστεί σε μια εφαρμογή της λογικής του μοντέλου συνθετικής κάμερας. Η επιλογή αυτή γίνεται γιατί θέλουμε να στηρίξουμε διαδραστικές τρισδιάστατες εφαρμογές με το παρόν διαθέσιμο εξοπλισμό και λογισμικό. Ως εκ τούτου, έχουμε τονίσει έναν τρόπο γραφικής αναπαράστασης στην οποία τα γεωμετρικά αποστέλλονται στην GPU και εμφανίζονται στην οθόνη σχεδόν αμέσως μετά. Δεν έχουμε κάνει πλήρη χρήση του γεγονότος ότι αφού τα δεδομένα είναι στην GPU, μπορούν να επαναχρησιμοποιηθούν χωρίς να αναδημιουργηθούν εκ νέου στην εφαρμογή.
Τώρα προχωράμε σε ένα υψηλότερο επίπεδο αφαίρεσης και εισάγουμε δύο σημαντικές έννοιες. Πρώτον, έχουμε διευρύνει την έννοια του αντικειμένου από τα γεωμετρικά αντικείμενα, όπως απλά πολύγωνα και διανύσματα, ώστε να περιλαμβάνουμε τα περισσότερα από τα στοιχεία μέσα σε ένα πρόγραμμα γραφικών, όπως κάμερες/θεατές, φώτα, καθώς και οι ιδιότητες υλικών απεικόνισης και φυσικής. Δεύτερον, έχουμε επικεντρωθεί σε αντικείμενα που υφίστανται ακόμη και αν έχουν, ήδη, σχεδιαστεί οι αναπαραστάσεις τους ακόμη και αν δεν τα εμφανίσουμε ποτέ στην οθόνη. Στο παρόν κεφάλαιο θα ερευνήσουμε άλλες προσεγγίσεις, όπως η χρήση αντικειμενοστραφών κλάσεων σε C ++ ή δομές στο C και πώς ενσωματώνεται λειτουργικότητα μέσα στους κόμβους που αντιπροσωπεύουν αντικείμενα μιας σκηνής.
Τα προγράμματά μας χειρίζονται δεδομένα. Τα δεδομένα μπορεί να είναι σε πολλές μορφές, που κυμαίνονται από αριθμούς, σε strings, μέχρι τις γεωμετρικές οντότητες που χτίζουμε στις εφαρμογές μας. Στο παραδοσιακό «διαδικαστικό» προγραμματισμό, ο προγραμματιστής γράφει κώδικα για να χειριστεί τα δεδομένα, συνήθως μέσω συναρτήσεων. Τα δεδομένα εισόδου μεταφέρονται στη συνάρτηση μέσω των ορισμάτων της συνάρτησης. Τα αποτελέσματα επιστρέφονται κατά παρόμοιο τρόπο. Για να χειριστεί τα δεδομένα που αποστέλλονται σε αυτή, η συνάρτηση πρέπει να είναι ενήμερη για το πώς οργανώνονται τα δεδομένα αυτά..
Ας σκεφτούμε, για παράδειγμα, την υλοποίηση ενός κύβου. Είδαμε ότι μπορούμε να τον μοντελοποιήσουμε με διάφορους τρόπους, μεταξύ άλλων και με δείκτες σε κορυφές, λίστες ακμών καθώς και λίστες των κορυφών του πολυγώνου. Ο προγραμματιστής δεν ενδιαφέρεται (στις περισσότερες περιπτώσεις) ποιος τρόπος μοντελοποίησης χρησιμοποιείται και μπορεί να προτιμά να θεωρεί τον κύβο ως ατομική οντότητα ή ένα αντικείμενο. Επιπλέον, μπορεί να μην τον απασχολούν οι λεπτομέρειες που αναφέρονται στον τρόπο που ο κύβος εμφανίζεται στην οθόνη, ποιο μοντέλο σκίασης χρησιμοποιείται ή ποιος αλγόριθμος πλήρωσης πολύγωνων. Μπορούμε να υποθέσουμε ότι ο κύβος "ξέρει πώς να αποτυπωθεί στην οθόνη" και ότι ουσιαστικά ο αλγόριθμος σχεδίασης και εμφάνισης συσχετίζεται με το ίδιο το αντικείμενο. Για παράδειγμα, το χρώμα του κύβου, ο προσανατολισμός του, και τα φώτα που εφαρμόζονται στις επιφάνειές του είναι όλα μέρος της κατάστασης του συστήματος γραφικών και δεν μπορεί να εξαρτώνται από το πώς ο κύβος είναι μοντελοποιημένος.
Ωστόσο, αν δουλεύουμε με έναν φυσικό κύβο, μπορούμε να βρούμε αυτή τη θεώρηση λίγο παράξενη. Η θέση ενός φυσικού κύβου είναι συνδεδεμένη με το φυσικό αντικείμενο, όπως είναι και το χρώμα, το μέγεθος και ο προσανατολισμός. Ο τρόπος που περιγράψαμε για το χειρισμό ιεραρχικών δομών με χρήση στοιβών όπου αποθηκεύουμε και ανακτούμε πίνακες μετασχηματισμού και χαρακτηριστικών δεν υποστηρίζει αυτές τις ιδέες καλά. Για παράδειγμα, μια συνάρτηση που εκτελεί κάποια ενέργεια στον κύβο θα πρέπει να γνωρίζει ακριβώς πώς αναπαριστάται ο κύβος και θα μπορούσε να λειτουργήσει όπως παρουσιάζεται στην Εικόνα 7.14 (α).
Ο προγραμματιστής θα έγραφε μια συνάρτηση που να λαμβάνει ως εισόδους του έναν δείκτη σε δεδομένα του κύβου και τις παραμέτρους του μετασχηματισμού. Η συνάρτηση στη συνέχεια αφού επεξεργαζόταν τα δεδομένα για τον κύβο θα επέστρεφε τον έλεγχο στην εφαρμογή πιθανώς επιστρέφοντας και νέες τιμές παραμέτρων.
Ο αντικειμενοστραφής σχεδιασμός και ο αντικειμενοστραφής προγραμματισμός αντιμετωπίζουν το χειρισμό των αντικειμένων με ένα ριζικά διαφορετικό τρόπο. Οι αντικειμενοστραφείς γλώσσες προγραμματισμού ορίζουν τα αντικείμενα ως ενότητες με τις οποίες χτίζουμε προγράμματα. Οι ενότητες αυτές περιλαμβάνουν τα στοιχεία που καθορίζουν τη ενότητα, όπως οι κορυφές κύβου μας, οι ιδιότητες της μονάδας (χαρακτηριστικά), και οι λειτουργίες (μέθοδοι) που χειρίζονται τη μονάδα και τα χαρακτηριστικά της. Για να καλέσουμε μια μέθοδο του αντικειμένου αποστέλλουμε ένα μήνυμα προς αυτό. Το μοντέλο αυτό φαίνεται στην Εικόνα 7.14 (β).
Το πλεονέκτημα για τον προγραμματιστή είναι ότι δε χρειάζεται να γνωρίζει τον τρόπο με τον οποίο αναπαριστάται το αντικείμενο, στην προκειμένη περίπτωση ο κύβος. Το μόνο που χρειάζεται να γνωρίζει είναι οι λειτουργίες που υποστηρίζει το αντικείμενο, δηλαδή τι είδους μηνύματα μπορεί να λάβει. Επομένως, σε μια αντικειμενοστραφή γλώσσα προγραμματισμού, όπως η C++, η C# και η Java μπορούμε να χρησιμοποιήσουμε τη δομή της κλάσης για να ορίσουμε ένα αντικείμενο και μέσα από αυτήν την κλάση να καλέσουμε τις μεθόδους που αυτό υποστηρίζει. Ας δούμε το παράδειγμα υλοποίησης της κλάσης του κύβου σε αντικειμενοστραφή ψευδοκώδικα (Λίστα 7.1).
1. class Cube
2. {
3. public:
4. void Cube(){}
5. void ~Cube(){}
6. void translate(Vector3 position);
7. void rotate(float angle, Vector3 axis);
8. void scale(float amount, Vector3, axis);
9. void draw();
10. void setColor(Vector4 color);
11. Vector4 getColor();
12. private:
13. Vector4 m_color;
14. Matrix4 m_mat;
15. }
Για να χειριστούμε ένα αντικείμενο της κλάσης cube αρκεί να δημιουργήσουμε ένα στιγμιότυπο και να καλέσουμε τις μεθόδους του γράφοντας ένα πρόγραμμα μέσα στα πλαίσια του παρακάτω ψευδοκώδικα (Λίστα 7.2).
1. Cube cube_instance;
2.
3. void initialize()
4. {
5. cube_instance = new Cube();
6. cube_instance-<setColor({1,0,0,1}); //Green (R,G,B,A)
7. cube_instance-<scale(sx,{1,0,0});
8. cube_instance-<scale(sy,{0,1,0});
9. cube_instance-<scale(sz,{0,0,1});
10. }
11.
12. void main ()
13. {
14. initialize();
15. while(application_running)
16. {
17. update();
18. }
19. }
20.
21. void update()
22. {
23. cube_instance-<translate({x,y,z});
24. cube_instance-<rotate(r,{x,y,z});
25. cube_instance-<draw();
26. }
Σύμφωνα με το παραπάνω πρόγραμμα δημιουργούμε το αντικείμενο cube_instance της κλάσης Cube και αφού το αρχικοποιήσουμε καλώντας τη συνάρτηση initialize() στον κύριο βρόχο του προγράμματος σε κάθε ανανέωση της οθόνης καλούμε τη συνάρτηση update() για να το τοποθετήσουμε στο τρισδιάστατο σύστημα συντεταγμένων και να το απεικονίσουμε στην οθόνη. Για να εκτελεστεί η αρχικοποίηση, η τοποθέτηση και η απεικόνιση καλούμε τις αντίστοιχες μεθόδους του αντικειμένου.
Αντίστοιχα μπορούμε να δημιουργήσουμε κλάσεις για να υλοποιήσουμε αντικείμενα άλλων ειδών που θα συμπεριλάβουμε στη σκηνή μας, για παράδειγμα φώτα, κάμερες κλπ. Επίσης, μπορούμε να δημιουργήσουμε συναθροίσεις αντικειμένων ώστε να μπορούμε να ορίζουμε μετασχηματισμούς και μεθόδους που να εφαρμόζονται σε όλα τα μέλη της συνάθροισης. Επεκτείνουμε έτσι την έννοια των κόμβων που περιγράψαμε ως τώρα ώστε να συμπεριλαμβάνουν τα νέα είδη αντικειμένων καθώς και τις συναθροίσεις αυτών.
Επεκτείνοντας τις ιεραρχικές δομές που παρουσιάσαμε ώς τώρα για την αναπαράσταση των σχέσεων των επιμέρους αντικειμένων τα οποία αποτελούν ένα μοντέλο ώστε να καλύψουμε μια ολόκληρη σκηνή που περιέχει πολλαπλά μοντέλα βάσει της αντικειμενοστραφούς λογικής, καταλήγουμε στην έννοια του Γράφου Σκηνής [Clark, 1976]. Ως Γράφο Σκηνής (ΓΣ) ορίζουμε την ιεραρχία αντικειμένων συσχετιζόμενα με οντολογικό τρόπο και χωρική (γεωμετρική) εξάρτηση και τα οποία σχηματίζουν μια τρισδιάστατη σκηνή η οποία αποτελείται από κόμβους που αναπαριστούν:
Οι ΓΣ είναι κατευθυνόμενοι, μη κυκλικοί γράφοι κόμβων, των οποίων οι ακμές ορίζουν γεωμετρικές ή λειτουργικές εξαρτήσεις ενός κόμβου παιδιού με τον γονέα του. Οι κόμβοι περιέχουν όλη την λειτουργικότητα που χρειάζεται για να οριστεί μια συμπεριφορά, δηλαδή η λειτουργικότητα είναι ενσωματωμένη σε ένα αντικείμενο κάνοντας χρήση μιας αντικειμενοστραφούς υλοποίησης.
Κάθε γράφος σκηνής ξεκινάει από τον κόμβο-ρίζα. Ο κόμβος ρίζα είναι μια αφηρημένη αναπαράσταση της σκηνής:
Μια λειτουργία σε ένα κόμβο επηρεάζει όλα τα παιδιά του, ενώ οι ομάδες (συναθροίσεις κόμβων) αντιμετωπίζονται σαν αυτοτελείς υπο-γράφοι σκηνής Αυτό κάνει εύκολη την μοντελοποίηση περίπλοκων περιβαλλόντων και των κινήσεων εντός αυτών ενώ επιτρέπει την επαναχρησιμοποίηση οντοτήτων. Περίπλοκες κινήσεις και συμπεριφορές αντικειμένων χωρίζονται σε απλούστερες δίνοντας τοπική συμπεριφορά στα στοιχεία που οργανώνονται ιεραρχικά. Οι τέσσερις κύριες διαδικασίες που εφαρμόζονται σε ένα γράφο σκηνής είναι οι ακόλουθες:
Την αρχικοποίηση την περιγράψαμε ήδη σε επίπεδο κόμβου. Σε επίπεδο γράφου σκηνής η αρχικοποίηση είναι μια αναδρομική διαδικασία στην οποία κάθε κόμβος δημιουργείται, παραμετροποιείται και παίρνει τη θέση του στο γράφο. Αυτό μπορεί να γίνει είτε διαβάζοντας ένα αρχείο που περιγράφει τη σκηνή και τα αντικείμενα που περιέχει καθώς και τις σχέσεις τους, είτε προγραμματιστικά μέσω μιας συνάρτησης που υλοποιεί το γράφο.
Η ενημέρωση αναφέρεται στην εφαρμογή μεθόδων που μεταβάλλουν την κατάσταση ενός κόμβου στο χρόνο. Καθορίζονται όλες οι παράμετροι των κόμβων του δέντρου για το παρόν καρέ ανανέωσης της οθόνης και ενημερώνονται οι μεταβλητές του προγράμματος που συνδέονται με τη συμπεριφορά του κόμβου Για παράδειγμα, μια κινηματική διαδικασία μεταφέρει τη θέση του σκαπτικού μέσα σε συγκεκριμένο χρόνο από ένα σημείο σε άλλο ή την κίνηση περπατήματος του ανθρώπινου μοντέλου. Σε κάθε καρέ μεταξύ της αρχικής και της τελικής θέσης ενημερώνονται όλοι οι κόμβοι ώστε να μετακινηθούν στην ενδιάμεση θέση για το παρόν καρέ.
Η περικοπή αναφέρεται στη διαδικασία που αποφασίζει το σύστημα γραφικών ποιοι κόμβοι θα εμφανιστούν στην οθόνη με βάση την ορατότητά τους, την κατάστασή τους και τους κανόνες έχει ορίσει ο προγραμματιστής. Η περικοπή αντικειμένων είναι πολύ σημαντικό κομμάτι της απεικόνισης τρισδιάστατων γραφικών γιατί επηρεάζει σε μεγάλο βαθμό τη δυνατότητα του συστήματος να ανανεώνει την απεικόνιση σε πραγματικό χρόνο. Η περικοπή σε ένα γράφο σκηνής συνδέεται με τις εξαρτήσεις κόμβων. Εφόσον κάθε κόμβος “περιέχει” όλα τα παιδιά του:
Το αποτέλεσμα της διαδικασίας περικοπής καθορίζεται από τον έλεγχο του περιβάλλοντα όγκου του κόμβου που έχει επιλεχθεί. Για έναν συναθροιστικό κόμβο, ο περιβάλλον όγκος αντικατοπτρίζει τις συγκεντρωτικές επεκτάσεις των παιδιών του.
Η σχεδίαση, όπως περιγράψαμε, σε επίπεδο κόμβου κατέρχεται αναδρομικά την ιεραρχία και εφαρμόζει αλγορίθμους σχεδίασης, φωτισμού, οπτικών εφέ και απεικόνισης εικόνας σε κάθε ορατό κόμβου. Στην απευθείας σχεδίαση εικόνας και τον αλγόριθμο εκπομπής ακτινών (ray casting) 1ου επιπέδου τα υποδέντρα που έχουν περικοπεί αγνοούνται.
Γενικεύοντας τον τρόπο με τον οποίο περιγράψαμε την κλάση που ορίζει ένα γεωμετρικό αντικείμενο όπως ο κύβος στην παράγραφο 7.6.2, ώστε να περιγράφει έναν γενικό κόμβο ανεξάρτητα από το γεωμετρικό αντικείμενο που περιέχει, καταλήγουμε στην κλάση Node∙ αυτή υλοποιείται στα πλαίσια του ψευδοκώδικα που παρατίθεται ακολούθως (Λίστα 7.3).
1. class Node
2. {
3. protected:
4. bool active;
5. bool culled;
6. public:
7. Node();
8. virtual void init();
9. virtual void update();
10. virtual void cull();
11. virtual void draw();
12. virtual void reset();
13. }
Αντίστοιχα, η κλάση που ορίζει μια συνάθροιση κόμβων υλοποιείται στα πλαίσια του παρακάτω ψευδοκώδικα (Λίστα 7.4).
1. class Group : Node
2. {
3. protected:
4. vector
5. Bvolume extents;
6. public:
7. Group();
8. void add(Node *n);
9. void remove(int i);
10. Node * getChild(int i);
11. int getNumChildren();
12. virtual void init();
13. virtual void simulate();
14. virtual void cull();
15. virtual void draw();
16. }
Όπως βλέπουμε στον ψευδοκώδικα, όλοι οι κόμβοι ενός γράφου σκηνής αποτελούν επεκτάσεις της κλάσης Node και συνεπώς κληρονομούν τις 4 βασικές λειτουργίες αυτής. Οι συναθροιστικοί κόμβοι παράγονται από την κλάση Group και μοιράζονται έναν κοινό τρόπο λειτουργίας: διατηρούν μια λίστα απογόνων και διαθέτουν βασικές λειτουργίες μιας συλλογής. Πιο περίπλοκες υποκλάσεις της Group επεκτείνουν τη συμπεριφορά με την πρόσθεση ειδικών μεθόδων. Κοινό χαρακτηριστικό όλων των κόμβων της κλάσης Group είναι η διάσχιση των απογόνων τους. Αυτή εκδηλώνεται ως ένα αναδρομικό κάλεσμα όλων των αντικειμένων της κλάσης Node στην εσωτερική τους λίστα. Λόγω του πολυμορφισμού που επιτρέπει ο αντικειμενοστραφής προγραμματισμός, ένα αντικείμενο της κλάσης Group μπορεί καλέσει τις μεθόδους init(), draw(), cull(), update() χωρίς να γνωρίζει από ποιες υποκλάσεις προέρχεται το αντικείμενο. Όλοι οι κόμβοι του γράφου σκηνής μοιράζονται ένα κοινό interface.
1. void Geometry::draw() // Geometry: υποκλάση της Node
2. {
3. if (!enabled || culled)
4. return;
5. // ... Σχεδίαση της γεωμετρίας
6. }
Ο τρόπος διάσχισης ενός γράφου σκηνής ορίζει τη σειρά εκτέλεσης κάθε μεθόδου. Η αρχικοποίηση και τα 3 επαναλαμβανόμενα βήματα εκτελούνται ιεραρχικά το ένα μετά το άλλο ξεκινώντας από τη ρίζα της σκηνής. Μετά την αρχικοποίηση, οι αρμοδιότητες ενός γράφου σκηνής περιλαμβάνουν:
1. Scene *myScene = new Scene(); // Scene: υποκλάση της Node
2. myScene -> load("village.scn"); //μεταφόρτωση από αρχείο
3. myScene -> init();
4. while (application_running)
5. {
6. //... Άλλες λειτουργίες
7. myScene -> update();
8. myScene -> cull();
9. myScene -> draw();
10. }
Έτσι οι κόμβοι συγχρονίζονται σε σχέση με την κατάστασή τους και τις τιμές των παραμέτρων. Σε ορισμένες περιπτώσεις η ενημέρωση των δεδομένων των κόμβων εκτελείται με υστέρηση. Σε αυτή τη μέθοδο, οι αλλαγές στην κατάσταση μιας οντότητας δεν παράγουν άμεσο αποτέλεσμα: Μια φορά γίνεται ο υπολογισμός τιμής για όλων των χαρακτηριστικών για την παραγωγή μιας προσομοίωσης, περικοπής, ή οπτικού αποτελέσματος. Οι ενημερώσεις με υστέρηση είναι χρήσιμες όταν πρέπει να γίνεται μια υπολογιστικά ακριβή διαδικασία κάθε φορά που αλλάζει μια μεταβλητή. Παραδείγματα σε ένα γράφο σκηνής είναι η συνθετική κίνηση βασισμένη σε μηχανική προσομοίωση και ο υπολογισμός πολυέδρου σκιάς.
Σε περιπτώσεις σύνθετων γράφων σκηνής δεν περιοριζόμαστε στον ιεραρχικό έλεγχο. Εφαρμόζουμε άμεση επικοινωνία μεταξύ των κόμβων. Οι κόμβοι μπορούν να επικοινωνήσουν μεταξύ τους:
Στη δεύτερη περίπτωση (πιο εύκολη στο συγχρονισμό), κάθε κόμβος πρέπει να επεκταθεί για να υποστηρίζει μια ουρά μηνυμάτων και ένα χάρτη γεγονότων. Η κλάση του μηνύματος υλοποιείται στα πλαίσια του παρακάτω ψευδοκώδικα:
1. class NodeMessage
2. {
3. Node *from, *to;
4. int ID;
5. void * params;
6. ;
7. typedef EventID int
Αντίστοιχα ενσωματώνουμε τη δυνατότητα διαχείρισης μηνυμάτων στην κλάση Node:
1. class Node
2. {
3. protected:
4. ...
5. vector
6. multimap
7. // Επεξεργασία εισερχομένων μηνυμάτων
8. void processMessages();
9. // Αποστολή εξερχομένων μηνυμάτων
10. void dispatchMessages();
11. public:
12. ...
13. // Εισαγωγή μηνύματος στην ουρά του κόμβου
14. message( NodeMessage *msg );
15. registerEvent( EventID evt, Node* target,
16. int msgID, void* params );
17. }
Για να γίνεται σωστή διαχείριση των μηνυμάτων είναι απαραίτητη δημιουργία μίας ουράς μηνυμάτων καθώς ένας κόμβος μπορεί να λάβει πολλά μηνύματα εντολών από άγνωστο πλήθος κόμβων. Επίσης, δημιουργείται ένας χάρτης γεγονότων, ο οποίος δημιουργεί μια αντιστοίχιση για αντιδράσεις που ορίζονται από το χρήστη στις αλλαγές κατάστασης του κόμβου. Στην επεκταμένη κλάση Node προστίθενται 2 νέες μέθοδοι:
Αυτές οι λειτουργίες εκτελούνται πριν & μετά από το βήμα προσομοίωσης. Ας δούμε ένα παράδειγμα χρήσης των μηνυμάτων για να εκτελούμε λειτουργίες σε κόμβους: Θεωρείστε ένα δωμάτιο γεμάτο έπιπλα. Αρχικά το φως είναι σβηστό και δε χρειάζεται να έχουν τα έπιπλα σκιές οπότε η σκίαση είναι αρχικά απενεργοποιημένη για αυτούς του κόμβους γεωμετρίας. Όταν ανάβει το φως τα έπιπλα θα πρέπει να αποκτήσουν σκιές. Επίσης, θέτουμε ένα αντικείμενο φωτοστέφανου με όνομα halo ορατό γύρω από τη λάμπα όταν αυτή ανάβει, για να είναι πιο ρεαλιστική η σκηνή:
1. Light * bulb; // Το Light επεκτείνει το Node
2. Geometry *furniture, *halo;
3. ...
4. bulb -> registerEvent( EVENT_ON, furniture, MSG_SHADOWS_ON, NULL);
5. bulb -> registerEvent( EVENT_ON, halo, MSG_ENABLE, NULL);
Σύμφωνα με τον παραπάνω ψευδοκώδικα καταχωρούμε το γεγονός EVENT_ON (ενεργοποίησης του κόμβου) έτσι ώστε στον κόμβο furniture να αποστέλλει το τον τύπο μηνύματος MSG_SHADOWS_ON, ενώ στον κόμβο halo να αποστέλλει τον τύπο μηνύματος MSG_ENABLE. Αντίστοιχα, στο αντικείμενο furniture θα έχουμε κάνει μια αντιστοίχιση του MSG_SHADOWS_ON με μια μέθοδο που ενεργοποιεί τη σκίαση του αντικειμένου, ενώ στο αντικείμενο halo θα έχουμε κάνει μια αντιστοίχιση του MSG_ENABLE με μια μέθοδο που ενεργοποιεί το αντικείμενο.
Σχετικά με την απόδοση μιας 3D μηχανής γραφικών πραγματικού χρόνου, το πιο σημαντικό συστατικό της αρχιτεκτονικής απεικόνισης είναι ο καθορισμός της ορατότητας αντικειμένων. Δεδομένης μιας συγκεκριμένης θέσης προσανατολισμού της κάμερας, κάθε μηχανή γραφικών πρέπει να είναι σε θέση να προσδιορίσει αποτελεσματικά ποια μέρη του κόσμου είναι δυνητικά ορατά και ως εκ τούτου θα πρέπει να αποδοθούν στην οθόνη. Αυτό το πρόβλημα συνήθως αντιμετωπίζεται από την αντίθετη πλευρά, η μηχανή καθορίζει ποια μέρη του κόσμου είναι σίγουρα μη ορατά και εμφανίζει ό,τι απομένει.
Οι περισσότερες μηχανές τρισδιάστατων γραφικών εκτελούν τον καθορισμό της ορατότητας σε πολλαπλά επίπεδα. Ο γενικός σκοπός είναι να καθοριστεί ποια γεωμετρία του κόσμου ενδεχομένως τέμνει τον όγκο θέασης της κάμερας. Στο χαμηλότερο επίπεδο, η κάρτα γραφικών εκτελεί αποκοπή οπίσθιων πολυγώνων για την εξάλειψη ατομικών τριγώνων που κοιτούν προς την αντίθετη πλευρά από την κάμερα. Σε ανώτερο επίπεδο, εκτελείται διαδικασία δοκιμής τομών μεταξύ του όγκου προβολής και αντικειμένων ώστε να καθοριστεί αν είναι μέσα ή έξω από αυτόν.
Η περικοπή αντικειμένων με βάση την ορατότητά τους απαιτεί τη χρήση περιβαλλόντων όγκων που ορίζουν με πιο απλοποιημένες γεωμετρίες το χώρο που καταλαμβάνει ένα αντικείμενο στο τρισδιάστατο περιβάλλον και κατά συνέπεια αν βρίσκεται μέσα ή έξω από τα όρια όγκου θέασης της κάμερας καθώς και εάν κρύβουν ή κρύβονται από άλλα αντικείμενα. Οι περιβάλλοντες όγκοι κατασκευάζονται έτσι ώστε να περικλείουν όλες τις κορυφές που ανήκουν σε ένα τριγωνοποιημένο γεωμετρικό αντικείμενο, εξασφαλίζοντας έτσι ότι κάθε τρίγωνο στο αντικείμενο, επίσης, περιέχεται στον περιβάλλοντα όγκο. Θα πρέπει να ελαχιστοποιηθεί ο περιβάλλοντας όγκος όσο το δυνατόν περισσότερο, έτσι ώστε να πέφτει εντελώς έξω από τον όγκο προβολής όσο το δυνατόν συχνότερα, επιτρέποντας έτσι την περικοπή του αντικειμένου που περιέχει από το ορατό σύνολο της γεωμετρίας.
Υπάρχουν πολλές γεωμετρίες που μπορούμε να χρησιμοποιήσουμε για να περικλείσουμε ένα γεωμετρικό αντικείμενο (π.χ. σφαίρα, παραλληλεπίπεδο, κύλινδρος κλπ.) αλλά στο κομμάτι της περικοπής χρησιμοποιούμε τα περιβάλλοντα παραλληλεπίπεδα (bounding box). Τα περιβάλλοντα παραλληλεπίπεδα με τη σειρά τους διακρίνονται ανάλογα με το αν είναι προσανατολισμένα με βάση τους άξονες του κόσμου ή με τους τοπικούς άξονες που ορίζουν οι μέγιστες διαστάσεις του αντικειμένου. Στην πρώτη περίπτωση μιλάμε για axis aligned bounding box (AABB) ενώ στη δεύτερη για object aligned bounding box (OABB).
Ολιγομελείς ομάδες της γεωμετρίας μπορούν να αποκοπούν από το ορατό σύνολο οργανώνοντας περιοχές του κόσμου σε δενδρικές δομές όπως τα δέντρα δυαδικής χωρικής κατάτμησης (Binary Space Partitioning - BSPtrees) [Fuchs, 1977] ή με μια άλλη δεντρική δομή χωρικής κατάτμησης την οποία αποκαλούμε Octrees [Meagher, 1980]. Κατά τη μεγαλύτερη κλίμακα, ολόκληρες περιοχές του κόσμου γεωμετρίας μπορούν να εξαλειφθούν με τη χρήση μιας τεχνικής γνωστής ως σύστημα πυλών (Portals) [Telleretal., 1991].
Μια τεχνική που υιοθετείται όταν η ταχύτητα είναι πιο σημαντικός παράγοντας από την ακριβή ορατότητα είναι η προσαρμογή του περιβάλλοντα όγκου ενός συναθροιστικού κόμβου με βάση τα μετασχηματισμένα όρια των περιβαλλόντων όγκων των παιδιών του αντί για τα όρια των μετασχηματισμένων παιδιών του. Η παραπάνω λύση, όμως, δεν παράγει βέλτιστους περιβάλλοντες όγκους και τα όρια των μετασχηματισμένων περιβαλλόντων όγκων είναι, εν γένει, μεγαλύτερα από τα όρια της περικλειόμενης γεωμετρίας όπως φαίνεται στην Εικόνα 7.15. Για το λόγο αυτό χρησιμοποιούμε σε πολλές περιπτώσεις χωρική κατάτμηση. Με τη χωρική κατάτμηση είναι δυνατόν να αυξηθεί η αποτελεσματικότητα με την οποία καθορίζεται η ορατότητα ενός μεγάλου αριθμού αντικειμένων οργανώνοντάς τα σε μια δομή της οποίας οι ιδιότητες επιτρέπουν μεγάλες περιοχές του χώρου να αποκοπούν από το ορατό σύνολο της γεωμετρίας με τη χρήση πολύ απλούστερων ελέγχων. Συνήθως εφαρμόζουμε κάποιον από τους τρόπους που αναφέρθηκαν (BSPtrees και Octrees) ώστε να χειριστούμε την περικοπή.
Και οι δύο μέθοδοι, συχνά, εφαρμόζονται μόνο σε στατική γεωμετρία του τρισδιάστατου περιβάλλοντος. Αν ένας κόμβος σε μια δενδρική δομή περιέχει ένα ιεραρχικό παρακλάδι κόμβων που εκφράζουν κίνηση, τα όρια του περιβάλλοντος όγκου του πρέπει να διευθετούνται δυναμικά κάθε φορά που αλλάζουν τα όρια κάποιου από τα παιδιά του. Ο επανυπολογισμός των ορίων των κόμβων γεωμετρίας απαιτεί τουλάχιστον την επαναληπτική καταγραφή της μέγιστης και ελάχιστης συντεταγμένης στους τρεις άξονες για κάθε κόμβο. Για τα υποδέντρα κόμβων κίνησης που πρέπει να υπάρξει επαναληπτική επεξεργασία στα ακατέργαστα δεδομένα τους ούτως ή άλλως (πχ. Σκελετική Κίνηση), αυτό δεν επιβάλλει πρόσθετη δουλειά. Για την κίνηση στερεών σωμάτων, ο επανυπολογισμός σπαταλά αρκετό χρόνο και μπορεί να είναι απαγορευτικός για μεγάλα μοντέλα. Στη συνέχεια θα δούμε πώς λειτουργούν οι τρόποι χωρικής κατάτμησης αυτοί.
Ας υποθέσουμε ότι όλη η γεωμετρία που ανήκει σε έναν κόσμο ή σε μια συγκεκριμένη περιοχή του κόσμου περιέχεται μέσα σε ένα ορθογώνιο πλαίσιο Π, όπως στην Εικόνα 7.16. Ένα Octree είναι μία δομή που κατατέμνει αυτό το πλαίσιο σε οκτώ μικρότερα, ιδίου μεγέθους ορθογώνια κουτιά που ονομάζουμε οκταμόρια (Π111-Π222). Αυτά τα μικρότερα κουτιά υποδιαιρούνται περαιτέρω σε οκτώ ακόμη μικρότερα οκταμόρια, και η διαδικασία συνεχίζεται σε κάποιο μέγιστο αριθμό επαναλήψεων που ονομάζεται το βάθος του Octree. Κάθε οκταμόριο συνδέεται με το πλαίσιο από το οποίο υποδιαιρέθηκε, και κάθε αντικείμενο στον κόσμο συνδέεται με το μικρότερο οκταμόριο που το περιέχει πλήρως (που μπορεί να είναι το αρχικό πλαίσιο Π).
Η Εικόνα 7.17 (α) απεικονίζει το ανάλογο ενός Octree στο δισδιάστατο χώρο, που ονομάζεται τετραδικό δένδρο (quadtree), και κατασκευάστηκε για μια περιοχή που περιέχει ένα μόνο αντικείμενο. Η Εικόνα 7.17 (β) δείχνει πώς είναι οργανωμένη η αντίστοιχη δομή δεδομένων. Κάθε κόμβος σε μια δομή τετραδικού δένδρου έχει το πολύ τέσσερις υποκόμβους - τα Οctrees μπορεί να έχουν μέχρι και οκτώ.
Καθώς αυτό το παράδειγμα επιδεικνύει, αν καμια γεωμετρία του κόσμου δεν τέμνει ένα τεταρτημόριο (ή ένα οκταμόριο σε Octree), τότε αυτό το τεταρτημόριο δεν υποδιαιρείται. Επιπλέον, κάθε τεταρτημόριο που δεν περιέχει απολύτως κανένα αντικείμενο, διαγράφεται από το δέντρο. Πάντα υποθέτουμε ότι τα τεταρτημόρια που δεν συμπεριλαμβάνονται είναι άδεια.
Η οργάνωση της γεωμετρίας σε μια δομή δέντρου έχει το πλεονέκτημα ότι κάθε φορά που προσδιορίζουμε ότι ένας κόμβος του δέντρου δεν είναι ορατός, τότε ξέρουμε αμέσως ότι κάθε κόμβος-παιδί του εν λόγω κόμβου δεν είναι επίσης ορατός και μπορεί αυτόματα να είναι περικοπεί. Ο καθορισμός ορατότητας για ένα Octree αρχίζει ελέγχοντας το πλαίσιο γύρω από τον κόμβο της ρίζας για τομή με τον όγκο θέασης της κάμερας. Εάν η κάμερα είναι γνωστό ότι κείται πάντοτε εντός των ορίων του Octree, τότε μπορεί να θεωρηθεί ότι ο κόμβος ρίζας είναι πάντοτε ορατός. Όταν ο με βάση τον περιβάλλοντα όγκο (AABB ή OABB) του κάθε κόμβου κριθεί πως το αντικείμενο είναι ορατό, τότε ελέγχουμε όλα τα αντικείμενα που συνδέονται με αυτόν τον κόμβο ως προς την ορατότητά τους, με τον ίδιο τρόπο. Στη συνέχεια, εκτελούμε τον ίδιο έλεγχο για όλους τους υποκόμβους του ορατού κόμβου. Όταν το ο περιβάλλων όγκος ενός κόμβου αποτυγχάνει στον έλεγχο ορατότητας μπορούμε να αγνοήσουμε όλα τα αντικείμενα που συνδέονται με τον κόμβο αυτόν και τυχόν υπόκομβους του.
Ένα Δυαδικό Δέντρο Χωρικής Κατάτμησης (Binary Space Partition – BSPtree ) αποτελεί μια δομή που χωρίζει το χώρο σε δύο υποπεριοχές σε κάθε επίπεδο. Σε αντίθεση με τα επίπεδα κατάτμησης τα Octrees που είναι προσανατολισμένα ως προς τους άξονες του κόσμου, τα επίπεδα κατάτμησης σε ένα δέντρο BSP μπορεί να έχουν αυθαίρετο προσανατολισμό. Ένα δέντρο BSP κατασκευάζεται για ένα σύνολο από αντικείμενα επιλέγοντας ένα επίπεδο κατάτμησης, που μερικές φορές ονομάζεται επίπεδο διαίρεσης, και διαχωρίζοντας τις γεωμετρίες σε δύο ομάδες: αντικείμενα που βρίσκονται στη θετική πλευρά του επιπέδου (που ονομάζεται, επίσης, ο θετικός ημιχώρος) και τα αντικείμενα που βρίσκονται στην αρνητική πλευρά του επιπέδου (αρνητικός ημιχώρος).
Τυπικά, τα επίπεδα κατάτμησης ενός BSP δέντρου έχουν ευθυγραμμιστεί με το πολύγωνα που συνθέτουν τον κόσμο της γεωμετρίας. Η Εικόνα 7‑18 απεικονίζει ένα δισδιάστατο παράδειγμα μιας περιοχής που περιλαμβάνει διάφορα πολύγωνα που καθορίζουν τη δομή του δέντρου BSP. Ένα πολύγωνο επιλέγεται να αντιπροσωπεύει το επίπεδο διάσπασης σε κάθε επίπεδο του δέντρου, και τα υπόλοιπα πολύγωνα ταξινομούνται σε θετικές και αρνητικές ομάδες. Τυχόν πολύγωνα που τέμνουν το επίπεδο διαίρεσης χωρίζονται σε δύο πολύγωνα που βρίσκονται το καθένα στο θετικό και αρνητικό ημιχώρο αντίστοιχα. Οι θετικές και αρνητικές ομάδες τότε κατατέμνονται, και η διαδικασία συνεχίζεται για κάθε ημιχώρο μέχρις ότου δεν απομένει κανένα πολύγωνο.
Ο μεγάλος αριθμός των πολυγώνων και καμπύλων επιφανειών που χρησιμοποιούνται στις σύγχρονες μηχανές 3D κάνει το παραδοσιακό δέντρο BSP να μην είναι πλέον πρακτικό. Σε μια κάπως διαφορετική προσέγγιση, δημιουργούμε μια διαίρεση για κάθε αντικείμενο αντί για κάθε πολύγωνο. Όπως παρουσιάζεται στην Εικόνα 7.19, το επίπεδο διαχωρισμού για ένα αντικείμενο είναι ευθυγραμμισμένο έτσι ώστε να είναι κάθετο προς τον κύριο άξονα T του αντικειμένου που αντιστοιχεί στη μικρότερη διάσταση του OABB του.
Αυτό ελαχιστοποιεί την απόσταση που το αντικείμενο εκτείνεται μακριά από το επίπεδο διαίρεσης.
Αφού ένα επίπεδο διαίρεσης έχει επιλεγεί για ένα αντικείμενο, τα υπόλοιπα αντικείμενα ταξινομούνται σε δύο ομάδες: σε εκείνα που είναι μέσα στα πλαίσια του θετικού υποχώρου και εκείνα που είναι μέσα στα πλαίσια του αρνητικού υποχώρου. Τυχόν αντικείμενα που τέμνουν το επίπεδο διαίρεσης προστίθενται και στη θετική και στην αρνητική ομάδα. Οι υποχώροι στη συνέχεια κατατέμνονται αναδρομικά μέχρι να μην υπάρχουν αντικείμενα που δεν ανήκουν σε κάποιον υποχώρο.
Για κάθε επίπεδο διαίρεσης ενός δέντρου BSP, θα πρέπει να καθοριστεί η ορατότητα του κάθε υποχώρου και η ορατότητα κάθε αντικειμένου που σχετίζεται με επίπεδο. Αυτό προϋποθέτει ότι έχουμε έναν τρόπο να ελέγξουμε αν ένα επίπεδο Κ τέμνει τον όγκο θέασης της κάμερας. Η απλούστερη προσέγγιση θα ήταν να ελέγξουμε τις συντεταγμένες των οκτώ κορυφών του όγκου θέασης στο σύστημα συντεταγμένων του κόσμου σε σχέση με το επίπεδο K υπολογίζοντας τα τετραδιάστατα εσωτερικά γινόμενα τους και συγκρίνοντάς τα με το μηδέν. Εάν όλα τα οκτώ εσωτερικά γινόμενα έχουν το ίδιο πρόσημο (που σημαίνει ότι όλα τα οκτώ σημεία βρίσκονται στην ίδια πλευρά του επιπέδου), τότε το επίπεδο δεν τέμνει την όγκο θέασης. Ευτυχώς, μπορούμε να βρούμε μια καλύτερη μέθοδο μετασχηματίζοντας το επίπεδο Κ σε ομογενή χώρο περικοπής και χρησιμοποιώντας την κυβική συμμετρία του όγκου θέασης σε αυτό το χώρο.
Απαιτητικές εφαρμογές ή πολλαπλών-χρηστών/πολλαπλών-οθονών χρειάζονται να κατανέμουν τα δεδομένα του γράφου σκηνής και να τα σχεδιάζουν σε πολλαπλούς επεξεργαστές χωρίς να είναι απαραίτητο η σκηνή να βρίσκεται σε κοινό χώρο στη μνήμη. Ένας επεξεργαστής μπορεί να είναι:
Στις σύγχρονες κάρτες γραφικών, οι επεξεργαστές υποστηρίζουν την παράλληλη επεξεργασία πολλών αντικειμένων και δομών αναπαράστασης μιας σκηνής κάνοντας χρήση πολλαπλών πυρήνων. Για να εκτελεστεί κατανεμημένα η σχεδίαση μιας σκηνής, σε κάθε καρέ ανανέωσης της εικόνας η διαδικασία απεικόνισης μιας συνθετικής αναπαράστασης αποτελείται από 4 στάδια:
Μια διαδικασία κατανεμημένης σχεδίασης μιας σκηνής χωρίζεται σε 3 κατηγορίες ανάλογα με τον τρόπο χειρισμού της κατανομής:
Στην περίπτωση της κατανομής στο πεδίο του τρισδιάστατου χώρου τα στάδια εκτελούνται ως εξής:
Οι ενδιάμεσες εικόνες-αποτελέσματα δεν είναι ταξινομημένες ως προς το βάθος οπότε επικαλύπτονται στο χώρο της εικόνας. Επομένως, οι προκύπτοντες τμηματικοί καταχωρητές εικόνας δεν μπορούν να συνδυαστούν άμεσα. Για το λόγο αυτό συνήθης πρακτική είναι η διατήρηση και μετάδοση των καταχωρητών βάθους κάθε τμήματος και η σχεδίαση με βάση το συγκριτικό βάθος μεταξύ όλων των τμημάτων. Οι διαδικασίες κατανεμημένης σχεδίασης, ονομάζονται μετα-ταξινόμηση (post-ordering) γιατί η απόφαση για το ποιο μέρος της τελικής εικόνας προκύπτει από ποιο κόμβο συμβαίνει στο τέλος της παραγωγής του καρέ (Εικόνα 7.20).
Η περίπτωση της κατανομής στο πεδίο του χρόνου μπορεί να εφαρμοστεί μόνο σε έμμεσες απεικονίσεις (offline) που δεν γίνονται σε πραγματικό χρόνο.
Στην περίπτωση της κατανομής στο πεδίο της εικόνας, το σύστημα εκτελεί διαδικασίες προ-ταξινόμησης. Οι στρατηγικές προ-ταξινόμησης στο χώρο εικόνας είναι πιο κοινές. Η βάση δεδομένων της σκηνής αντιγράφεται στους επεξεργαστές, ή μοιράζεται από πολλαπλές διεργασίες που εκτελούν τη σχεδίαση. Σε κάθε επεξεργαστή ανατίθενται ένα ή περισσότερα τμήματα της τελικής εικόνας. Τα αποτελέσματα συντίθενται με την αντιγραφή των τμημάτων εικόνας σε έναν κοινό καταχωρητή.
Η κατανεμημένη σχεδίαση σε πραγματικό χρόνο που εκτελείται σε πολλαπλά συστήματα γραφικών στην ίδια μηχανή διαχειρίζεται από το υλικό των οθονών ενώ στην περίπτωση της έμμεσης (offline) σχεδίασης συνθετικής κίνησης κάθε επεξεργαστής διατηρεί ένα πλήρες αντίγραφο της βάσης δεδομένων της σκηνής καθώς και εξωτερικά χαρακτηριστικά (υφές). Με βάση τα παραπάνω οι τα στάδια της απεικόνισης υλοποιούνται ως ακολούθως:
7.9. Προτεινόμενες Ασκήσεις και Προβλήματα |
|
Άσκηση 1)
Άσκηση 2)
Άσκηση 3)
Άσκηση 4)
Άσκηση 5)
|