Γραφικά με Υπολογιστές Κίνηση - Αλληλεπίδραση
Κίνηση στη VRML Η VRML δεν είναι μια στατική γλώσσα. Είναι μια κινούμενη, αλληλεπιδραστική γλώσσα, η οποία μπορεί να λάβει μηνύματα και να προκαλέσει διαφορετικά αποτελέσματα. Απαιτείται, λοιπόν, κάποιο είδος εσωτερικού μηχανισμού εκτέλεσης για να καθοριστεί πώς και με ποια σειρά τα πράγματα αλλάζουν. Αυτό γίνεται με τη σύνδεση (wiring) των κόμβων του εικονικού κόσμου κατά μήκος των οποίων μπορούν να ταξιδεψουν τα διάφορα μηνύματα. 2/ 22
Events και Routes Για να δημιουργήσετε δυναμικές σκηνές μπορείτε να συνδέσετε κόμβους μεταξύ τους. Μία τέτοια σύνδεση θα μας έδινε τη δυνατότητα για παράδειγμα να ανάψουμε ένα φως ή να ακούσουμε έναν ήχο κάνοντας κλικ πάνω σε ένα αντικείμενο. Μία VRML σύνδεση χρειάζεται: Δύο κόμβους Μία διαδρομή ROUTE μεταξύ των δύο κόμβων Από τη στιγμή που έχει γίνει η σύνδεση, ο πρώτος κόμβος μπορεί να στείλει ένα μήνυμα στο δεύτερο κόμβο μέσω της διαδρομής ROUTE. Ένα τέτοιο μήνυμα ονομάζεται event και περιέχει μία τιμή η οποία είναι ίδιου τύπου με τις μεταβλητές των αντίστοιχων πεδίων 3/ 22
Είσοδοι και Έξοδοι κόμβων Οι περισσότεροι κόμβοι στη VRML έχουν εισόδους και εξόδους που τους επιτρέπουν να επικοινωνήσουν με άλλους κόμβους eventin: Ένα eventin είναι ένα πεδίο (field) ενός κόμβου το οποίο δέχεται events όταν είναι συνδεδεμένο σε ένα ROUTE. eventout: Ένα eventout είναι ένα πεδίο (field) ενός κόμβου το οποίο στέλνει events όταν είναι συνδεδεμένο σε ένα ROUTE. exposedfield: Κάθε πεδίο τύπου exposedfield έχει μία υπονοούμενη είσοδο (eventin) και μία υπονοούμενη έξοδο (eventout). Αν το όνομα του πεδίου είναι ΧΧΧ τότε η είσοδος θα ορίζεται ως set_xxx (μπορεί επίσης να χρησιμοποιηθεί και το όνομα του πεδίου ΧΧΧ) και η έξοδος ως ΧΧΧ_changed 4/ 22
Παράδειγμα Κόμβου Collision { children [] #exposedfield MFNode proxy #field SFNode addchildren #eventin MFNode removechildren #eventin MFNode collidetime #eventout SFTime } Το πεδίο children είναι exposedfield. Επομένως έχει eventin: set_children (ή children) eventout: children_changed 5/ 22
Σύνδεση Μεταξύ Κόμβων Μπορούμε να συνδέσουμε δύο κόμβους με τη βοήθεια της εντολής ROUTE. Η σύνταξη της εντολής ROUTE είναι η εξής: ROUTE όνομα_κόμβου1.eventout TO όνομα_κόμβου2.eventin 6/ 22
Επικοινωνία Κόμβων 7/ 22
Animation Μπορούμε να δημιουργήσουμε animation αλλάζοντας τη θέση, τον προσανατολισμό ή το μέγεθος οποιαδήποτε συστήματος συντεταγμένων Για να δημιουργήσουμε ένα animation απαιτούνται δύο στοιχεία: Ένα ρολόι Ένα μηχανισμό περιγραφής που θα καθορίζει το πώς γίνονται οι αλλαγές κατά τη διάρκεια του animation 8/ 22
9/ 22 Animation (Συνέχεια) Μπορούμε να δημιουργήσουμε ένα ρολόι χρησιμοποιώντας τον κόμβο TimeSensor ενώ για την περιγραφή των αλλαγών που συμβαίνουν κατά τη διάρκεια του animation μπορούμε να χρησιμοποιήσουμε τους κόμβους PositionInterpolation και OrientationInterpolation. Καιοιδύοαυτοίκόμβοι χρησιμοποιούν πληροφορίες από το ρολόι για να καθορίσουν την κατάλληλη θέση ή προσανατολισμό. Για να δημιουργήσουμε ένα animation χρησιμοποιούμε τη ROUTE εντολή της VRML για να συνδέσουμε την έξοδο ενός κόμβου TimeSensor με την είσοδο ενός κόμβου PositionInterpolator ή OriantationInterpolator. Στη συνέχεια χρησιμοποιούμε μία ακόμα ROUTE σύνδεση για να συνδέσουμε την έξοδο του Interpolator με την είσοδο του κόμβου Transform.
ΟκόμβοςTimeSensor Time Sensor{ enabled starttime stoptime cycleinterval loop isactive time cycletime fraction_changed } #exposedfield #exposedfield #exposedfield #exposedfield #exposedfield #eventout #eventout #eventout #eventout 10 / 22
TimeSensor (συνέχεια) Γιατηδημιουργίατουanimation ο TimeSensor μπορεί να χρησιμοποιεί πραγματικό χρόνο. Ωστόσο συνήθως είναι πιο βολικό να δημιουργούμε animation τα οποία είναι ανεξάρτητα του πραγματικού χρόνου. Γι αυτό σε αυτές τις περιπτώσεις χρησιμοποιούμε fractional time. To animation ξεκινάει όταν ο fractional time είναι 0.0 και ολοκληρώνεται όταν είναι 1.0. Το πεδίο cycleinternal καθορίζει τη διάρκεια του animation. Δηλαδή πόσα δευτερόλεπτα θα χρειαστεί ο fractional time γιαναγίνειαπό0.0 σε 1.0. Το eventout fraction_changed στέλνει fractional time τιμές μεταξύ 0.0 και 1.0 καθώς το animation εξελίσσεται. 11 / 22
TimeSensor (συνέχεια) Το eventout fraction_changed στέλνει fractional time τιμές μεταξύ 0.0 και 1.0 καθώς το animation εξελίσσεται. 12 / 22
PositionInterpolator PositionInterpolator{ key [ ] keyvalue [ ] set_fraction value_changed } #exposedfield #exposedfield #eventin #eventout 13 / 22
PositionInterpolator(Συνέχεια) Ο positioninterpolator χρησιμοποιεί γραμμική παρεμβολή για τον καθορισμό της θέσης ενός αντικειμένου. Αυτό που χρειάζεται να καθορίσουμε σε έναν τέτοιο κόμβο είναι τις τιμές των κλειδιών και τη θέση του αντικειμένου που αντιστοιχεί σε αυτές τις χρονικές στιγμές. Το πεδίο key περιέχει τα κλειδιά σε fractional time Το πεδίο keyvalue περιέχει τις θέσεις του αντικειμένου σε (X,Y,Z) που αντιστοιχούν σε αυτά τα κλειδιά. Με το eventin set_fraction δέχεται την τιμή του fractional time από το ρολόι. Καθώς δέχεται την τιμή του χρόνου υπολογίζει τη νέα θέση με βάση τις τιμές των key και keyvalue και στέλνει τη νέα τιμή με το value_changed eventout. 14 / 22
OrientationInterpolator OrientationInterpolator{ key [ ] keyvalue [ ] set_fraction value_changed } #exposedfield #exposedfield #eventin #eventout Ισχύουν τα ίδια όπως και με τον position με τη μόνη διαφορά ότι κάθε τιμή του keyvalue καθορίζεται από τέσσερις μεταβλητές: Τρεις για τον καθορισμό του άξονα περιστροφής (X,Y,Z) και μία για τη δήλωση της γωνίας περιστροφής. 15 / 22
Animation - Scaling Για να δημιουργήσουμε ένα animation στο οποίο θα αλλάζουμε το μέγεθος ενός αντικειμένου, μπορούμε να χρησιμοποιήσουμε τον PositionInterpolator συνδέοντας όμως την έξοδο του με το πεδίο scale του κόμβου Transform. 16 / 22
Άσκηση 1 Δημιουργήστε ένα animation χρησιμοποιώντας τον κλόουν του αρχείου clown.wrl. O κλόουν να ταλαντώνεται μεταξύ της θέσης x=-5 και x=5. Ο χρόνος που απαιτείται για να διανύσει το διάστημα [-5, 5] είναι 0,5 fractional time. To animation να διαρκεί 5 seconds. 17 / 22
Αλληλεπίδραση Για να προσθέσουμε αλληλεπίδραση στη σκηνή μας πρέπει να εισάγουμε έναν αισθητήρα (sensor) ο οποίος θα αντιλαμβάνεται τις ενέργειες του χρήστη που εκτελούνται με τη βοήθεια του ποντικιού. Τέτοιοι αισθητήρες είναι: TouchSensor SphereSensor CylinderSensor PlaneSensor 18 / 22
ΟΑισθητήραςTouchSensor Ο αισθητήρας TouchSensor ανιχνεύει την κίνηση του ποντικιού πάνω σε ένα αντικείμενο TouchSensor{ enabled isactive isover touchtime hitpoint_changed hitnormal_changed hittexcoord_changed } 19 / 22
TouchSensor(Συνέχεια) Ότανοχρήστηςμετακινείτοποντίκιπάνωσεένα αντικείμενο τότε ο αισθητήρας στέλνει σαν έξοδο TRUE μέσω του eventout isover. Η θέση του ποντικιού (σε 3Δ συντεταγμένες) πάνω στο αντικείμενο στέλνονται με τη βοήθεια του eventout hitpoint_changed. Όταν ο χρήστης πατήσει το κουμπί του ποντικιού το eventout isactive εκπέμπει την τιμή ΤRUE. Η ακριβής ώρα είναι επίσης διαθέσιμη μέσω του eventout touchtime. 20 / 22
21 / 22 ΟΑισθητήραςPlaneSensor Ο αισθητήρας PlaneSensor ανιχνεύει το σύρσιμο του ποντικιού και δημιουργεί μετατοπίσεις κατά μήκος του ενός 2Δ επιπέδου. PlaneSensor{ enabled autooffset offset maxposition minposition isactive translation_changed trackpoint_changed } To isactiveστέλνει true/false όταν το κουμπί του ποντικιού πατιέται ή απελευθερώνεται αντίστοιχα Το translation_changed στέλνει τη μετατόπιση κατά τη διάρκεια του συρσίματος (draging)
ΟΑισθητήραςSphereSensor Ένας SpereSensor κόμβος ανιχνεύει το σύρσιμο (drag) του ποντικιού και δημιουργεί περιστροφές σαν να περιστρεφόταν μία μπάλα. SphereSensor { enabled autooffset offset isactive rotation_changed trackpoint_changed } To isactiveστέλνει true/false όταν το κουμπί του ποντικιού πατιέται ή απελευθερώνεται αντίστοιχα Το rotation_changed στέλνει τις αλλαγές της περιστροφής 22 / 22
23 / 22 ΟΑισθητήραςCylinderSensor Ένας CylinderSensor κόμβος ανιχνεύει το σύρσιμο (drag) του ποντικιού και δημιουργεί περιστροφές σαν να περιστρεφόταν ένας κύλινδρος. CylinderSensor { enabled diskangle autooffset offset maxangle minangle isactive rotation_changed trackpoint_changed } To isactiveστέλνει true/false όταν το κουμπί του ποντικιού πατιέται ή απελευθερώνεται αντίστοιχα Το rotation_changed στέλνει τις αλλαγές της περιστροφής