ηµιουργία µετάδοση και ανακατασκευή τρισδιάστατων γραφικών στο διαδίκτυο µε χρήση JAVA και



Σχετικά έγγραφα
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΑ ΕΡΓΑΛΕΙΑ ΓΙΑ ΤΟ ΔΙΑΔΙΚΤΥΟ

2.1 Αντικειµενοστρεφής προγραµµατισµός

Γραφικά με Υπολογιστές. Κίνηση - Αλληλεπίδραση

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

Γραφικά με Υπολογιστές. Εισαγωγή στη VRML

HelloApplet. Παύλος Εφραιμίδης Java Applets 1

Αντικειµενοστρεφής Προγραµµατισµός

Εργαλεία του JDK. Β.1 Εργαλεία του JDK. Β.2 Μεταγλωττιστής javac. Τα πιο βασικά εργαλεία του JDK είναι τα παρακάτω.

Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία Πέτσιος Κων/νος Στέφανος Σαλτέας Καλογεράς Παναγιώτης. Threads in Java ΝΗΜΑΤΑ ΣΤΗ JAVA

Γραφικά µε Υπολογιστές. Μετασχηµατισµοί Σύνθετη Γεωµετρία

Τεχνικές σχεδίασης προγραμμάτων, Προγραμματιστικά Περιβάλλοντα

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

Εργαλεία ανάπτυξης εφαρμογών internet Ι

ηµιουργία ιαλογικών Προγραµµάτων για το Web

Α. Ερωτήσεις Ανάπτυξης

ΣΧΕΔΙΑΣΜΟΣ ΚΑΙ ΑΝΑΠΤΥΞΗ ΙΣΤΟΤΟΠΩΝ

Οδηγίες σχεδίασης στο περιβάλλον Blender

Points, Lines, Polygons

ΙΑ ΡΑΣΤΙΚΟΤΗΤΑ Σε ΤΡΙΣ ΙΑΣΤΑΤΟΥΣ ΕΙΚΟΝΙΚΟΥΣ ΚΟΣΜΟΥΣ ΕΠΕΚΤΑΣΕΙΣ ΓΛΩΣΣΑΣ STEDEL

Νήµαταστην Java. Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων. Κατανεµηµένα Συστήµατα 11-1

7.11 Πρωτόκολλα εφαρµογής

Σχεδίαση και Ανάπτυξη Ιστότοπων

ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD

Αντικειμενοστρεφής Προγραμματισμός

6. Εισαγωγή στον προγραµµατισµό

User Interactivity Nodes

7.11 Πρωτόκολλα Εφαρµογής Βασικές και Προηγµένες Υπηρεσίες ιαδικτύου. Ηλεκτρονικό Ταχυδροµείο. Τεχνολογία ικτύων Επικοινωνιών ΙΙ

ΚΕΦΑΛΑΙΟ 6 - ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

7.2 Τεχνολογία TCP/IP

ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ

4. Συντακτικό μιας γλώσσας είναι το σύνολο των κανόνων που ορίζει τις μορφές με τις οποίες μια λέξη είναι αποδεκτή.

ΠΟΛΥΜΕΣΑ ΣΤΟ ΙΑ ΙΚΤΥΟ

ΚΕΦΑΛΑΙΟ Web Services

ΕΠΛ 012 Εισαγωγή στο Παγκόσμιο Πλέγμα Πληροφοριών

ίκτυα - Internet Υπηρεσίες Internet O Παγκόσµιος Ιστός (World Wide Web) Ηλεκτρονική Αλληλογραφία ( ) Υπηρεσία FTP (File Transfer Protocol)

Γενικές Αρχές. Τεχνολογία ικτύων Επικοινωνιών ΙΙ

Προγραμματισμός Ι (HY120)

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Γενικά (για τις γραπτές εξετάσεις)

Σχήµα 6.1: Εισαγωγή της εντολής Read From Spreadsheet File στο Block Diagram.

Κεφάλαιο 7. ΕΠΑΛ Σύμης Εφαρμογές πληροφορικής Ερωτήσεις επανάληψης

Special edition of the Technical Chamber of Greece on Video Conference Services on the Internet, PIRCH 32 v0.92b

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Κεφάλαιο 10 ο Υποπρογράµµατα

Σύστηµα µετάδοσης µετεωρολογικών δεδοµένων σε πραγµατικό χρόνο µέσω του Internet

Εισαγωγή στην Πληροφορική

World Wide Web: Ο παγκόσµιος ιστός Πληροφοριών

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

Η Υλοποίηση της Επικοινωνίας. Κατανεµηµένα Συστήµατα

Ανάπτυξη Plugins για το AgentSheets

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

WIRELESS SENSOR NETWORKS (WSN)

Οντοκεντρικός Προγραμματισμός

Κλάσεις και Αντικείµενα

Σε αυτό το µάθηµα θα ασχοληθούµε µε τη βελτίωση της εµφάνισης ενός ιστοτόπου, αλλά και τον εύκολο χειρισµό όλων των αλλαγών στην εµφάνιση της σελίδας

Επεξεργασία Αρχείων Κειµένου

Μαλούτα Θεανώ Σελίδα 1

Τι είναι ένα δίκτυο υπολογιστών; Αρχιτεκτονική επιπέδων πρωτοκόλλων. Δικτυακά πρωτόκολλα

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

Πρωτόκολλα Επικοινωνίας και Τείχος Προστασίας

Πρόγραμμα Πιστοποίησης Γνώσεων και Δεξιοτήτων H/Y ΕΝΟΤΗΤΑ 1: «ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ ΠΛΗΡΟΦΟΡΙΚΗΣ»

Λειτουργικό Σύστημα: διαχείριση πόρων. Τι είναι ένα αρχείο ; Διαχείριση αρχείων. Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

a = 10; a = k; int a,b,c; a = b = c = 10;

Λειτουργικά Συστήματα (Λ/Σ)

Ερωτήσεις- Απαντήσεις Πολυμέσα Απο το Βιβλίο Εφαρμογές Η/Υ Α,Β,Γ Λυκείου

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Εισαγωγή. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής

Ειδικά Θέματα Προγραμματισμού

Προγραμματισμός ΙI (Θ)

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

<<ΔΗΜΗΤΡΗΣ ΜΑΝΩΛΗΣ ΦΥΣΙΚΟΣ ΜCs>> 1

7.3 Πρωτόκολλο TCP. 1. Το TCP πρωτόκολλο παρέχει υπηρεσίες προσανατολισµένες σε σύνδεση. Σ Λ

ΗΜΙΟΥΡΓΙΑ ΠΑΙΧΝΙ ΙΟΥ ΣΤΟ SCRATCH ΒΗΜΑ ΠΡΟΣ ΒΗΜΑ

1 ο ΓΥΜΝΑΣΙΟ ΘΕΡΜΗΣ. Πληροφορική Α' Γυμν. Το Λειτουργικό Σύστημα του Υπολογιστή

ΠΡΟΤΕΙΝΟΜΕΝΑ ΘΕΜΑΤΑ ΣΤΑ ΔΙΚΤΥΑ ΥΠΟΛΟΓΙΣΤΩΝ ΙΙ Γ Τάξη Ε.Π.Α.Λ.

Ανάπτυξη Υπηρεσίας Τηλεκπαίδευσης σε ΙP Δίκτυα. Υλοποίηση Σύγχρονης Τηλεκπαίδευσης

Διαχείριση Πληροφοριών στο Διαδίκτυο. Εργαστήριο 1

ΠΛΗΡΟΦΟΡΙΚΗ Ι Εργαστήριο 1 MATLAB ΠΛΗΡΟΦΟΡΙΚΗ Ι ΕΡΓΑΣΤΗΡΙΟ 1. Θέμα εργαστηρίου: Εισαγωγή στο MATLAB και στο Octave

Κατανεμημένα Συστήματα

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

ΛΟΓΙΣΜΙΚΟ (software)

4 ο Εργαστήριο Τυχαίοι Αριθμοί, Μεταβλητές Συστήματος

Δομημένος Προγραμματισμός

Συνεχής ροή πολυµέσων

Χειρισµός Σφαλµάτων. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών Δίκτυα υπολογιστών. (και το Διαδίκτυο)

Μικροεπεξεργαστές. Σημειώσεις Μαθήματος Υπεύθυνος: Δρ Άρης Παπακώστας,

3 ο Εργαστήριο Μεταβλητές, Τελεστές

Σχολή Προγραµµατιστών Ηλεκτρονικών Υπολογιστών (ΣΠΗΥ) Τµήµα Προγραµµατιστών Σειρά 112

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Επιµέλεια Θοδωρής Πιερράτος

ΜΟΝΤΕΛΟ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΓΛΩΣΣΑ ΠΕΡΙΓΡΑΦΗΣ ΕΦΑΡΜΟΓΩΝ ΕΙΚΟΝΙΚΗΣ ΠΡΑΓΜΑΤΙΚΟΤΗΤΑΣ

Ιδιότητες αντικειμένων, συγγραφή κώδικα, συντακτικά λάθη

Transcript:

ηµιουργία µετάδοση και ανακατασκευή τρισδιάστατων γραφικών στο διαδίκτυο µε χρήση JAVA και VRML. ηµιουργία µετάδοση και ανακατασκευή τρισδιάστατων γραφικών στο διαδίκτυο µε χρήση JAVA και VRML.... 1 1.ΕΙΣΑΓΩΓΗ... 1 2.VRML... 6 ΒΑΣΙΚΗ ΘΕΩΡΙΑ 3... 8 ΚΟΜΒΟΙ...10 INTERPOLATION...15 VRML και ΗΧΟΣ...16 υναµική κίνηση αντικειµένων...24 3.JAVA...25 Τύποι εφαρµογών...25 Αυτόµατη συλλογή απορριµµάτων (automatic garbage collection)...30 Μικροεφαρµογές και ιστοσελίδες...31 ιαδικασία που ακολουθείται για να φορτωθεί µία µικροεφαρµογή...35 Νήµατα (Threads)...36 Θύρα...43 Υπηρεσία...43 Κλάσεις της Java για TCP πρίζες....45 Ασφάλεια µικροεφαρµογών...49 Ασφάλεια και περιορισµοί των µικροεφαρµογών...53 4.Σύνδεση VRML και JAVA...59 Ανταλλαγή πληροφοριών µε την σκηνή...63 Απόκτηση αναφοράς σε έναν κόµβο...64 Ανάγνωση τιµών από πεδία κόµβων της VRML σκηνής...64 Λήψη και αναγνώριση συµβάντων προερχόµενων από την VRML σκηνή...66 Αποστολή συµβάντων προς την VRML σκηνή...69 ηµιουργία σκηνών VRML µέσα από πρόγραµµα Java...71 5.ΠΕΡΙΓΡΑΦΗ ΕΦΑΡΜΟΓΗΣ...73 Συνάρτηση...84 Τύπος ορίσµατος...84 Λειτουργία...84 1.ΕΙΣΑΓΩΓΗ Η τεχνολογία στον τοµέα των γραφικών υπολογιστών κάνει συνεχή άλµατα. Τα τελευταία χρόνια έχει δοθεί ιδιαίτερη έµφαση στις εφαρµογές που σχετίζονται µε τρισδιάστατα γραφικά στο διαδίκτυο. 1

Τέτοιες εφαρµογές είναι η τηλεπαρουσίαση τρισδιάστατων µοντέλων, η τηλεσυνεργασία σε θέµατα τρισδιάστατων µοντέλων ή γραφικών (µεταξύ δύο συνεργαζόµενων σχεδιαστών ή µηχανικών), η αναπαράσταση τρισδιάστατων κόσµων στο δίκτυο, η µετάδοση κινούµενης εικόνας µε κωδικοποίηση βασισµένη στα τρισδιάστατα µοντέλα, τα τρισδιάστατα παιχνίδια στα οποία συµµετέχουν πολλοί χρήστες, η διαφήµιση στο δίκτυο κ. α. κόσµων Μέχρι και σήµερα χρησιµοποιούνται πολλά πρότυπα για την αποθήκευση των τρισδιάστατων γραφικών σε ψηφιακή µορφή, όπως τα αρχεία τύπου DXF για εφαρµογές CAD, τα αρχεία τύπου OFF (Object File Format) κ. α. Όµως, στη συνέχεια, καθώς ήταν όλο και περισσότεροι αυτοί που άρχισαν να ασχολούνται µε τρισδιάστατα γραφικά, άρχισαν να γίνονται εµφανή τα πρώτα προβλήµατα που σχετίζονταν µε την ασυµβατότητα µεταξύ των προγραµµάτων δηµιουργίας και απεικόνισης τρισδιάστατων γραφικών, την πλατφόρµα υπολογιστών στην οποία λειτουργούσαν, έγινε επιτακτική η ανάγκη υιοθέτησης ενός προτύπου το οποίο θα λύνει τα προβλήµατα συµβατότητας και θα µπορεί να χρησιµοποιηθεί από όλους. Την διέξοδο σε αυτά τα προβλήµατα ήρθε να δώσει η VRML. Η Virtual Reality Modeling Language (VRML) είναι µια γλώσσα που δίνει τη δυνατότητα αναπαράστασης τρισδιάστατων γραφικών που έχει σχεδιαστεί για να χρησιµοποιείται στο Internet, intranets, και local client systems, αλλά το σπουδαιότερο από όλα προσφέρει ένα παγκόσµιο 2

πρότυπο τυποποίησης. Μπορεί να ενσωµατωθεί σε µία ιστοσελίδα αλλά βέβαια για να απεικονιστεί ο κόσµος από τον εξεταστή VRML (που υπάρχει ενσωµατωµένος στον εξεταστή ιστοσελίδων ) θα πρέπει να υπάρχει το ή τα αντίστοιχα αρχεία στον τοπικό δίσκο. εν υπάρχει δηλαδή η δυνατότητα για ένα οπτικό αποτέλεσµα προς τον χρήστη παράλληλα µε την ροή των δεδοµένων του τρισδιάστατου µοντέλου µέσω του δικτύου (streaming). Ακόµη όµως και εάν αυτό γινόταν θα έπρεπε να περιοριστούµε σε streaming δεδοµένων που θα είχαν προαποθηκευτεί σε ένα αρχείο σε κάποιο σηµείο του διαδικτύου. Αυτό γενικά είναι και το µεγαλύτερο πρόβληµα στην χρησιµοποίηση 3D γραφικών στις περισσότερες εφαρµογές στο διαδίκτυο. Η VRML 2.0 παρέχει τρόπους για δυναµική δηµιουργία, µετατροπή, προσθήκη ή και διαγραφή αντικειµένων. Όπως το script node,και το ποιο «επίσηµο» EAI (External Authoring Interface), το οποίο µπορεί να χρησιµοποιηθεί για τη ροή πληροφορίας που αφορά τα χαρακτηριστικά και την κίνηση τρισδιάστατων αντικειµένων σε ένα κόσµο της VRML και προσφέρει ουσιαστικά τη σύνδεση και απευθείας επικοινωνία µε εξωτερικές applets. Το ΕΑΙ έχει υλοποιηθεί σε JAVA. Η Java, όµως, είναι µία πλήρης γλώσσα προγραµµατισµού που µπορεί να χρησιµοποιηθεί για την µετάδοση δεδοµένων µέσω δικτύου. Έτσι, αν συνδυαστούν οι δυνατότητες που προσφέρουν οι Java, ΕΑΙ και VRML µπορεί να αναπτυχθεί µία πληθώρα 3

εφαρµογών που βασίζονται στην µετάδοση και εικονοποίηση 3D γραφικών. Ένα από τα σηµαντικότερα πλεονεκτήµατα εφαρµογών που δηµιουργούνται µε Java, EAI και VRML είναι η δυνατότητα που προσφέρει κάθε µία από τις προηγούµενες προγραµµατιστικές γλώσσες (άρα και όλες µαζί συνδυαζόµενες) να λειτουργούν µε τον ίδιο τρόπο σε όλες τις πλατφόρµες υπολογιστών µια και όλες οι χρησιµοποιούµενες κλάσεις που απαιτούνται για την µετάφραση βρίσκονται στον html browser. Σκοπός της εργασίας αυτής ειναι η δηµιουργία, µετάδοση και η ανακατασκευή ενός εικονικού κόσµου δηλαδή τρισδιάστατου µοντέλου (ή συνόλου µοντέλων) που θα είχε πραγµατικά χαρακτηριστικά, όπως κίνηση και ήχος στο world wide web. Στο δεύτερο κεφάλαιο γίνεται µια αρκετά λεπτοµερής αναφορά στη γλώσσα µοντελοποίησης τρισδιάστατων γραφικών VRML στον τρόπο σύνταξής της και τις δυνατότητες για παραγωγή ζωντανών τρισδιάστατων κόσµων. Στο τρίτο κεφάλαιο αναφέρεται η γλώσσα προγραµµατισµού Java, ορισµένες δυνατότητές της και συγκεκριµένες λειτουργίες που σχετίζονται µε την εφαρµογή, όπως είναι η χρήση πριζών (sockets) για τη δηµιουργία επικοινωνιών µέσω δικτύου, η χρήση πολυνηµατικού κώδικα, δοµή και λειτουργία µικροεφαρµογών. 4

Στο κεφάλαιο τέσσερα αναφέρονται οι τρόποι σύνδεσης της VRML µε τη Java και γίνεται λεπτοµερής αναφορά στον τρόπο λειτουργίας του ΕΑΙ που έχει επιλεγεί για τη σύνδεσή τους στη συγκεκριµένη εφαρµογή. Στο πέµπτο κεφάλαιο γίνεται µια ολοκληρωµένη περιγραφή του συνολικού προγράµµατος πελάτηεξυπηρετητή σύµφωνα µε χρονικό διάγραµµα που αυτή εκτελείται. Και στο τέλος παρουσιάζονται τα αποτελέσµατα της εφαρµογής, καθώς και συµπεράσµατα και ιδέες για τη χρησιµοποίηση της τεχνικής που αναπτύξαµε. Το World Wide Web (WWW) είναι σήµερα η πιο σηµαντική υπηρεσία στο διαδίκτυο, λόγω της δυνατότητας ταυτόχρονης παρουσίασης κειµένου, γραφικών και multimedia που διαθέτει. Ωστόσο, η γλώσσα που χρησιµοποιείται για τη συγγραφή hypermedia κειµένων, η Hypertext Mark-Up Language (HTML), περιορίζει την απεικόνιση της πληροφορίας σε ένα δισδιάστατο πλαίσιο. Την ανάγκη απεικόνισης µιας τρισδιάστατης διεπιφάνειας, που προσεγγίζει πιο ρεαλιστικά τον πραγµατικό κόσµο δηµιουργήθηκε για να ικανοποιήσει η VRML, που έχει τη δυνατότητα να δηµιουργεί τρισδιάστατους κόσµους (worlds) και να τους ενσωµατώνει σε σελίδες WWW τρέχοντας πάνω σε πλατφόρµα Netscape Navigator ή Microsoft Internet Explorer. 5

2.VRML Η VRML ήταν η πρώτη προσπάθεια για την ύπαρξη ενός εργαλείου µε µία κοινή γλώσσα για την περιγραφή 3D κόσµων. Μετά από διάφορες προτάσεις την άνοιξη του 1994 στο πρώτο ετήσιο συνέδριο του WWW στην Γενεύη, όπου συζητήθηκε η υποστήριξη διεπιφανειών εικονικής πραγµατικότητας (Virtual Reality Ιnterfaces) στο World Wide Web και κατέληξαν στη διατύπωση των προδιαγραφών της έκδοσης 1.0., κατατέθηκαν αρκετές προτάσεις για την µορφή του αρχείου (file format), από τις οποίες επιλέχθηκε τελικά αυτή του Open Inventor της Silicon Graphics. Πάνω σε αυτό το format στηρίχθηκε η κατασκευή της VRML. Ωστόσο, οι κόσµοι που µπορούσε να δηµιουργήσει κανείς µε τη VRML 1.0 ήταν πολύ φτωχοί. Τα αντικείµενα ήταν "άψυχα", δεν υπήρχε καµία δυνατότητα αλληλεπίδρασης του χρήστη µε το εικονικό περιβάλλον. Αυτό είχε ως συνέπεια οι εικονικοί κόσµοι της VRML να µην έχουν καµία χρησιµότητα και να µοιάζουν µε απλές τρισδιάστατες απεικονίσεις γραφικών. Έτσι, έγινε φανερή η ανάγκη επέκτασης της γλώσσας, ώστε να µην περιγράφει απλά τρισδιάστατους χώρους, αλλά και να ορίζει τρόπους αλληλεπίδρασης µε το χρήστη. Για το σκοπό αυτό κατατέθηκαν εκ νέου προτάσεις, από τις οποίες τελικά δηµιουργήθηκαν οι προδιαγραφές (specifications) της VRML 2.0. Η VRML 2.0 σχεδιάστηκε έτσι ώστε να ικανοποιεί τα παρακάτω κριτήρια: Την ανάπτυξη προγραµµάτων ικανών για την δηµιουργία, σύνταξη και υποστήριξη VRML αρχείων 6

καθώς και προγραµµάτων αυτόµατης µετάφρασης άλλων συνηθισµένων αρχείων 3D τυποποίησης σε VRML αρχεία. Να παρέχει την δυνατότητα χρησιµοποίησης και συνδυασµού δυναµικών 3 αντικειµένων καθώς και την δυνατότητα επαναχρησιµοποίησης τους. Επεκτατότητα, δηλαδή την δυνατότητα να προσθεθούν τύποι αντικειµένων όχι σαφώς ορισµένων στην VRML. Ικανότητα υλοποίησης σε ευρεία ποικιλία συστηµάτων. Επιδόσεις αλληλεπίδρασης σε διάφορες πλατφόρµες προγραµµατισµού καθώς και την δυνατότητα δηµιουργίας αυθαίρετα µεγάλων δυναµικών 3δ κόσµων. Η VRML δίνει τη δυνατότητα µε ένα απλό editor να γράψει κανείς τους δικούς του τρισδιάστατους κόσµους µε απλές εντολές (σε σχέση µε άλλα πακέτα γραφικών), έχοντας µόνο κάποιες βασικές γνώσεις γραφικών. Οι έτοιµες δοµές που παρέχει επιτρέπουν τη σχεδίαση βασικών ή και πλέον περίπλοκων σχηµάτων και την παράθεση τους στο χώρο, καθώς και χρησιµοποίηση έτοιµων αντικειµένων. Τα αντικείµενα αυτά µπορούν να είναι ακριβή αντίγραφα πραγµατικών αντικειµένων που έχουν δηµιουργηθεί σε ειδικά εργαστήρια, είτε µε ειδικά βοηθητικά προγράµµατα δηµιουργίας 3δ γραφικών (π.x. Spazz 3d, cosmo 3d). Ακόµη, όπως και η HTML, είναι ανεξάρτητη από την πλατφόρµα εκτέλεσης, επιτρέπει δηλαδή τη χρήση ενός παγκόσµια αποδεκτού προτύπου για τον προγραµµατισµό, ανεξάρτητα από το hardware. Αποµένει στις εταιρείες πληροφορικής να κατασκευάζουν κατάλληλα προγράµµατα (π.χ. πρόσθετα για το πρόγραµµα Netscape, plug-ins [14]) που να διαβάζουν τη VRML και να απεικονίζουν τους κόσµους µέσα από ένα εξεταστή ιστοσελίδων. Για παράδειγµα µία έκδοση του Netscape ανώτερη του 4.5 και η έκδοση 2.1.1 του πρόσθετου Cosmo Player, παρέχουν πλήρεις δυνατότητες απεικόνισης των VRML κόσµων. Τέλος, σε περίπτωση που θέλουµε να προσθέσουµε 7

περισσότερες δυνατότητες και λειτουργικότητα στους VRML κόσµους µας, µπορούµε να χρησιµοποιήσουµε την Java και το EAI (External Authoring Interface). Η έκδοση 1.2 της Java είναι η ενδεδειγµένη σε µία τέτοια περίπτωση. ΒΑΣΙΚΗ ΘΕΩΡΙΑ 3 Η VRML χρησιµοποιεί ένα δεξιόστροφο σύστηµα συντεταγµένων. ηλαδή τα θετικά x είναι προς τα δεξιά, τα θετικά y είναι προς τα πάνω και τα θετικά z είναι προς την πλευρά του θεατή (δηλαδή από την οθόνη προς τον θεατή), όπως φαίνεται και στο σχήµα 2.1. y x z y Σχήµα 2.1 Το σύστηµα συντεταγµένων που χρησιµοποιεί η VRML. 8

Σε πεδία συντεταγµένων χρειάζεται πάντα να προσδιορίζονται και οι τρεις συντεταγµένες. Η σειρά ορισµού τους είναι πάντα η x y z, έχοντας µεταξύ τους ένα ή περισσότερα κενά. Η διεύθυνση που ορίζει ο άξονας z είναι αυτή που θεωρείται ως διεύθυνση παρακολούθησης και γενικά ως η προεπιλεγµένη διεύθυνση όταν δεν καθορίζεται κάποια άλλη. Ακόµη, οτιδήποτε και αν συµβεί σε ένα αντικείµενο µιας σκηνής (µετακίνηση περιστροφή κ.λ.π.), θεωρείται πάντα σε σχέση µε το κέντρο του αντικειµένου, µε εξαίρεση ορισµένες ειδικές περιπτώσεις που δεν ενδιαφέρουν άµεσα. Τώρα που ορίσαµε το σύστηµα συντεταγµένων που χρησιµοποιεί η VRML ας δούµε τι γίνεται όταν έχουµε µια οµάδα αντικειµένων και θέλουµε να τα χειριστούµε στο δικό τους σύστηµα συντεταγµένων. Για να διευκρινίσουµε αυτό το παράδειγµα ας δούµε το ηλιακό σύστηµα µε αρχή συντεταγµένων το ήλιο. Σ αυτή την περίπτωση οι τιµές των συντεταγµένων ( x, y, z ) για τους δεκατέσσερις δορυφόρους του ήλιου θα ήταν ιδιαίτερα µεγάλες και ιδιαίτερα δύσκολο για µας να τους διαχειριστούµε και να συντηρήσουµε. Αυτό που θέλουµε να κάνουµε είναι να ορίσουµε τον ήλιο και τους δορυφόρους του στο δικό τους σύστηµα συντεταγµένων, το οποίο στη συνέχεια θα εισάγουµε στο ηλιακό σύστηµα συντεταγµένων. Αυτού του τύπου το εντοπισµένο σύστηµα συντεταγµένων θα το ονοµάζουµε τοπικό σύστηµα συντεταγµένων. Χρησιµοποιώντας το τοπικό σύστηµα συντεταγµένων απλοποιούµε τη δηµιουργία σκηνών VRML,αφού µπορούµε να χτίσουµε και να δοκιµάσουµε κάθε κοµµάτι µιας σκηνής χωριστά και µετά να συναρµολογήσουµε όλη τη σκηνή σε ένα ενιαίο σύστηµα. Και άλλωστε µ αυτόν τον τρόπο κρατάµε και σε λογικό επίπεδο τους αριθµούς που χρησιµοποιούµε στη γεωµετρία 9

της σκηνής, δεδοµένου ότι αν χρησιµοποιούσαµε συντεταγµένες αναφορικά µε τον ήλιο θα έπρεπε να χρησιµοποιήσουµε αστρονοµικά νούµερα. ΚΟΜΒΟΙ Για την διευκόλυνση µας, η VRML παρέχει ένα σαφή τρόπο ορισµού αντικειµένων. Για να ορίσουµε ένα αντικείµενο στο χώρο χρειάζεται να ορίσουµε τη γεωµετρία, τη θέση, το χρώµα και το υλικό της επιφάνειάς του. Στη VRML αυτό γίνεται εύκολα µε τη χρήση των κόµβων(nodes). Ο κάθε κόµβος περιλαµβάνει ένα σύνολο από πεδία, τα οποία καθορίζουν τις βασικές ιδιότητες αυτού του κόµβου. Ένας κόµβος αποτελεί µια βασική δοµή, η οποία µπορεί να υπάρξει 10

µόνη της σε ένα VRML αρχείο. Η VRML διαθέτει 54 κόµβους. Αυτοί, ανάλογα µε τις λειτουργίες τους, χωρίζονται σε εννιά κατηγορίες. Αυτές είναι οι εξής: Κόµβοι οµαδοποίησης (grouping nodes), ειδικές οµάδες (special groups), απλοί κόµβοι (common nodes), αισθητήρες (sensors), κόµβοι γεωµετρίας (geometry), κόµβοι γεωµετρικών ιδιοτήτων (geometric properties), κόµβοι εµφάνισης (appearance), κόµβοι παρεµβολής (interpolators) και κόµβoι ένωσης (bindable nodes). Η VRML υποστηρίζει δύο κύριες κατηγορίες τύπων δεδοµένων, τα field και event. Τα βασικά αυτά δεδοµένα χρησιµοποιούνται σε όλους τους κόµβους (nodes) για τον ορισµό των αντικειµένων. Υπάρχουν δύο κλάσεις των παραπάνω τύπων. Η µία περιέχει field και event που έχουν µία µόνο τιµή, ενώ η άλλη περιέχει field και event που έχουν παραπάνω από µία τιµή, περιέχουν δηλαδή µία πλειάδα τιµών. Τα ονόµατα όλων των field και event που ανήκουν στην πρώτη κλάση ξεκινάει µε SF (singlevalue field) ενώ της δεύτερης µε MF (multi-value field). Οι τιµές των MF δεδοµένων γράφονται µέσα σε αγκύλες και τα δεδοµένα χωρίζονται µεταξύ τους µε κενά ή µε κόµµα. Ένα MF δεδοµένο µε µηδενικές τιµές γράφεται []. Για όλα τα δεδοµένα που είναι τύπου MF η αρχική τιµή είναι η []. Υπάρχουν δύο κατηγορίες πεδίων, τα απλά fields και τα exposedfields. Τα πρώτα ορίζουν την αρχική τιµή ενός node και είναι private, δηλαδή δεν µπορούν να αλλάξουν τιµή κατά τη διάρκεια εκτέλεσης του προγράµµατος. Αντίθετα, 11

τα exposedfields ορίζουν και αυτά την αρχική τιµή ενός node αλλά είναι public, δηλαδή µπορούν να αλλάξουν τιµή. Αυτό µας επιτρέπει κάποια nodes να µετατρέπουν την τιµή κάποιων πεδίων άλλων nodes. Κάθε node στην VRML µπορεί να λάβει και να στείλει events. Τα events που λαµβάνει ορίζονται σαν eventin, ενώ αυτά που µπορεί να λάβει ορίζονται σαν eventout. Το συµβάν εξόδου (eventout) που παράγεται από έναν κόµβο της VRML µπορεί να οδηγηθεί σαν συµβάν εισόδου σε έναν άλλον κόµβο µε την εντολή ROUTE. Αυτό αποτελεί µια πολύ χρήσιµη ιδιότητα της VRML, γιατί, όπως θα δούµε, µ αυτόν τον τρόπο συνδέονται τα διάφορα αντικείµενα ενός κόσµου. Η VRML χρησιµοποιεί µια δοµή δέντρου για κόµβους που περιέχονται σε µια σκηνή. Αυτό σηµαίνει ουσιαστικά ότι έχουµε µία λογική δοµή δέντρου, η οποία ξεκινά µε τον γονέα κόµβο, από τον οποίο µπορούµε να έχουµε άλλον ή άλλους κόµβους µε µία σχέση γονέα παιδιού, οι οποίοι µε τη σειρά τους µπορούν να αποτελούν γονέα κόµβο και ούτω καθεξής. Σε κάθε ένωση µεταξύ κόµβων υπάρχει ένας συσσωρευτικός κόµβος µετασχηµατισµού, ο οποίος αναφέρεται σε όλους. Υπάρχει δηλαδή µια οµαδοποίηση µεταξύ αυτών των κόµβων, η οποία είναι πολύ χρήσιµη σε περιπτώσεις που θέλουµε να έχουµε µια συνολική µετακίνηση ή περιστροφή πολλών αντικειµένων. 12

Αλλά για να γίνει αντιληπτό το νόηµα των παραπάνω είναι καλύτερα να παρουσιάσουµε ένα χαρακτηριστικό παράδειγµα: Παρακάτω φαίνεται σε δοµή δέντρου ένα µοντέλο ηλιακού συστήµατος. Αν θα θέλαµε να υλοποιήσουµε µε την ίδια δοµή σε VRML ο κώδικας θα είχε την παρακάτω µορφή: #VRML V2.0 utf8 DEF ROOTNODE Transform { children [ DEF SOL Transform { children Shape { appearance Appearance { material Material { diffusecolor 1 1 0 shininess 1 13

here } ] } } geometry Sphere { radius 5 } } } DEF TERRA Transform { translation 10 10 10 children [ DEF EARTH Transform { children Shape { appearance Appearance { material Material { diffusecolor 0 1 0 } } geometry Sphere { } } } DEF LUNA Transform { translation 1 1 1 children Shape { geometry Sphere { radius 0.5 } } } ] } DEF JUPITER Transform { children [ # Jupiter and it's 14 moons in } ] 14

Όπως µπορεί να φανεί σ αυτό το παράδειγµα, ο κώδικας είναι δοµηµένος σε πολλά τοπικά συστήµατα συντεταγµένων και κάθε µετασχηµατισµός που εφαρµόζεται σε κάθε transform κόµβο θα εφαρµόζεται και στα παιδιά του στην ίδια τοπική αρχή συντεταγµένων. Για παράδειγµα, αν εφαρµόσουµε ένα translation πεδίο στον transform κόµβο που ονοµάζεται TERRΑ, τότε όλα τα παιδιά (children) του κόµβου αυτού θα υποστούν αυτή τη µεταβολή. ηλαδή και η σφαίρα που την ονοµάσαµε µε την εντολή DEF EARTH και η σφαίρα LUNA θα µετασχηµατιστούν κατά την καθορισµένη ποσότητα. INTERPOLATION Οι interpolator nodes µας επιτρέπουν να κάνουµε γραµµική προσέγγιση µιας συνάρτησης. Υπάρχουν διάφορες κατηγορίες interpolators, όλοι όµως έχουν κοινά τα παρακάτω πεδία. Το <type> εξαρτάται από τον τύπο του interpolator που χρησιµοποιούµε και οι τιµές που δίνουµε θα πρέπει να είναι ανάλογου τύπου. exposedfield MFFloat key [...] exposedfield MF<type> keyvalue [...] eventin SFFloat set_fraction eventout [S M]F<type> value_changed Στο πεδίο key ορίζουµε τις τιµές που διαµερίζουν το πεδίο ορισµού της συνάρτησης. Στο πεδίο keyvalue εισάγουµε τις τιµές της άγνωστης συνάρτησης F που 15

θέλουµε να προσεγγίσουµε. Κάθε τιµή στο πεδίο key αντιστοιχεί σε µία τιµή στο πεδίο keyvalue. Στο set_fraction εισάγουµε µία τιµή και στο value_changed µας επιστρέφει την τιµή που προκύπτει από την προσέγγιση της F στο "σηµείο" set_fraction. Η τιµή που µας επιστρέφει εξαρτάται από τον τύπο του interpolator. Το πλήθος των τιµών του πεδίου key θα πρέπει να είναι ίσο µε το πλήθος των τιµών του πεδίου keyvalue. VRML και ΗΧΟΣ Η VRML δίνει τη δυνατότητα αναπαραγωγής αρχείων ήχου, επιβεβαιώνοντας ακόµα περισσότερο το σκοπό για τον οποίο αναπτύχθηκε, τη ρεαλιστική, δηλαδή, απεικόνιση της πραγµατικότητας. Μια πληθώρα παραµέτρων και πεδίων µέσα στα δύο βασικά nodes δίνουν την ευκαιρία στον προγραµµατιστή να ελέγχει πλήρως τον τρόπο µε τον οποίο θα ενσωµατωθεί ο ήχος µέσα στον VRML κόσµο. Sound node Sound { exposedfield SFVec3f direction 0 0 1 exposedfield SFFloat intensity 1 exposedfield SFVec3f location 0 0 0 exposedfield SFFloat maxback 10 exposedfield SFFloat maxfront 10 exposedfield SFFloat minback 1 exposedfield SFFloat minfront 1 exposedfield SFFloat priority 0 16

exposedfield SFNode source NULL field SFBool spatialize TRUE } Με το node Sound µπορούµε να περιγράψουµε λεπτοµερώς τη θέση και τον τρόπο εκποµπής του ήχου. Υπάρχουν δύο τρόποι διάδοσης ήχου εκπεµπόµενου από σηµείο που υποστηρίζονται στη VRML, ο σφαιρικός και ο ελλειψοειδής, µε το δεύτερο να είναι σαφώς περισσότερο ευέλικτος. Ωστόσο, εκτός από τη σηµειακή εκποµπή, είναι δυνατή η εκλογή περιβαλλοντικής εκποµπής ήχου, όπως συµβαίνει εξάλλου και στην πραγµατικότητα, ακούγοντας π.χ. τον ήχο της πόλης από µακριά. Αναλυτικά τα πεδία του node Sound έχουν ως εξής: Το πεδίο direction είναι ένα τρισδιάστατο διάνυσµα που περιγράφει τη διεύθυνση διάδοσης. Όταν η διάδοση είναι σφαιρική, δεν έχει ιδιαίτερο νόηµα, όταν όµως είναι ελλειψοειδής, ρυθµίζει σε συνδυασµό µε τις τιµές των minback και minfront τη διεύθυνση της εσωτερικής έλλειψης (αναλόγως µε τα maxback και maxfront για την εξωτερική έλλειψη). Η default τιµή του είναι [0 0 1], δηλαδή στραµµένο προς τον άξονα z. Το πεδίο intensity καθορίζει την ένταση του ήχου που θα εκπέµπει κάθε πηγή και οι τιµές του κυµαίνονται από 0.0 (µηδενική ένταση) έως 1.0 (πλήρης ένταση). Με τον τρόπο αυτό προσεγγίζεται η πραγµατικότητα, αφού οι πηγές ήχου δεν έχουν όλες την ίδια ένταση. Για ένα αεροπλάνο π.χ. η τιµή θα 17

ήταν κοντά στο 1.0, ενώ για ένα ρυάκι κοντά στο 0.0. Η default τιµή του είναι 1. Το πεδίο location είναι το διάνυσµα στο οποίο ορίζουµε τη θέση της πηγής ήχου µέσα στον κόσµο. Η default τιµή του είναι [0 0 0], δηλαδή το σήµα εκπέµπεται από το κέντρο του κόσµου που έχουµε δηµιουργήσει. Τα πεδία minback και minfront είναι οι εστίες που ορίζουν µια έλλειψη, µέσα στην οποία η ένταση του ήχου είναι σταθερή και έχει τη µέγιστη τιµή της (αυτή που ορίστηκε στο πεδίο intensity). Tα πεδία maxback και maxfront είναι οι εστίες που ορίζουν µια έλλειψη, έξω από την οποία η ένταση του ήχου είναι µηδενική. Εποµένως, η ένταση του ήχου µειώνεται σταδιακά από την εσωτερική στην εξωτερική έλλειψη και µάλιστα αντιστρόφως ανάλογα µε το τετράγωνο της απόστασης. Πρακτικά, για να έχουµε µια οµαλή ελάττωση του ήχου, χωρίς να αποκόπτεται απότοµα στα άνω και κάτω όρια, πρέπει να διαλέξουµε τιµές για τα maxback και maxfront δέκα φορές µεγαλύτερες από τα αντίστοιχα minback και minfront. Η default τιµή των minback και minfront είναι 1, ενώ των maxback και maxfront είναι 10. Το πεδίο priority µας επιτρέπει να θέσουµε κάποια ιεραρχία στους ήχους που θέλουµε να ακουστούν, στην περίπτωση που το µέσο αναπαραγωγής (η κάρτα ήχου) δε διαθέτει αναγκαίο αριθµό καναλιών ώστε να επεξεργαστεί όλες τις διακριτές εκποµπές. Οι τιµές του πεδίου κυµαίνονται από 0.0 έως 1.0. Οι περισσότεροι ήχοι θα πρέπει να έχουν προτεραιότητα 18

0.0, ενώ µόνο σύντοµοι και ειδικοί ήχοι (π.χ. µια σύγκρουση) µπορούν να έχουν υψηλές τιµές προτεραιότητας ώστε να ακουστούν ακόµα και αν έχουν χαµηλότερη ένταση ή είναι µακρύτερα από κάποια άλλη πηγή ήχου. Η default priority είναι 0. Το πεδίο source είναι τύπου node και εκεί δηλώνουµε το node από το οποίο θα διαβάσει ο browser τον ήχο που έχουµε αναθέσει στο αντικείµενο. Τέτοια nodes είναι το AudioClip, στο οποίο θα αναφερθούµε παρακάτω και το MovieTexture. Σε ότι αφορά το MovieTexture, θα πρέπει να επιλεγεί format κινούµενης εικόνας στο οποίο υποστηρίζεται και ήχος (π.χ. το MPEG ή το Quicktime). Η default τιµή είναι NULL. To πεδίο spatialize είναι τύπου boolean και είναι αυτό που µας επιτρέπει να δηµιουργήσουµε περιβαλλοντικούς (ambient) ήχους. Όταν η τιµή του είναι TRUE, ο browser πρέπει να ενεργοποιήσει το stereo και να τοποθετήσει στο σωστό σηµείο µεταξύ Left και Right την πηγή ήχου ανάλογα µε τη θέση της (η διαδικασία λέγεται panning), αν φυσικά η κάρτα ήχου του συστήµατος είναι στερεοφωνική. Όταν η τιµή του πεδίου είναι FALSE, η εκποµπή γίνεται µονοφωνικά και έτσι δίνεται η εντύπωση στον ακροατή ότι ο ήχος είναι οµοιόµορφα διαδεδοµένος στο χώρο. Για να δηµιουργήσουµε ambient ήχους που ακούγονται σε όλο τον κόσµο που έχουµε κατασκευάσει, πρέπει να θέσουµε τιµές στα πεδία minfront και minback τέτοιες που να καλύπτουν το σκηνικό από τη µια άκρη στην άλλη, αφού η ένταση του ήχου µέσα στην έλλειψη 19

που δηµιουργούν είναι αναλλοίωτη. Η default τιµή του πεδίου είναι TRUE. AudioClip node AudioClip { exposedfield SFString description "" exposedfield SFBool loop FALSE exposedfield SFFloat pitch 1.0 exposedfield SFTime starttime 0 exposedfield SFTime stoptime 0 exposedfield MFString url [] eventout SFTime duration_changed eventout SFBool isactive } Με το node AudioClip πραγµατοποιούµε τη διασύνδεση των αρχείων ήχου µε τα nodes της VRML που εµπεριέχουν ήχο (όπως το Sound). Εδώ ορίζουµε την ακριβή τοποθεσία του αρχείου, τη διάρκεια του αποσπάσµατος, το αν θα επαναλαµβάνεται συνεχώς κλπ. Τα πεδία που περιλαµβάνει είναι τα ακόλουθα: Το πεδίο description είναι τύπου string και προσφέρεται για να δοθεί µια περιγραφή κειµένου που χαρακτηρίζει το απόσπασµα που θα ακουστεί. Αν και δεν είναι απαραίτητο, µπορεί να απεικονιστεί στην οθόνη την ώρα της αναπαραγωγής του ήχου. Το πεδίο loop είναι µια boolean µεταβλητή που καθορίζει αν το audioclip θα επαναλαµβάνεται συνεχώς ή θα εκτελεστεί µια µόνο φορά. H default τιµή είναι 20

FALSE, δηλαδή το απόσπασµα δεν επαναλαµβάνεται. Λειτουργεί σε συνδυασµό µε τα πεδία starttime και stoptime, όπως θα δούµε παρακάτω. Η τιµή του πεδίου pitch είναι ένας πολλαπλασιαστής µε τον οποίο αλλάζουµε την ταχύτητα αναπαραγωγής (playback speed) του αρχείου. Αν είναι 1.0 τότε το κοµµάτι αναπαράγεται όπως ακριβώς είναι στην πραγµατικότητα, ενώ αν είναι 2.0 τότε η ταχύτητά του είναι διπλάσια, ενώ οι νότες είναι µια οκτάβα ψηλότερα (στα MIDI αρχεία η αντιστοιχία είναι επακριβής). Αναλόγως, αν ο πολλαπλασιαστής είναι 0.5 τότε η ταχύτητα γίνεται υποδιπλάσια και το κοµµάτι κατεβαίνει µια οκτάβα. Αν το αρχείο προέρχεται από δειγµατοληψία (π.χ. Wave αρχεία), το pitch αλλάζει το playback rate. Έτσι, αν η τιµή του είναι 2.0 θεωρείται ότι σε αρχείο Wave µε ρυθµό δειγµατοληψίας (sampling rate) 11.05kHz έχει γίνει δειγµατοληψία στα 22.1kHz και το αποτέλεσµα είναι αυτό που προαναφέραµε. Η default τιµή του πεδίου είναι 1. To πεδίο starttime ορίζει σε ποια χρονική στιγµή το audioclip θα γίνει ενεργό, ενώ το πεδίοstoptime ορίζει σε ποια χρονική στιγµή το audioclip θα γίνει ανενεργό. Ισχύουν µερικές παραδοχές: Αν θέσουµε τιµή στο stoptime µικρότερη ή ίση µε το starttime, τότε η τιµή του stoptime δε λαµβάνεται υπόψη και το audioclip είναι ενεργό µέχρι να τελειώσει ο πρώτος κύκλος του playback, αν to loop είναι FALSE, ή για πάντα, αν το loop είναι TRUE. Αν, αντίθετα η τιµή του stoptime είναι 21

µεγαλύτερη του starttime, τότε το audioclip είναι ενεργό µέχρι να τελειώσει ο πρώτος κύκλος, αν duration < (stoptime-starttime) και loop = FALSE ή µέχρι να φτάσει η χρονική στιγµή που αντιπροσωπεύει το stoptime, αν (stoptime-starttime)< duration (ανεξαρτήτως τιµής του loop) ή (stoptime-starttime) > duration και loop = TRUE. To πεδίο url είναι τύπου string και δέχεται το URL (Uniform Resource Locator) του αρχείου ήχου που έχουµε επιλέξει. Η διεύθυνση του αρχείου µπορεί να είναι στο ίδιο directory µε το αρχείο wrl, σε κάποιο άλλο directory του server, ή και σε άλλο web server οπουδήποτε στον κόσµο. Οι προδιαγραφές της VRML 2.0 επιβάλλουν να υποστηρίζεται τουλάχιστον το format Wave της Microsoft, ενώ συνίσταται η υποστήριξη του General ΜΙDI format. Ο Cosmoplayer της Silicon Graphics υποστηρίζει και τα δύο. To event duration_changed παράγεται όταν η διάρκεια του κοµµατιού είναι διαφορετική από αυτή που έχει δηλωθεί. Αυτό πρακτικά µπορεί να συµβεί µόνο όταν ενώ έχει φορτωθεί το κοµµάτι, τo URL στο οποίο βρίσκεται έχει αλλάξει. Η αλλαγή της τιµής του pitch δεν επηρεάζει το event αυτό, γιατί η διάρκεια υπολογίζεται πάντα µε την τιµή του pitch στο 1.0. Επίσης ούτε η τιµή του loop επηρεάζει το event γιατί η διάρκεια υπολογίζεται πάντα για loop ίσο µε FALSE. Το event isactive χρησιµοποιείται από τα υπόλοιπα nodes για να διαπιστωθεί αν το audioclip. 22

είναι ενεργό. Αν κάτι τέτοιο συµβαίνει, θα πρέπει να αναπαράγεται ο ήχος που αντιστοιχεί στο δεδοµένο χρονικό σηµείο που γίνεται το query. To isactive γίνεται ενεργό σύµφωνα µε τον δίπλα πίνακα, όπως εξηγήθηκε παραπάνω στην αναφορά µας για τα starttime και stoptime. Tις υπόλοιπες χρονικές στιγµές, το isactive είναι FALSE. 23

υναµική κίνηση αντικειµένων Η VRML 2.0 µας παρέχει µια σειρά κόµβων που µας δίνουν τη δυνατότητα να δώσουµε ζωή στον κόσµο που δηµιουργήσαµε. Αυτό γίνεται µε τη χρησιµοποίηση των Sensor nodes που είναι ο τρόπος του χρήστη για απευθείας αλληλεπίδραση µε τον κόσµο. Έχουµε τρεις κατηγορίες sensors: 1) Touch Sensors, που µας παρέχουν τρόπους ανίχνευσης επίδρασης από το χρήστη χρησιµοποιώντας µία συσκευή εισόδου συνήθως το mouse. 2) Spatial Sensors, που προσφέρουν αισθητηριακά σχετικά µε τον κόσµο. 3) Temporal Sensors. Υπάρχει µόνο ένας Temporal Sensor, ο οποίος είναι ο TimeSensor, ο οποίος παράγει συµβάντα κατά καθορισµένες χρονικές περιόδους, καθώς και κατά καθορισµένα τακτικά διαστήµατα κατά τη διάρκεια αυτών των περιόδων. Οδηγώντας τα συµβάντα που παράγουν αυτοί οι nodes χρησιµοποιώντας την εντολή ROUTE ως συµβάντα εισόδου σε κάποιους άλλους κόµβους, µπορούµε να δηµιουργήσουµε κίνηση, περιστροφή, να παράγουµε ήχο κ.λ.π. αλληλεπιδρώντας ουσιαστικά µε τον VRML κόσµο. Αν θέλουµε µάλιστα η κίνηση που θα παράγουµε να είναι πιο οµαλή µπορούµε να χρησιµοποιήσουµε και κάποιον interpolator node και µέσω αυτού να µεταφερθεί η κίνηση στον κόµβο που θέλουµε να κινήσουµε. Αν ο κόµβος αυτός είναι κόµβος πατέρας περισσότερων αντικειµένων, τότε η κίνηση που θα εφαρµοστεί σ αυτόν θα αφορά και τους υποκείµενους κόµβους. 24

3.JAVA Τύποι εφαρµογών Οι εφευρέτες της Java [1, 8] παραδέχονται ότι η Java είναι βασισµένη σε αρχές που είναι δανεισµένες από άλλες γλώσσες προγραµµατισµού όπως οι C, C++ [5], Eiffel και SmallTalk. Γι αυτό και δεν είναι περίεργο το γεγονός ότι η Java µπορεί να χρησιµοποιηθεί σε εφαρµογές ανάλογες µε τις οποίες χρησιµοποιούνται και αυτές οι γλώσσες. Πιο συγκεκριµένα, η Java µπορεί να χρησιµοποιηθεί για την δηµιουργία των εξής τεσσάρων τύπων εφαρµογών: Μικροεφαρµογές (Applets) Εφαρµογές σε γραφικό περιβάλλον (GUI Applications) [23] Εφαρµογές που τρέχουν από γραµµή εντολής (Command Line Applications) Βιβλιοθήκες κλάσεων (Class Libraries) Οι µικροεφαρµογές είναι συνήθως εφαρµογές µικρού µεγέθους που τρέχουν µέσα από ένα εξεταστή ιστοσελίδων που έχει την δυνατότητα χρήσης Java (Java enabled web browser), όπως είναι για παράδειγµα ο Netscape Navigator, o Internet Explorer και ο Hotjava. Στη δεύτερη περίπτωση µιλάµε για τις τυπικές εφαρµογές σε γραφικό περιβάλλον όπως το Notepad των Windows. Οι εφαρµογές της τρίτης περίπτωσης είναι οι εφαρµογές 25

που τρέχουν από την γραµµή εντολής του MS-DOS ή από την γραµµή εντολής του UNIX, όπως ακριβώς η εντολή copy του MS-DOS ή η εντολή ls του UNIX. Java. Μία γλώσσα που τρέχει παντού. Ένα από τα βασικά γνωρίσµατα της Java είναι ότι είναι µία γλώσσα στην οποία συνδυάζονται οι αρχές της µεταγλώττισης (compilation) και της µετάφρασης (interpretation). Για την ακρίβεια περίπου ένα 80% του κώδικα ενός προγράµµατος µεταγλωττίζεται, ενώ ένα 20% περίπου µεταφράζεται από τον εξεταστή ιστοσελίδων ή από οποιοδήποτε άλλο περιβάλλον µέσα στο οποίο θα τρέξει τελικά η εφαρµογή. Αλλά αυτό το 20% της µετάφρασης του κώδικα που αποµένει για το τέλος και γίνεται τοπικά (στον υπολογιστή του χρήστη), είναι ο λόγος που δίνει στην Java ένα από τα χαρακτηριστικά της που την κάνουν να ξεχωρίζει. ηλαδή η δυνατότητα της να µεταγλωττίζεται µόνο µία φορά και να τρέχει σε οποιαδήποτε πλατφόρµα. Αυτό που κάνει ένας µεταγλωττιστής C++ είναι ότι παίρνει κώδικα C++ υψηλού επιπέδου και τον µεταγλωττίζει σε εντολές που µπορεί να αντιληφθεί ένας µικροεπεξεργαστής. Αυτό σηµαίνει ότι κάθε διαφορετικός τύπος υπολογιστή χρειάζεται µία διαφορετική µεταγλώττιση του ίδιου C++ προγράµµατος για να µπορεί να το εκτελέσει, γεγονός το οποίο δεν είναι µία εύκολη διαδικασία. Αυτό είναι ένα σηµαντικό πρόβληµα αν σκεφτούµε την ποικιλία τύπων 26

υπολογιστών (διαφορετικών ειδών πλατφόρµας) που υπάρχει στις µέρες µας. Το περιβάλλον της Java υπερνικά αυτό το πρόβληµα χρησιµοποιώντας ένα µεσάζοντα ανάµεσα στον µεταγλωττιστή και τον υπολογιστή. Αυτός ο µεσάζοντας καλείται εικονική µηχανή της Java (Java Virtual Machine, JVM). Αντί να γίνεται µεταγλώττιση χωριστά για τον κάθε τύπο υπολογιστή, ο µεταγλωττιστής της Java παίρνει τον πηγαίο κώδικα υψηλού επιπέδου που είναι γραµµένος σε Java, σε ένα αρχείο τύπου κειµένου, και το µεταγλωττίζει σε χαµηλού επιπέδου Java κώδικα από bytes (bytecode), τον οποίο αντιλαµβάνεται η εικονική µηχανή της Java. Αυτή είναι στη συνέχεια υπεύθυνη για τη µετάφραση του κώδικα των bytes, έτσι ώστε να µπορεί να εκτελεστεί στον υπολογιστή που βρίσκεται και αυτή. ηλαδή το µόνο πρόγραµµα που πρέπει να τρέχει αποκλειστικά σε κάποια συγκεκριµένη πλατφόρµα είναι η εικονική µηχανή της Java. Στην ουσία αυτό που κάνει ένας προγραµµατιστής που χρησιµοποιεί Java είναι να µεταγλωττίζει τον πηγαίο κώδικα της Java σε κώδικα από bytes χρησιµοποιώντας τον µεταγλωττιστή της Java. Αυτός ο κώδικας από bytes είναι δυαδικός και ανεξάρτητος από την αρχιτεκτονική του υπολογιστή όπου µεταγλωττίστηκε (την πλατφόρµα του υπολογιστή, όπως συνήθως λέγεται). Όµως, αυτός ο κώδικας από bytes δεν είναι πλήρης, παρά µόνο αν µεταφραστεί από ένα περιβάλλον εκτέλεσης Java (Java runtime environment, JRE), 27

συνήθως έναν εξεταστή ιστοσελίδων (Σχήµα 3.1). Επειδή το κάθε περιβάλλον εκτέλεσης Java είναι για µία συγκεκριµένη πλατφόρµα, το τελικό προϊόν θα δουλεύει για αυτήν την συγκεκριµένη πλατφόρµα. Αυτό είναι κάτι πραγµατικά χρήσιµο για τους προγραµµατιστές, αφού µπορεί για παράδειγµα κάποιος να φτιάξει µία µικροεφαρµογή σε σύστηµα UNIX, να την ενσωµατώσει στην ιστοσελίδα του και να µπορεί να την δείξει σε οποιονδήποτε έχει έναν εξεταστή ιστοσελίδων που υποστηρίζει Java, ανεξάρτητα από την πλατφόρµα του υπολογιστή του. Βέβαια, κάθε πλεονέκτηµα συνήθως επιφέρει και κάποια µειονεκτήµατα. Στην περίπτωση αυτή γίνεται ανταλλαγή διαπλατφορµικής λειτουργίας µε ταχύτητα εκτέλεσης. Το κύριο µειονέκτηµα αυτού του συστήµατος είναι ότι η µετάφραση του κώδικα είναι πολύ πιο αργή διαδικασία από την εκτέλεση ενός προγράµµατος που έχει φτιαχτεί για να τρέχει αποκλειστικά σε αυτόν τον υπολογιστή. Για κάθε εντολή στον Java κώδικα από bytes η εικονική µηχανή της Java πρέπει να βρει και να εκτελέσει την ισοδύναµη της για το σύστηµα στο οποίο τρέχει η εφαρµογή. Αυτό δηµιουργεί µία επιβράδυνση στην επεξεργασία ενός προγράµµατος Java. Πηγαίος κώδικας Compiler Bytecode Interpreter JRE 28

Σχήµα 3.1 Η επεξεργασία του πηγαίου κώδικα µέχρι την εκτέλεση του. Ακριβώς επειδή ο κώδικάς από bytes πρέπει στο τέλος να µεταφραστεί, οι ιστοσελίδες που περιέχουν µικροεφαρµογές συνήθως απαιτούν πολύ περισσότερη ώρα για να φορτωθούν σε σχέση µε τις συνηθισµένες σελίδες. Αυτό συµβαίνει γιατί ο κώδικας από bytes που στο τέλος θα µετατραπεί σε µία µικροεφαρµογή ή σε µία εφαρµογή, περιέχει περισσότερα µεταγλωττισµένα δεδοµένα από ότι στις άλλες περιπτώσεις όπου δεν θα ακολουθήσει µετάφραση. Ο µεταγλωττισµένος κώδικάς φορτώνεται στο σύστηµα του χρήστη ακριβώς όπως και µία ιστοσελίδα µέσω του διαδικτύου. Αυτή η ατέλεια της Java σ ότι αφορά τις επιδόσεις της αντισταθµίστηκε µε τους µεταγλωττιστές JIT (Just-in-Time compilers). Ένας τέτοιος µεταγλωττιστής µεταγλωττίζει τις συναρτήσεις της Java σε τοπικό κώδικα (native code) για την πλατφόρµα που χρησιµοποιείται, ο οποίος στη συνέχεια εκτελείται πολύ γρήγορα. Χωρίς αυτόν τον µεταγλωττιστή οι συναρτήσεις της Java δεν µετατρέπονται σε τοπικό κώδικα, αλλά παραµένουν σε ένα κώδικα από bytes αναγνωρίσιµο από κάθε πλατφόρµα. Αυτός ο κώδικάς από bytes µεταφράζεται στον υπολογιστή του χρήστη από την εικονική µηχανή της Java. Μία εφαρµογή γραµµένη σε Java µπορεί να τρέξει σε οποιαδήποτε πλατφόρµα, αλλά ένας 29

µεταγλωττιστής JIT πρέπει να είναι ειδικά φτιαγµένος για µία συγκεκριµένη πλατφόρµα, αφού θα πρέπει να δηµιουργεί τοπικό κώδικα που θα γίνεται αντιληπτός µόνο από αυτήν την πλατφόρµα. Οι εξεταστές ιστοσελίδων (web browsers) της Netscape και της Microsoft παρέχουν µεταγλωττιστές JIT εδώ και µερικά χρόνια. Ακόµη, ο συνδυασµός µεταγλωττιστή και µεταφραστή προσφέρει ασφάλεια και σταθερότητα. Το περιβάλλον εκτέλεσης της Java περιλαµβάνει ένα στοιχείο που λέγεται linker, το οποίο ελέγχει τα εισερχόµενα δεδοµένα για να είναι σίγουρο ότι δεν περιέχουν βλαβερά αρχεία που θα δηµιουργούσαν προβλήµατα στην λειτουργία του υπολογιστή. Ακόµη, η διαδικασία της µετάφρασης που υφίσταται ο κώδικας από bytes δίνει την δυνατότητα ενσωµάτωσης δεδοµένων κατά την διάρκεια της εκτέλεσης, γεγονός που αποτελεί ένα από τα θεµέλια της δυναµικής συµπεριφοράς της Java. Ο κώδικας Java µεταγλωττίζεται σε διαπλατφορµικούς κώδικες από bytes, οι οποίοι απαιτούν έναν µεταφραστή για να εκτελεστούν. Σ ότι αφορά τις µικροεφαρµογές η δουλειά αυτή γίνεται από τους εξεταστές ιστοσελίδων. Για τις εφαρµογές σε γραφικό περιβάλλον ή τις εφαρµογές που τρέχουν από γραµµή εντολής, απαιτείται ένας µεταφραστής Java για να εκτελεστούν. Αυτόµατη συλλογή απορριµµάτων (automatic garbage collection) 30

Στην C και την C++ o προγραµµατιστής είναι ο αποκλειστικά υπεύθυνος για την δέσµευση και την αποδέσµευση της απαιτούµενης µνήµης για να λειτουργήσει ένα πρόγραµµα. Ακόµη ο χειρισµός των δεικτών (pointers), πράγµα που αναπόφευκτα χρειάζεται να γίνει σε περιπτώσεις λειτουργιών που σχετίζονται µε την µνήµη, είναι µία πραγµατικά επίπονη διαδικασία και δυστυχώς µία πολλή συνηθισµένη πηγή λαθών. Η Java αντίθετα, εξαλείφει τους pointers καθώς και την υποχρέωση του προγραµµατιστή να είναι αποκλειστικά υπεύθυνος για την διαχείριση της µνήµης. Η δέσµευση και η αποδέσµευση της µνήµης γίνονται αυτόµατα και µε ασφάλεια. Η Java χρησιµοποιεί την λεγόµενη «συλλογή απορριµµάτων» αντί της αποδέσµευσης της µνήµης µε ευθύνη του προγραµµατιστή. Η συλλογή απορριµµάτων εξαλείφει σφάλµατα σχετιζόµενα µε την διαχείριση της µνήµης καθώς και πιθανά κενά σχετικά µε την ασφάλεια του συστήµατος, αφού η κατά βούληση δέσµευση και αποδέσµευση της µνήµης επιτρέπει την χωρίς άδεια αντιγραφή και κλωνοποίηση αντικείµένων τα οποία έχουν την εµπιστοσύνη του συστήµατος (έχουν δηλαδή αυξηµένα δικαιώµατα), καθώς και επιθέσεις κατά της συνοχής των δεδοµένων. Μικροεφαρµογές και ιστοσελίδες 31

Όπως αναφέρθηκε και προηγουµένως, οι µικροεφαρµογές Java [3, 8] τρέχουν µέσα από εξεταστή ιστοσελίδων µε δυνατότητα χρήσης Java (Java enabled web browser). Επειδή οι εξεταστές ιστοσελίδων αναπτύχθηκαν αρχικά για την παρουσίαση HTML εγγράφων, η ενσωµάτωση µικροεφαρµογών της Java σε ένα εξεταστή ιστοσελίδων απαιτεί την προσθήκη κάποιας ειδικής ετικέτας στο HTML έγγραφο, ώστε να ξεκινήσει η µικροεφαρµογή. Αυτή η ετικέτα είναι η <APPLET>, µία συνήθης χρήση της οποίας δίνεται παρακάτω <APPLET CODE=TextEdit.class WIDTH=575 HEIGHT=350> </APPLET> Το προηγούµενο παράδειγµα παρουσιάζει την βασική δοµή µιας ετικέτας <APPLET>. Αυτή περιλαµβάνει τρία πεδία τα οποία πρέπει οπωσδήποτε να υπάρχουν σε µία ετικέτα. Τα CODE, WIDTH, και HEIGHT. Μία ετικέτα <APPLET> µπορεί να περιλαµβάνει αρκετά ακόµα πεδία ώστε να µπορεί ο εξεταστής ιστοσελίδων (web browser) να προσδιορίσει πως ακριβώς πρέπει να παρουσιαστεί η µικροεφαρµογή στον χρήστη. Μία ετικέτα <APPLET> που χρησιµοποιεί όλα τα δυνατά πεδία δίνεται παρακάτω <APPLET CODEBASE=url CODE=appletClassFile WIDTH=n HEIGHT=n ALT=alternateText NAME=appletInstanceName ALIGN=alignment VSPACE=n HSPACE=n> <PARAM NAME=parameter1 VALUE=value1> <PARAM NAME=parameter2 VALUE=value2> 32

.. <PARAM NAME=parameterN VALUE=valueN> Alternate HTML </APPLET> Τα πεδία αυτά και οι τιµές που µπορούν να πάρουν δίνονται στον πίνακα που ακολουθεί: Πίνακας 3.1 Τα πεδία της ετικέτας <APPLET> και οι έγκυρες τιµές τους. Απαραίτητα Πεδία CODE WIDTH HEIGHT Προαιρετικά Πεδία CODEBASE Έγκυρες Τιµές Το όνοµα ενός µεταγλωττισµένου αρχείου της Java, αρχείο κλάσης (class file) Το πλάτος της µικροεφαρµογής σε pixel όταν αυτή παρουσιάζεται στον εξεταστή ιστοσελίδων Το ύψος της µικροεφαρµογής σε pixel όταν αυτή παρουσιάζεται στον εξεταστή ιστοσελίδων Παρέχει µία διαδροµή προς ένα κατάλογο που περιέχει αρχεία κλάσεων. Μπορεί να είναι είτε µία διεύθυνση στο διαδίκτυο, είτε µία διαδροµή προς ένα κατάλογο του σκληρού δίσκου του χρήστη. ALT Καθορίζει ένα εναλλακτικό κείµενο για εµφάνιση από εξεταστές ιστοσελίδων που δεν υποστηρίζουν Java συνεπώς δεν 33

µπορούν να εκτελέσουν την µικροεφαρµογή. NAME Αντιστοιχεί ένα συµβολικό όνοµα σε µία µικροεφαρµογή. Άλλες µικροεφαρµογές στην ίδια σελίδα µπορούν να χρησιµοποιήσουν το ίδιο όνοµα ALIGN Χρησιµοποιείται για την τοποθέτηση µίας µικροεφαρµογής Java σε κάποια συγκεκριµένη θέση µέσα στο χώρο που διατίθεται για την µικροεφαρµογή στην ιστοσελίδα. Οι δυνατότητες που υπάρχουν είναι οι: LEFT, RIGHT, TOP, MIDDLE, BOTTOM καθώς και TEXTTOP, BASELINE, ABSMIDDLE και ABSBOTTOM. Αν χρησιµοποιηθούν οι επιλογές LEFT ή RIGHT, το κείµενο της ιστοσελίδας θα ρέει γύρω από τον χώρο που αντιστοιχίστηκέ στην µικροεφρµογή. VSPACE Χρησιµοποιείται µόνο εφόσον υπάρχουν οι τιµές ALIGN= LEFT ή ALIGN= RIGHT και επιτρέπει να καθοριστεί ο κατακόρυφος χώρος που θα µείνει κενός γύρω από την µικροεφαρµογή. HSPACE Χρηςιµοποιείται µόνο εφόσον υπάρχουν οι τιµές ALIGN= LEFT ή ALIGN= RIGHT και επιτρέπει να καθοριστεί ο οριζόντιος χώρος που θα µείνει κενός γύρω από την µικροεφαρµογή. PARAM Παράµετροι που θα περαστούν στην µικροεφαρµογή. 34

ιαδικασία που ακολουθείται για να φορτωθεί µία µικροεφαρµογή Οι µικροεφαρµογές που εκτελούνται συνήθως είναι µικροεφαρµογές που βρίσκονται σε ιστοσελίδες. Όπως οι ιστοσελίδες αυτές είναι αποθηκευµένες στον εξυπηρετητή τον οποίο προσπελαύνουµε, έτσι είναι και το αρχείο κλάσης της µικροεφαρµογής που είναι ενσωµατωµένη στην ιστοσελίδα. Έτσι, µόλις τελειώσει η µετάδοση του HTML αρχείου προς τον χρήστη, αρχίζει πλέον ο υπολογιστής του χρήστη να το διαβάζει. Μόλις ο εξεταστής ιστοσελίδων συναντήσει την ετικέτα <APPLET> αναζητά το αρχείο κλάσης που περιέχει τον µεταγλωττισµένο κώδικα της µικροεφαρµογής. Το αρχείο αυτό, το οποίο δεν το έχει, το λαµβάνει από τον εξυπηρετητή και στην συνέχεια αυτό εκτελείται, οπότε τρέχει η µικροεφαρµογή. Αν η εκτέλεση του απαιτεί και την ύπαρξη συµπληρωµατικών αρχείων κλάσεων, τότε η εκτέλεση της µικροεφαρµογής αρχίζει αφού µεταδοθούν και αυτά. Η εκτέλεση της ξεκινάει µε την κλήση της συνάρτησης init() και της start(). Η διαδικασία που περιγράφηκε δίνεται σχηµατικά στο σχήµα 3.2. 35

Σχήµα 3.2 ιαδικασία που ακολουθείται για να φορτωθεί µία µικροεφαρµογή. Νήµατα (Threads) Μία µοναδική ιδιότητα της Java είναι η ενσωµατωµένη υποστήριξη της για νήµατα (threads). Τα νήµατα επιτρέπουν σε ένα πρόγραµµα να εκτελεί πολλές λειτουργίες ταυτόχρονα. Για να γίνει αντιληπτό πόσο σηµαντική είναι αυτή η ιδιότητα της Java αρκεί να φανταστούµε πόσο περιορισµένος θα αισθανόταν ένας άνθρωπος, ο οποίος δεν θα είχε τη δυνατότητα να 36

κουνήσει το ένα πόδι και το ένα χέρι του ταυτόχρονα. Τα νήµατα είναι η απάντηση της Java στο αντίστοιχο πρόβληµα των υπολογιστών. Βέβαια αυτό που γίνεται δεν είναι ακριβώς µία παράλληλη επεξεργασία όλων των νηµάτων, γιατί οι συνήθεις υπολογιστές έχουν µόνο ένα επεξεργαστή. Αυτό που συµβαίνει στην πραγµατικότητα είναι µία συνεχής εναλλαγή της χρήσης της επεξεργαστικής ισχύος του υπολογιστή από εφαρµογή σε εφαρµογή, αν µιλάµε για ένα σύστηµα που υποστηρίζει την πολυδιεργασία (multitasking), ή από νήµα σε νήµα, αν µιλάµε για µία πολυνηµατική εφαρµογή (multithreading). Όλα αυτά όµως γίνονται τόσο γρήγορα που ο χρήστης έχει την εντύπωση πως όλα γίνονται ταυτόχρονα. Βέβαια ένας προγραµµατιστής θα µπορούσε να αναρωτηθεί γιατί θα πρέπει να νοιάζεται για τον τρόπο λειτουργίας του επεξεργαστή, από τη στιγµή που τα προγράµµατά του δουλεύουν. Η απάντηση σχετίζεται µε το είδος της εφαρµογής. Αν για παράδειγµα το πρόγραµµα είναι ένας κειµενογράφος, τότε µας ενδιαφέρει να µπορούµε να γράφουµε σε αυτόν ενώ αυτός τυπώνει το κείµενο. Η εκτύπωση του κειµένου είναι ένα νήµα που εκτελείται στο παρασκήνιο (background) παράλληλα µε την εγγραφή νέων χαρακτήρων στον κειµενογράφο. Ένα άλλο παράδειγµα είναι η λειτουργία ενός εξυπηρετητή (server). Ένα από τα καθήκοντα ενός server είναι η ικανοποίηση όσο το δυνατόν περισσότερων αιτήσεων 37

ταυτόχρονα, ώστε να µπορούν όλοι οι πελάτες να ικανοποιούνται ταυτόχρονα, µε αποτέλεσµα τη µείωση του χρόνου αναµονής. Σ ότι αφορά την δηµιουργία κλάσεων και εφαρµογών που τρέχουν σε διαφορετικά νήµατα, στη Java υπάρχουν δύο τρόποι υλοποίησης. Ας υποτεθεί πως θέλουµε η κλάση myclass να µπορεί να εκτελεστεί µε τις ιδιότητες ενός νήµατος. Τότε στον ορισµό της κλάσης θα γράψουµε: public class myclass extends Thread public class myclass implements Runnable Συνήθως χρησιµοποιείται ο δεύτερος τρόπος. Αυτό συµβαίνει γιατί στη Java υπάρχει δυνατότητα µόνο για απλή κληρονοµικότητα. ηλαδή µία κλάση µπορεί να κληρονοµήσει τα χαρακτηριστικά µόνο µιας άλλης αλλά όχι και περισσότερων. Έτσι για παράδειγµα για τη δηµιουργία της βασικής κλάσης µίας µικροεφαρµογή (applet), πρέπει να γραφεί public class myclass extends Applet implements Runnable ώστε να µπορούν να συνδυαστούν τα χαρακτηριστικά µιας κλάσης Thread και µιας κλάσης Applet. Όταν µία κλάση έχει οριστεί κατά τέτοιο τρόπο, τότε πρέπει οπωσδήποτε να περιλαµβάνει µία συνάρτηση µε το όνοµα run ( ). Σε αυτήν τη συνάρτηση τοποθετείται ο 38

κώδικας που θέλουµε να εκτελείται από το συγκεκριµένο νήµα. Ένα άλλο θέµα που σχετίζεται µε τα νήµατα είναι η προτεραιότητα που έχει το κάθε νήµα σε περίπτωση που πολλά νήµατα τρέχουν ταυτόχρονα. Η Java δίνει την δυνατότητα να θέσει ο προγραµµατιστής την προτεραιότητα την οποία θα έχουν τα διάφορα νήµατα τα οποία θα τρέχουν ταυτόχρονα. Αυτό γίνεται χρησιµοποιώντας τη συνάρτηση setpriority(int). Αν δύο νήµατα έχουν την ίδια προτεραιότητα τότε ο χρόνος του επεξεργαστή µοιράζεται ανάµεσα στα δύο αυτά νήµατα. Αν όµως ένα νήµα έχει µεγαλύτερη προτεραιότητα από όλα τα άλλα που τρέχουν, τότε αυτό το νήµα θα χρησιµοποιεί αποκλειστικά τον επεξεργαστή έως ότου τελειώσει την λειτουργία του και στην συνέχεια θα µπορέσει να εκτελεστεί κάποιο άλλο νήµα. Αυτό δεν είναι πάντα επιθυµητό, γιατί αν και ένα νήµα µπορεί να έχει µεγαλύτερη προτεραιότητα, αυτό δεν σηµαίνει πως θέλουµε να σταµατήσουµε εντελώς την λειτουργία των άλλων νηµάτων. Η λύση σε αυτό το πρόβληµα είναι να προκαλείται κατά διαστήµατα η παύση του κυρίαρχου νήµατος, έτσι ώστε να δίνεται η δυνατότητα και στα υπόλοιπα νήµατα να εκτελέσουν µερικές εντολές. Αυτό γίνεται χρησιµοποιώντας την συνάρτηση sleep(long). Το όρισµα της συνάρτησης είναι ο αριθµός των milliseconds για τον οποίο το νήµα βρίσκεται σε παύση. 39

Ένα άλλο πρόβληµα που είναι πιθανό να προκύψει από την χρήση των νηµάτων είναι η ταυτόχρονη προσπέλαση της ίδιας µεταβλητής από δύο διαφορετικά νήµατα, εκ των οποίων το ένα θέλει να µεταβάλλει την τιµή της µεταβλητής. Αν επιτρεπόταν να γίνει κάτι τέτοιο, οι συνέπειες θα ήταν απρόβλεπτες. Για να αποφύγουµε ένα τέτοιο συµβάν αυτό που θα πρέπει να κάνουµε είναι να δηλώσουµε και τις δύο συναρτήσεις, αυτή που θέτει την µεταβλητή και αυτή που την διαβάζει, ως synchronized. Αυτή η λέξη κλειδί της Java τοποθετεί ένα περιορισµό στις συναρτήσεις που δηλώθηκαν µε αυτό τον τρόπο. Κάθε φορά µόνο ένα νήµα µπορεί να βρίσκεται σε µία οποιαδήποτε synchronized συνάρτηση. Για παράδειγµα ας υποθέσουµε πως έχουµε τις παρακάτω δύο συναρτήσεις: public synchronized void setvar(int x) { myvar=x; } public synchronized int getvar() { return myvar; } Αν κληθεί η setvar(int x) από ένα νήµα, τότε κανένα άλλο νήµα δεν θα µπορεί να καλέσει οποιαδήποτε συνάρτηση που έχει οριστεί ως synchronized, συµπεριλαµβανοµένης και της getvar(), µέχρι που να τελειώσει η εκτέλεση της setvar(int x). Έτσι, κανένα νήµα δεν θα πάρει ποτέ λανθασµένη πληροφορία για την τιµή της µεταβλητής, 40

επειδή έτυχε η setvar(int x) να είναι στην µέση του γραψίµατος της τιµής της µεταβλητής. Βέβαια η χρήση synchronized συναρτήσεων πρέπει να γίνεται µόνο όπου χρειάζεται, γιατί αν για παράδειγµα δηλωθούν όλες οι συναρτήσεις ως synchronized, τότε στην ουσία παύουµε να έχουµε πολυνηµατκό κώδικα, αφού κανένα νήµα δεν µπορεί να εκτελεστεί ταυτόχρονα µε ένα άλλο. Τέλος, υπάρχουν µερικές συναρτήσεις του πακέτου java.lang.thread που δίνουν τη δυνατότητα να τεθεί η κατάσταση ενός νήµατος και δίνονται παρακάτω: start() stop() sleep(long), sleep(long,int) suspend() resume() yield() destroy() Η start() και η stop() χρησιµοποιούνται προφανώς για την εκκίνηση και το σταµάτηµα ενός νήµατος. Η συνάρτηση sleep(long) λειτουργεί όπως αναφέρθηκε προηγουµένως. Η συνάρτηση suspend() χρησιµοποιείται για την διακοπή της εκτέλεσης ενός νήµατος µέχρι να εκτελεστεί κάποιο άλλο νήµα, και όταν αυτό τελειώσει µπορεί να συνεχιστεί η εκτέλεση του προηγούµενου νήµατος χρησιµοποιώντας την resume(). Η συνάρτηση yield() χρησιµοποιείται για να δηλώσει στον µεταγλωττιστή (interpreter) την παραχώρηση της 41

προτεραιότητας σε οποιοδήποτε άλλο νήµα την χρειάζεται. Το νήµα που διακόπηκε συνεχίζει να εκτελείται όταν όλα τα υπόλοιπα νήµατα έχουν τελειώσει την εκτέλεση τους. Η συνάρτηση destroy() απλά καταστρέφει ένα νήµα. Η χρήση της δεν συνιστάται γιατί τερµατίζει βίαια ένα νήµα και ισοδυναµεί µε το κλείσιµο ενός προγράµµατος ενώ αυτό λειτουργεί. Πρίζες (sockets) Οι πρίζες (sockets) αναπτύχθηκαν αρχικά στο πανεπιστήµιο του Berkeley στην California, ως ένα εργαλείο για τον ευκολότερο προγραµµατισµό δικτυακών εφαρµογών. Ενώ αρχικά ήταν µέρος µόνο των λειτουργικών συστηµάτων UNIX, η αρχή των πριζών ενσωµατώθηκε σε πολλά περιβάλλοντα εργασίας, συµπεριλαµβανοµένου και αυτού της Java. Μία πρίζα χειρίζεται την σύνδεση µέσω δικτύου µε µία άλλη εφαρµογή, η οποία εκτελείται σε κάποιο αποµακρυσµένο σηµείο. Μία πρίζα τύπου TCP [1, 3] είναι µία πρίζα που χρησιµοποιεί το πρωτόκολλο TCP ως πρωτόκολλο µεταφοράς. Οι πληροφορίες που χρειάζονται για να δηµιουργηθεί µία πρίζα TCP είναι: Η IP διεύθυνση του τοπικού συστήµατος Ο αριθµός της TCP θύρας που χρησιµοποιεί η τοπική εφαρµογή 42

Η IP διεύθυνση του αποµακρυσµένου συστήµατος Ο αριθµός της TCP θύρας στην οποία αποκρίνεται η αποµακρυσµένη εφαρµογή Οι πρίζες χρησιµοποιούνται πολύ συχνά σε εφαρµογές πελάτη-εξυπηρετητή (Client- Server). Ένας κεντρικός υπολογιστής (εξυπηρετητής) περιµένει διάφορους αποµακρυσµένους υπολογιστές (πελάτες) να ζητήσουν κάποια υπηρεσία. Για να µπορούν οι πελάτες να επικοινωνήσουν µε τον εξυπηρετητή χρησιµοποιώντας κάποια καθιερωµένα πρωτόκολλα εφαρµογών (όπως FTP, Telnet και HTTP), συγκεκριµένες θύρες αντιστοιχίζονται σε καθένα από αυτά. Μερικές από αυτές δίνονται στον παρακάτω πίνακα. Πίνακας 3.2 Οι θύρες στις οποίες προσφέρει συγκεκριµένες υπηρεσίες ένας Server Θύρα Υπηρεσία 21 FTP 23 Telnet 25 SMTP(Internet Mail Transfer) 79 Finger 80 HTTP Γενικά οι διαθέσιµοι αριθµοί θυρών είναι από 0 έως 65535. Επειδή όµως στο UNIX οι αριθµοί θυρών µέχρι το 1024 χρησιµοποιούνται από εφαρµογές µε προνόµια super user (root), οι απλές εφαρµογές χρησιµοποιούν κατά σύµβαση θύρες µε αριθµό µεγαλύτερο του 1024. 43

Αυτά αφορούν τον εξυπηρετητή, στον οποίο µία εφαρµογή καταλαµβάνει µόνιµα µία θύρα, αφού περιµένει συνεχώς οποιονδήποτε πελάτη ζητήσει κάποια από τις υπηρεσίες που προσφέρει. Στον πελάτη οι θύρες συνήθως επιλέγονται και πάλι στην περιοχή από το 1024 και πάνω για τους ίδιους λόγους, όµως η επιλογή τους γίνεται δυναµικά. ηλαδή τη στιγµή που ξεκινάει η εφαρµογή επιλέγεται µία από τις ελεύθερες θύρες πάνω από τη 1024 και εκχωρείται σ αυτήν. Από τα παραπάνω φαίνεται πως µία πρίζα καθορίζει µε µοναδικό τρόπο µία σύνδεση, αφού δεν µπορεί να εκχωρηθεί η ίδια θύρα σε δύο διαφορετικές εφαρµογές που εκτελούνται στον ίδιο υπολογιστή ταυτόχρονα. Βέβαια ένας εξυπηρετητής µπορεί να απαντάει ταυτόχρονα σε δύο πελάτες στην ίδια θύρα, χωρίς να παραβιάζεται µε αυτό τον τρόπο η µοναδικότητα των χαρακτηριστικών της σύνδεσης, αφού οι πελάτες θα είναι σε διαφορετικά συστήµατα και/ή σε διαφορετικές θύρες. Η λογική αυτή παρουσιάζεται στο παρακάτω σχήµα. Στο Σχήµα 1 φαίνεται ένας εξυπηρετητής ο οποίος αποκρίνεται ταυτόχρονα σε τρεις πρίζες µέσα από την ίδια θύρα 1500. Κάθε πρίζα έχει κάποιο ιδιαίτερο χαρακτηριστικό (αριθµός θύρας ή IP διεύθυνση του υπολογιστή) που την κάνει να ξεχωρίζει από τις υπόλοιπες και να είναι µοναδική. 44