Προγραμματισμός

Προγραμματισμός γραφικών 3D σε Java, Μέρος 1: Java 3D

Για να δημιουργήσει μια πραγματική πλατφόρμα Java, η Sun συνειδητοποίησε νωρίς ότι έπρεπε να συμπληρώσει την εικόνα API πέρα ​​από την περιορισμένη λειτουργικότητα που διατίθεται στην πλατφόρμα Java 1.0. Η Sun έχει αναπτύξει τον πυρήνα σε μεγάλο βαθμό με τις 1.1 και επικείμενες 1.2 κυκλοφορίες, αλλά εξακολουθούν να λείπουν κάποια κομμάτια από το παζλ Java.

Η Sun και οι συνεργάτες της ανέπτυξαν τα Java Media and Communication APIs για να παρέχουν τα κομμάτια προγραμματισμού πολυμέσων που λείπουν. Δύο από τα μεγαλύτερα κομμάτια, τα 2D και 3D γραφικά, στοχεύονται με τα Java 2D και 3D API αντίστοιχα. Το Java 2D είναι ένα βασικό API πλατφόρμας που ξεκινά με το Java 1.2, ενώ το Java 3D θα κυκλοφορήσει ως επέκταση API λίγο μετά τη διαθέσιμη πλατφόρμα 1.2. Πρόσφατα ολοκληρώσαμε μια σειρά στηλών στο Java 2D. τώρα στρέφουμε την προσοχή μας στο Java 3D.

Το Java 3D προορίζεται να δώσει στους προγραμματιστές Java τη δυνατότητα να γράφουν μικροεφαρμογές και εφαρμογές που παρέχουν τρισδιάστατο, διαδραστικό περιεχόμενο στους χρήστες. Η Sun έχει πολύ έντονο ανταγωνισμό από άλλες τεχνολογίες γραφικών 3D σε αυτήν την αρένα, και η Java 3D έχει μια ανηφορική μάχη μπροστά της, αν θέλει να νικήσει το υφιστάμενο πρότυπο γραφικών, OpenGL.

Ένα αίτημα για σχόλια αναγνώστη σε API γραφικών 3D για Java έδειξε σοβαρό ενδιαφέρον για τις συνδέσεις Java 3D και Java OpenGL, γι 'αυτό αποφάσισα να επικεντρώσω τις προσπάθειές μου σε αυτές τις τεχνολογίες τους επόμενους μήνες.

Ένα πιο περιορισμένο ποσό ενδιαφέροντος εκφράστηκε σε VRML. Κατά συνέπεια, θα ασχοληθώ με το VRML αποδεικνύοντας τη χρήση του στο Java 3D με φορτωτές περιεχομένου VRML97 και το πρόγραμμα περιήγησης Java 3D VRML97 της Sun. Το Direct3D έλαβε πολύ μικρό ενδιαφέρον, γι 'αυτό αποφάσισα να μην ακολουθήσω αυτό το μονοπάτι, εκτός από το να αναφέρω πού μπορεί να υποστηρίξει ή να λειτουργήσει μια από τις άλλες τεχνολογίες.

Πλεονεκτήματα και μειονεκτήματα του Java 3D

Αυτό το μήνα ξεκινάμε την περιήγησή μας σε τρισδιάστατα API γραφικών για Java, εξερευνώντας το Java 3D. Θα ξεκινήσουμε συζητώντας μερικά από τα βασικά πλεονεκτήματα και αδυναμίες του API. Τα τρισδιάστατα γραφικά μπορεί να φαίνονται μερικές φορές μάλλον ασαφή και, ως εκ τούτου, μπορεί να είναι δύσκολο να εξηγηθεί. Εάν έχετε κάποια παρατεταμένη σύγχυση σχετικά με τα παραδείγματα ή τις εξηγήσεις μου, μη διστάσετε να μου γράψετε τις ερωτήσεις ή τα σχόλιά σας και θα κάνω ό, τι μπορώ για να τα αντιμετωπίσω.

Σημεία πώλησης για Java 3D:

  • Παρέχει μια υψηλού επιπέδου αντικειμενοστρεφή προβολή τρισδιάστατων γραφικών. Το Java 3D το επιτυγχάνει εν μέρει χρησιμοποιώντας ένα γράφημα σκηνής- μοντέλο 3D γραφικών με βάση. (Θα συζητήσουμε αυτήν την ιδέα λεπτομερέστερα αργότερα στο άρθρο.) Αυτή η προσέγγιση έχει ως στόχο να βοηθήσει τους προγραμματιστές χωρίς πολύ εμπειρία γραφικών ή πολυμέσων να χρησιμοποιούν 3D στις εφαρμογές τους. Σε πλήρη αντίθεση με τα διαδικτυακά τρισδιάστατα API χαμηλότερου επιπέδου όπως το OpenGL, τα οποία έχουν σχεδιαστεί για να βελτιστοποιούν την καλύτερη δυνατή ταχύτητα και να παρέχουν στους προγραμματιστές τον μεγαλύτερο δυνατό έλεγχο στη διαδικασία απόδοσης, το Java 3D προορίζεται να είναι αρκετά απλό για κάθε έμπειρο προγραμματιστή Java μαθαίνω.

  • Εάν δεν χρειάζεστε πρόσβαση χαμηλού επιπέδου σε λειτουργίες απόδοσης, το Java 3D μπορεί να είναι μια επιλογή. Η πρόσβαση απόδοσης περιορίζεται σε αιτήματα μέσω γνωρίσματα και bit ικανότητας, παρόμοια σε μορφή και λειτουργία με τις συμβουλές απόδοσης Java 2D. (Δείτε πόρους για συνδέσμους με την προηγούμενη σειρά μου στο Java 2D, που περιελάμβανε συζήτηση και παραδείγματα συμβουλών απόδοσης 2D).

  • Το Java 3D βελτιστοποιείται για ταχύτητα όπου είναι δυνατόν. Ο χρόνος εκτέλεσης χρησιμοποιεί bit ικανότητας απόδοσης, στην πραγματικότητα, για τη βελτιστοποίηση του γραφήματος σκηνής για τις ταχύτερες δυνατές αποδόσεις. Αυτή η προσέγγιση καθιστά το Java 3D πιο εφαρμόσιμο σε διαδραστικά περιβάλλοντα γραφικών (παιχνίδια, προσομοιώσεις, καταστάσεις χαμηλού λανθάνοντος χρόνου) από ό, τι σε εφαρμογές γραφικών υψηλής ποιότητας εκτός σύνδεσης (όπως φάρμες απόδοσης).

  • Ένας μεγάλος και αυξανόμενος αριθμός φορτωτών 3D είναι διαθέσιμος για εισαγωγή περιεχομένου στον Java 3D χρόνο εκτέλεσης. Η Sun έχει διαθέσει ένα πρόγραμμα φόρτωσης αρχείων Java 3D VRML97 και ένα πρόγραμμα περιήγησης ελεύθερα διαθέσιμο με κωδικό. Ψάξτε για τον επόμενο μήνα Προγραμματισμός πολυμέσων στήλη για να εξερευνήσετε αναλυτικότερα τους φορτωτές Java 3D.

  • Το Java 3D απαιτεί δυνατότητες μαθηματικών διανυσμάτων που δεν διατίθενται αλλού στην πλατφόρμα Java. Αυτές οι μαθηματικές πράξεις βρίσκονται επί του παρόντος στο javax.vecmath πακέτο και μπορεί να μεταφερθεί στην κεντρική πλατφόρμα στο μέλλον.

  • Το Java 3D υποστηρίζει έναν αριθμό εξωτικών συσκευών (ραβδιά, γάντια δεδομένων και ακουστικά, για παράδειγμα). ο com.sun.j3d.utils.trackers Το πακέτο που περιλαμβάνεται στην υλοποίηση της Sun παρέχει μαθήματα για συσκευές Fakespace, Logitech και Polhemus. Αυτές οι συσκευές δεν χρησιμοποιούνται ευρέως, επομένως, δεν θα τις συζητήσω με μεγάλη λεπτομέρεια. Εάν ενδιαφέρεστε να μάθετε περισσότερα σχετικά με την υποστήριξη συσκευών, ανατρέξτε στους ιστότοπους Java 3D της Sun και στο αρχείο λίστας αλληλογραφίας Java 3D (και οι δύο διατίθενται από τις κύριες διευθύνσεις URL της Sun Java 3D που περιλαμβάνονται στους παρακάτω πόρους).

Το Java 3D έχει πολλά πλεονεκτήματα, αλλά τι γίνεται με τα μειονεκτήματα; Περιλαμβάνουν:

  • Το Java 3D είναι ένα τυπικό API επέκτασης. Οι κάτοχοι άδειας πλατφόρμας Java έχουν την επιλογή να εφαρμόσουν το API εάν το επιθυμούν, αλλά δεν απαιτείται να το εφαρμόσουν. Η τοποθέτηση του Java 3D ως τυπικής επέκτασης διατρέχει τον κίνδυνο μείωσης της φορητότητας του κώδικα Java 3D σε όλες τις πλατφόρμες - οι περισσότεροι προμηθευτές πρέπει να αγωνιστούν να συμβαδίζουν με τις αλλαγές και τις προσθήκες στην κεντρική πλατφόρμα μόνο.

  • Το Java 3D έχει σοβαρούς περιορισμούς διαθεσιμότητας. Αυτά είναι το αποτέλεσμα της κατάστασης Java 3D ως API επέκτασης. Ο μόνος μεγάλος προμηθευτής που παρέχει αυτήν τη στιγμή μια υλοποίηση Java 3D είναι η Sun, με τις εφαρμογές της για Solaris και Win32. Σε σύγκριση με το OpenGL, το οποίο είναι διαθέσιμο για κάθε γούστο των Unix, Windows και πολλών άλλων λειτουργικών συστημάτων, η φορητότητα πολλαπλών πλατφορμών του κώδικα Java 3D φαίνεται αμφισβητήσιμη.

  • Μαζί με προβλήματα διαθεσιμότητας λογισμικού έρχονται ελλείμματα τεκμηρίωσης. Η Sun κάνει μια γενναία προσπάθεια να παρέχει εκπαίδευση προγραμματιστών και υποστήριξη για το Java 3D, αλλά εξακολουθεί να υπολείπεται σε σύγκριση με τις υπόλοιπες προσπάθειες του κλάδου στην τεκμηρίωση του OpenGL και της χρήσης του. Ο ιστότοπος του OpenGL Consortium είναι πολύ βαθύτερος και ευρύτερος από οτιδήποτε έχει καταφέρει να δημιουργήσει η Sun για το Java 3D μέχρι στιγμής. Αυτό δεν είναι ένα μικρό σημείο: η σχετική πολυπλοκότητα των τρισδιάστατων API γραφικών καθιστά απαραίτητη την καλή τεκμηρίωση.

  • Το Java 3D κρύβει λεπτομέρειες απόδοσης-αγωγού από τον προγραμματιστή. Επειδή το Java 3D είναι ένα API υψηλού επιπέδου, κρύβει σκόπιμα τις λεπτομέρειες του αγωγού απόδοσης από τον προγραμματιστή, γεγονός που το καθιστά ακατάλληλο για σημαντικό αριθμό προβλημάτων όπου είναι σημαντικές αυτές οι λεπτομέρειες. (Θα συζητήσουμε το μοντέλο χαμηλότερου επιπέδου του OpenGL και την πρόσβαση στον αγωγό απόδοσης αργότερα σε αυτήν τη σειρά 3D.)

  • Τα εξαρτήματα Java 3D είναι βαρέων βαρών. Δηλαδή, έχουν έναν γηγενή (εκτός Java) ομότιμο που κάνει την απόδοση. Αυτό μπορεί να περιπλέξει την ανάπτυξη του GUI σας εάν χρησιμοποιείτε το Java Swing και όλα τα Java, ή ελαφριά, συστατικά του. Υπάρχουν μερικές ειδικές λύσεις, αλλά σε γενικές γραμμές, τα ελαφριά και βαρέων βαρών εξαρτήματα δεν αναμιγνύονται καλά στα ίδια αντικείμενα και παράθυρα. Περισσότερες πληροφορίες σχετικά με προβλήματα εξαρτημάτων ελαφρού βάρους είναι διαθέσιμες από τους πόρους στο τέλος αυτού του άρθρου.

Εγκατάσταση Java 3D

Τώρα που κατανοούμε τα κύρια χαρακτηριστικά και τους περιορισμούς του Java 3D, ας ετοιμαστούμε να δοκιμάσουμε κάποιο παράδειγμα κώδικα.

Το Java 3D είναι διαθέσιμο σε beta για Win32 και Solaris. Οι πιο ώριμες από τις υλοποιήσεις της Java 3D της Sun είναι ενσωματωμένες στο OpenGL. Μια εφαρμογή Direct3D ποιότητας άλφα είναι επίσης διαθέσιμη για το Win32. Όλα απαιτούν Java 1.2, με την τελευταία Java 3D beta που αντιστοιχεί στο Java 1.2 Beta 4. Η Sun έχει υποσχεθεί να κυκλοφορήσει την τελική εφαρμογή Java 3D λίγο μετά την κυκλοφορία του Java 1.2, η οποία έχει προγραμματιστεί για τον Δεκέμβριο του 1998.

Ένα ελαφρώς συγκεχυμένο μέρος: Η Sun κυκλοφόρησε υλοποιήσεις Java 3D 1.0 alpha, οι οποίες αντιστοιχούσαν στο Java 3D 1.0 API, αλλά ποτέ δεν κυκλοφόρησε τίποτα πέρα ​​από το alpha για το 1.0 API. Στη συνέχεια η Sun τροποποίησε το API, απελευθερώνοντας την τροποποιημένη έκδοση ως το Java 3D 1.1 API. Αυτή η έκδοση ακολουθήθηκε με κυκλοφορίες από αυτό που ονόμασε 1.1 beta υλοποιήσεις, δύο μέχρι στιγμής. Η Sun έχει υποσχεθεί να κυκλοφορήσει ένα τελικό API και εφαρμογή λίγο μετά την τελική κυκλοφορία της πλατφόρμας Java 1.2. Ας ελπίσουμε ότι, το API έχει σταθεροποιηθεί και δεν θα αναβιώσει, για άλλη μια φορά, με τον κόσμο να περιμένει ακόμη μια τελική κυκλοφορία μιας υλοποίησης.

Επειδή θα καλύψουμε τις συνδέσεις Java OpenGL σε μια μελλοντική στήλη, αποφάσισα να εξοικονομήσω και να χρησιμοποιήσω την έκδοση OpenGL του Java 3D και σε αυτές τις οδηγίες εγκατάστασης. Εάν εγκαταστήσετε την έκδοση OpenGL για χρήση με αυτά τα παραδείγματα Java 3D, θα έχετε τις βιβλιοθήκες απόδοσης που χρειάζεστε για να εμφανιστούν αργότερα τα παραδείγματα Java-OpenGL.

Τα στοιχεία λογισμικού που χρειάζεστε για να χρησιμοποιήσετε το Java 3D είναι:

  • Java 3D runtime, διαθέσιμο από την Sun (απαιτείται δωρεάν σύνδεση Java Developer Connection). Βεβαιωθείτε ότι έχετε επιλέξει την έκδοση OpenGL του Java 3D για την πλατφόρμα σας (χρησιμοποιώ Win32). Από τώρα, το τελευταίο Win32 Java 3D για OpenGL είναι 1,1 Beta 2, στο java3d11-beta2-win32-opengl.exe και ζυγίζει περίπου 1,7 MB.

  • OpenGL 1.1, σε συνδυασμό με Windows NT 4.0 και Windows 95 OSR 2. Ωστόσο, εάν διαθέτετε την έκδοση OSR 1 των Windows 95, μπορείτε να πραγματοποιήσετε λήψη της υποστήριξης OpenGL. Η τελευταία εφαρμογή Windows 95-OpenGL 1.1 είναι διαθέσιμη από τη Microsoft ως opengl95.exe και είναι περίπου 0,5 MB.

  • Java 1.2, διαθέσιμο από την Sun. (Σημειώστε ότι καθώς γράφω αυτό, η Sun κυκλοφόρησε ένα νέο Java 1.2 - Release Candidate 1. Τα παραδείγματα θα ενημερωθούν για την πιο πρόσφατη κυκλοφορία το συντομότερο δυνατό.) Το Java 3D συνδέεται στην πλατφόρμα 1.2 και η Sun έχει δηλώσει java3d-interest mailing list που δεν ενδιαφέρεται να αποσυνδέσει το API και να προσπαθήσει να το κάνει διαθέσιμο με προηγούμενες εκδόσεις πλατφόρμας.

Προαιρετικά, μπορεί επίσης να θέλετε να κάνετε λήψη της τεκμηρίωσης Java 3D και του παραδείγματος κώδικα. Και οι δύο είναι διαθέσιμοι από τον ίδιο σύνδεσμο με τον Java 3D χρόνο εκτέλεσης.

Λάβετε υπόψη ότι δεν απαιτείται πλέον να ορίσετε τις μεταβλητές περιβάλλοντος CLASSPATH, ώστε τα εκτελέσιμα Java ή appletviewer να εντοπίσουν βιβλιοθήκες επέκτασης. Με το Java 1.2, η Sun δημιούργησε τελικά έναν τυπικό κατάλογο επέκτασης. Αυτός ο κατάλογος βρίσκεται στο / jre / lib / ext / στον κατάλογο εγκατάστασης του JDK. Για παράδειγμα, στο σύστημά μου, το Java 1.2 Beta 4 είναι εγκατεστημένο στη διεύθυνση:

Γ: \ jdk1.2beta4 \

και ο τυπικός κατάλογος επέκτασης βρίσκεται στη διεύθυνση:

C: \ jdk1.2beta4 \ jre \ lib \ ext \

Όλες οι βιβλιοθήκες επέκτασης θα πρέπει να τοποθετούν τα αρχεία βάζων τους σε αυτόν τον κατάλογο επεκτάσεων κατά τον χρόνο εγκατάστασης και όλα τα τυπικά εργαλεία JDK ξέρουν να αναζητούν εδώ για τα απαραίτητα αρχεία τάξης.

Για το Java 3D της Sun, αυτά τα αρχεία περιλαμβάνουν τόσο δημόσιες (τεκμηριωμένες στην προδιαγραφή Java 3D API) όσο και ιδιωτικές (συγκεκριμένες εφαρμογές Sun). Τα αρχεία δημόσιας τάξης περιλαμβάνουν:

  • j3dcore.jar - Περιέχει αρχεία κατηγορίας για το δημόσιο πακέτο Java 3D javax.media.j3d.

  • vecmath.jar - Περιέχει μαθήματα για javax.vecmath.

Τα ιδιωτικά αρχεία περιλαμβάνουν:

  • j3daudio.jar - Αρχείο του com.sun.j3d.audio τάξεις, οι οποίες δημιουργούν υποστήριξη για χωρικό ήχο πάνω από ένα προσαρμοσμένο αντίγραφο του τμήματος Java του Java Sound, μηχανή ήχου που βασίζεται στο Headspace, που κάνει ντεμπούτο στην Java 1.2.

  • j3dutils.jar - Ενσωματώνει μια ποικιλία κατηγοριών βοηθητικών προγραμμάτων Sun σε 16 συνολικά πακέτα και υποσυσκευασίες από κάτω com.sun.j3d. Θα εμβαθύνω σε αυτά τα πακέτα στη συνέχεια της συζήτησης Java 3D.

  • j3dutilscontrib.jar - Αρχείο χρήσιμων βοηθητικών προγραμμάτων που συνέβαλαν άλλοι στις προσπάθειες της Sun. Υπάρχουν επτά πακέτα κάτω από το com.sun.j3d ιεραρχία, συμπεριλαμβανομένου του com.sun.j3d.utils.trackers κωδικός που αναφέρθηκε παραπάνω. Και πάλι, η στήλη του επόμενου μήνα θα παρέχει περισσότερες πληροφορίες σχετικά με τα πακέτα σε αυτό το βάζο.

Σημειώστε ότι θεωρητικά μπορείτε να δημιουργήσετε και να καλέσετε μεθόδους σε οποιαδήποτε από τις τάξεις που παρέχονται σε μη τυποποιημένα πακέτα όπως com.sun, αλλά προειδοποίηση: Δεν υπάρχει εγγύηση ότι θα είναι διαθέσιμα στην πλατφόρμα στην οποία εκτελεί ο κώδικάς σας. Στην τρέχουσα πρακτική, το Java 3D είναι διαθέσιμο μόνο από την Sun, οπότε πολλοί προγραμματιστές χρησιμοποιούν, στην πραγματικότητα, τάξεις εντός των ιδιωτικών αρχείων της Sun. Θα πρέπει να γνωρίζετε την πιθανή αντιστάθμιση της φορητότητας που συνεπάγεται η επιλογή να το πράξει.

Δεν υπάρχει καμία μαγεία στον τρόπο με τον οποίο οι δημόσιες και ιδιωτικές τάξεις 3D 3D διασυνδέονται με πόρους συστήματος. Η Sun εγκαθιστά εγγενείς βιβλιοθήκες στο J3D.dll και j3daudio.dll σύμφωνα με το / jre / κάδος / Ευρετήριο. Οι τάξεις Java 3D χρησιμοποιούν εγγενείς μεθόδους για την κλήση αυτών των DLL και τη διασύνδεση με την πλατφόρμα Win32 και τη βιβλιοθήκη απόδοσης OpenGL. (Παρόμοιες βιβλιοθήκες υπάρχουν για εφαρμογές του Solaris.)

Μια τελευταία σημείωση για την εγκατάσταση: Ο αγωγός απόδοσης OpenGL έχει σχεδιαστεί για να εκμεταλλευτεί το υλικό επιτάχυνσης OpenGL για να επιταχύνει τις εφαρμογές γραφικών σας. Ωστόσο, για τους σκοπούς αυτής της στήλης, θα πρέπει να μπορείτε να πειραματιστείτε με τα παραδείγματα χωρίς κανένα ειδικό υλικό. (Στην πραγματικότητα, αναπτύσσω όλα τα παραδείγματα σε έναν φορητό υπολογιστή Pentium 150-MHz MMX χωρίς υλικό επιτάχυνσης OpenGL.) Εάν ενδιαφέρεστε για κάρτες επιτάχυνσης, θα πρέπει να ανατρέξετε στον ιστότοπο του OpenGL ή στη λίστα αλληλογραφίας Java 3D ( δείτε πόρους) για περισσότερες πληροφορίες. Σκοπεύω να συμπεριλάβω λίγο περισσότερες πληροφορίες στη στήλη Java 3D του επόμενου μήνα σχετικά με το υλικό επιτάχυνσης.

Κατασκευή του κλάδου προβολής της σκηνής

Όπως προανέφερα, ένα από τα μεγαλύτερα δυνατά σημεία του γράφημα σκηνής Το μοντέλο γραφικών είναι ότι επιτρέπει στους άπειρους προγραμματιστές γραφικών να προσθέσουν 3D στις εφαρμογές τους. Παραδοσιακά, οι τρισδιάστατοι προγραμματιστές έπρεπε να καθορίσουν πού και πώς σχεδιάζονται μεμονωμένες γραμμές ή άλλα πρωτότυπα γραφικά. Χρησιμοποιώντας ένα γράφημα σκηνής, ωστόσο, ο προγραμματιστής δημιουργεί απλώς μια δομή που μοιάζει με δέντρο που περιέχει κόμβους που αντιπροσωπεύουν αντικείμενα προς απόδοση καθώς και οδηγίες απόδοσης (όπως όπου βρίσκεται το σημείο προβολής που εμφανίζεται στην οθόνη, φυσική γεωμετρία του 3D κόσμου ο προγραμματιστής δημιουργεί και σχετικές αποστάσεις μεταξύ των πραγμάτων).