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

Γεια σας JOGL

Εδώ και μερικά χρόνια, ένας προγραμματιστής που ήθελε να δημιουργήσει ένα πρόγραμμα υψηλής έντασης γραφικών που θα μπορούσε να πωληθεί σε χρήστες διαφορετικών λειτουργικών συστημάτων είχε μια επιλογή - το OpenGL. Το GL σημαίνει βιβλιοθήκη γραφικών. Το OpenGL είναι σήμα κατατεθέν της SGI. Το OpenGL εκδηλώνεται ως API προγραμματισμού πολλαπλής πλατφόρμας C. Στην πραγματικότητα, ωστόσο, είναι μια ανεξάρτητη από το υλικό προδιαγραφή για μια διεπαφή προγραμματισμού.

Το OpenGL είναι για τη δημιουργία γραφικών. Ειναι ΓΡΗΓΟΡΟ. Τις περισσότερες φορές, είναι επιταχυνόμενο υλικό. Φαίνεται ότι το OpenGL μπορεί να κάνει οτιδήποτε οπτικά που θα θέλατε να κάνετε.

Δυστυχώς, το OpenGL είναι γραμμένο για C. Ας το παραδεχτούμε, το C δεν είναι η πιο δημοφιλής γλώσσα για προγραμματισμό σύνθετων εφαρμογών. Ένα από τα μεγαλύτερα μειονεκτήματα για το OpenGL είναι ότι δεν μπορείτε να κάνετε κάτι χωρίς παράθυρο για να βάλετε τα γραφικά σας, αλλά το OpenGL δεν παρέχει μέσα για να δημιουργήσετε παράθυρα. Αυτό καθιστά το OpenGL δύσκολο να μάθει για αρχάριους.

Ευτυχώς, το GLUT (OpenGL Utility Toolkit) παρουσιάστηκε και διευκολύνθηκε η αντιμετώπιση των παραθύρων, των κουμπιών και των εκδηλώσεων που δημιουργούνται από τους χρήστες. Ωστόσο, η εκμάθηση OpenGL σε C ή ακόμα και C ++ μπορεί να είναι επώδυνη για νέους προγραμματιστές ή προγραμματιστές που θέλουν να χρησιμοποιούν πραγματικό αντικειμενοστρεφή προγραμματισμό.

Τότε ήρθε JOGL

Η Java είναι πιθανώς η πιο δημοφιλής πραγματική αντικειμενοστρεφής γλώσσα προγραμματισμού. Έχουν γίνει πολλές προσπάθειες να παντρευτούν το OpenGL με την Java, αλλά η πρώτη που έκανε όλους να σηκωθούν και να προσέξουν ήταν οι Java Bindings για το OpenGL ή το JOGL. Ο λόγος για αυτό είναι ότι αυτή η προσπάθεια υποστηρίζεται από την Sun Microsystems (οι δημιουργοί της Java) και η SGI (οι δημιουργοί του OpenGL).

Σήμερα, το JOGL αναπτύσσεται από τον όμιλο τεχνολογίας παιχνιδιών στο Sun. Ξεκίνησε τη ζωή καθώς η Jungle αναπτύχθηκε από τους Ken Russel και Chris Kline. Ο Russell είναι υπάλληλος της Sun που εργάζεται στην HotSpot Virtual Machine με πολυετή εμπειρία 3D. Το Kline λειτουργεί για Irrational Games και είναι επίσης πολύ έμπειρο με 3D γραφικά.

Είμαι προσωπικά ευγνώμων για τις προσπάθειές τους και τις προσπάθειες όλων αυτών που εργάζονται στο JOGL. Έχουν γίνει αρκετές προσπάθειες για την παροχή πρόσβασης στο OpenGL μέσω ενός φιλικού Java API - μεταξύ αυτών ήταν το Java 3D, το OpenGL για Java Technology (gl4java) και το Lightweight Java Game Library (LWJGL). Το JOGL είναι το πρώτο που ένιωσα άνετα.

Το JOGL είναι ένα σύνολο δεσμεύσεων κλάσης Java που υποστηρίζονται από τον Ήλιο για το OpenGL. Ουάου! Αυτό ήταν ένα μπουκιά.

Το OpenGL χρησιμοποιείται για την εμφάνιση τρισδιάστατων μοντέλων. Είναι ισχυρό, γρήγορο και ίσως το μεγαλύτερο πράγμα που μπορεί να συμβεί στην Java από την εισαγωγή του Swing. Χρησιμοποιώντας το OpenGL μέσω του JOGL, θα μπορείτε να φτιάξετε υπέροχα παιχνίδια ή καταστάσεις μοντέλων που θα μπορούσαν να είναι πολύ ακριβά για τη δημιουργία. Έχουν γραφτεί παχύ τόμοι που περιγράφουν το OpenGL. Θα είναι χρήσιμα μόλις γνωρίζετε το δρόμο σας, αλλά όχι ακόμα. Πρέπει να μάθετε πώς όλα αυτά ισχύουν για τα Java API που εκθέτουν το OpenGL σε εσάς. Χρειάζεστε επίσης μερικές βασικές εισαγωγές net.java.games.jogl. * και ίσως μερικά αναψυκτικά στα μαθηματικά.

Έχεις JOGL;

Εάν θέλετε να χρησιμοποιήσετε το JOGL, θα πρέπει να λάβετε jogl.jar και τον συνοδευτικό εγγενή κωδικό του. Ονειρεύομαι την ημέρα που είναι στάνταρ με την εγκατάσταση Java, αλλά προς το παρόν αυτό είναι απλά ένα καλό όνειρο.

Το πρώτο κόλπο είναι να βρείτε τα δυαδικά αρχεία για το λειτουργικό σας σύστημα και να τα εξαγάγετε. Τα βρήκα στο //games-binaries.dev.java.net/build/index.html. Κάθε λειτουργικό σύστημα είναι διαφορετικό, αλλά υπάρχουν δύο μέρη στην εγκατάσταση. ο jogl.jar πρέπει να τοποθετηθεί στο classpath του συστήματος, και η δυαδική βιβλιοθήκη πρέπει να τοποθετηθεί όπου πηγαίνουν βιβλιοθήκες στο λειτουργικό σας σύστημα. Εάν είστε τυχεροί, θα έχετε ένα πρόγραμμα εγκατάστασης για να το κάνετε για εσάς. Εάν δεν έχετε πρόγραμμα εγκατάστασης και δεν ξέρετε πού να αναζητήσετε πληροφορίες σχετικά με την τοποθέτηση όλων στον υπολογιστή σας, μπορείτε να ξεκινήσετε με τους συνδέσμους που έχω δώσει στους πόρους. Το πρώτο μας παράδειγμα κώδικα θα γραφτεί ειδικά για να ελέγξει εάν έχετε εγκαταστήσει τα πάντα σωστά, οπότε δεν χρειάζεται να τονίσετε τον έλεγχο της εγκατάστασής σας μέχρι τότε.

Javadocs για JOGL

Τα Javadocs μπορούν να ληφθούν στην ίδια θέση με τη δυαδική διανομή του JOGL. Το Javadocs θα ονομάζεται κάτι παρόμοιο με jogl-1.0-usrdoc.tar.

Εάν περιηγηθείτε στο net.java.games.jogl πακέτο, θα παρατηρήσετε γρήγορα ότι ορισμένα από τα μαθήματα είναι τεράστια. Το GL είναι ένα τέλειο παράδειγμα αυτού. Μην αναβάλλετε από αυτό. Θα ανακαλύψετε γρήγορα ότι είστε σε θέση να κάνετε κάποια πολύ περίπλοκη δουλειά ακόμα και με λίγη γνώση JOGL. Τα μαθήματα που ίσως θέλετε να ρίξετε μια ματιά είναι:

  • GLD Σχεδίαση
  • GLC καμβάς
  • GLJPanel
  • GLC ικανότητες
  • GLDrawableFactory

Αυτά θα είναι η βασική σας διεπαφή στον κόσμο των γραφικών. Αν θυμάστε, νωρίτερα ανέφερα ότι ένα από τα μεγαλύτερα μειονεκτήματα για τους αρχάριους που μαθαίνουν το OpenGL είναι η έλλειψη ενός τυπικού συστήματος. Το GLUT βοηθάει σε μεγάλο βαθμό σε σχέση με τα αντίστοιχα C, αλλά έχουμε το Swing και το AWT (Abstract Window Toolkit). Είναι πολύ πιθανό να έχετε ήδη χρησιμοποιήσει AWT ή Swing, οπότε δεν θα αισθανθείτε ότι μαθαίνετε τα πάντα από το μηδέν. Αυτό είναι ένα καλό πράγμα. Μετά από μια πολύ σύντομη εισαγωγή για την εμφάνιση ενός στοιχείου για το JOGL στην οθόνη, δεν θα χρειαζόμαστε πολλή δουλειά για να σας εκτελέσουμε αρκετά δροσερές και ισχιακές εφαρμογές!

GlueGen ... σχεδόν τόσο δροσερό όσο το JOGL;

Όπως θα πρέπει να γνωρίζετε, το OpenGL είναι γραμμένο για προγραμματιστές C. Αυτό σημαίνει ότι για να το εκμεταλλευτεί η Java, πρέπει να υπάρχει κάποια εγγενής διεπαφή. Αυτό σημαίνει ότι το JNI (Java Native Interface), το οποίο δεν είναι διασκεδαστικό ή όμορφο, πρέπει να γραφτεί για να γίνει αυτή η σύνδεση. Το OpenGL είναι αρκετά μεγάλο. Η σύνταξη όλων αυτών των συνδέσεων απαιτεί χρόνο. Για να κάνουμε τα πράγματα λίγο πιο δύσκολα, υπάρχουν πολλές δυνατότητες για συγκεκριμένους προμηθευτές και το OpenGL συνεχίζει να βελτιώνεται, πράγμα που σημαίνει ότι υπάρχουν αλλαγές που πρέπει να ακολουθήσουμε. Εν ολίγοις, ήταν πολύ δύσκολο για τον «καθένα» που προσπαθεί να συμβαδίσει με το OpenGL για να γράψει μια Java σε εγγενή διεπαφή που περιλαμβάνει όλα.

Μπείτε στο JOGL. Αποφάσισαν να επωφεληθούν από τα αρχεία κεφαλίδας C και να γράψουν κάποιο κώδικα που θα έκανε όλη την εργασία JNI για αυτά. Το ονόμασαν GlueGen. Το GlueGen αναλύει τα αρχεία κεφαλίδας C και στη συνέχεια δημιουργεί μαγικά τον απαραίτητο κώδικα Java και JNI που είναι απαραίτητος για τη σύνδεση σε αυτές τις εγγενείς βιβλιοθήκες. Αυτό σημαίνει ότι οι ενημερώσεις στο OpenGL μπορούν να προστεθούν γρήγορα στο JOGL.

Γειά σου Κόσμε!

Είμαι σταθερός πιστός στην παράδοση, οπότε φυσικά θα ξεκινήσουμε με ένα «Γεια σας Κόσμος». Αυτό το Hello World θα εξετάσει την εγκατάστασή μας και θα μας πει εάν όλα ή μέρος έχουν εγκατασταθεί σωστά. Θυμηθείτε ότι υπάρχουν δύο μέρη στην εγκατάσταση JOGL. Υπάρχει η βιβλιοθήκη Java σε ένα αρχείο βάζου και ο εγγενής κωδικός σε άλλη βιβλιοθήκη.

Εδώ είναι το πρόγραμμά μας:

εισαγωγή net.java.games.jogl. *;

δημόσια τάξη HelloWorld {public static void main (String args []) {try {System.loadLibrary ("jogl"); System.out.println ("Hello World! (Οι εγγενείς βιβλιοθήκες είναι εγκατεστημένες.)"); Όρια GLCapabilities = νέα GLCapabilities (); System.out.println ("Γεια σας JOGL! (Το βάζο φαίνεται να είναι διαθέσιμο.)"); } catch (Εξαίρεση e) {System.out.println (e); }}}

Αρχικά, αυτό το πρόγραμμα ελέγχει για να διαπιστώσει εάν οι εγγενείς βιβλιοθήκες και οι βιβλιοθήκες Java έχουν εγκατασταθεί σωστά. Το JOGL εγκαθίσταται σωστά μόνο όταν το jogl.jar και η εγγενής βιβλιοθήκη, που ονομάστηκε κάτι σαν libjogl.jnilib ή jogl.dll, είναι εγκατεστημένα και τα δύο. Εάν η εγγενής βιβλιοθήκη δεν είναι προσβάσιμη, αυτό το πρόγραμμα θα ρίξει ένα java.lang.UnsatisfiedLinkError εξαίρεση. Εάν το JAR δεν είναι εγκατεστημένο στο classpath, τότε το πρόγραμμα δεν θα μεταγλωττιστεί. Ο μεταγλωττιστής javac θα πει κάτι παρόμοιο με το πακέτο net.java.games.jogl δεν υπάρχει. "Όταν αυτή η τάξη μεταγλωττίζεται και εκτελείται χωρίς εξαιρέσεις, είστε έτοιμοι να συνεχίσετε να μαθαίνετε το JOGL.

Ένα καλό πρότυπο

Ας προχωρήσουμε σε μερικά μαθήματα που μπορεί να σας φανούν χρήσιμα για χρήση ως πρότυπο, ενώ αναπαράγετε το JOGL. Τα έχω χρησιμοποιήσει ως πρότυπα περισσότερες από μία φορές. Μη διστάσετε να τα χρησιμοποιήσετε όσο θέλετε.

Αυτό το πρότυπο αποτελείται από δύο κατηγορίες. Το πρώτο είναι SimpleJoglApp φαίνεται παρακάτω, και το δεύτερο είναι SimpleGLEventListener εμφανίζεται μετά από μια σύντομη περιγραφή. Θα χρειαστεί να πληκτρολογήσετε και τα δύο για να μεταγλωττίσετε το πρότυπο. Η κύρια εφαρμογή:

εισαγωγή java.awt. *; εισαγωγή java.awt.event. *; εισαγωγή javax.swing. *; εισαγωγή net.java.games.jogl. *;

/ ** * Αυτή είναι μια βασική εφαρμογή JOGL. Μη διστάσετε να χρησιμοποιήσετε ξανά αυτόν τον κωδικό ή να τον τροποποιήσετε. * / Η δημόσια τάξη SimpleJoglApp επεκτείνει το JFrame {public static void main (String [] args) {final SimpleJoglApp app = new SimpleJoglApp ();

// δείξτε τι έχουμε κάνει SwingUtilities.invokeLater (νέο Runnable () {public void run () {app.setVisible (true);}}); }

δημόσια SimpleJoglApp () {// ορίστε τον τίτλο JFrame super ("Simple JOGL Application").

// σκοτώστε τη διαδικασία όταν το JFrame είναι κλειστό setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

// μόνο τρεις γραμμές κώδικα JOGL ... και εδώ είναι GLCapabilities glcaps = νέο GLCapabilities (); GLCanvas glcanvas = GLDrawableFactory.getFactory (). CreateGLCanvas (glcaps); glcanvas.addGLEventListener (νέο SimpleGLEventListener ());

// προσθέστε το GLCanvas όπως θα κάναμε οποιοδήποτε στοιχείο getContentPane (). add (glcanvas, BorderLayout.CENTER); setSize (500, 300);

// κεντράρετε το JFrame στο κέντρο της οθόνης Windows (αυτό); }

public void centerWindow (Component frame) {Dimension screenSize = Toolkit.getDefaultToolkit (). getScreenSize (); Διάσταση frameSize = frame.getSize ();

εάν (frameSize.width> screenSize.width) frameSize.width = screenSize.width; εάν (frameSize.height> screenSize.height) frameSize.height = screenSize.height;

frame.setLocation ((screenSize.width - frameSize.width) >> 1, (screenSize.height - frameSize.height) >> 1); }}

Αυτό είναι. Ας επικεντρωθούμε στις τρεις γραμμές κώδικα JOGL ειδικά σε αυτήν την πρώτη τάξη. Να ξεκινήσω:

GLCapilities glcaps = νέα GLCapabilities ();

Αυτό καθορίζει ποιες δυνατότητες OpenGL / γραφικών είναι διαθέσιμες στις βιβλιοθήκες JOGL και το JVM.

Επόμενο:

GLCanvas glcanvas = GLDrawableFactory.getFactory (). CreateGLCanvas (glcaps);

Δεν μπορούμε να δημιουργήσουμε GLC καμβάςes ή GLJPanelμικρό. Πρέπει να τα δημιουργήσουμε για εμάς GLDrawableFactory. Έτσι, ανακτούμε ένα GLDrawableFactory χρησιμοποιώντας GLDrawableFactoryη στατική μέθοδος, getFactory ().

Τώρα έχουμε ένα GLDrawableFactory, έτσι το χρησιμοποιούμε createGLCanvas () μέθοδος για τη δημιουργία GLC καμβάς να αντλήσω. Θα μπορούσαμε να χρησιμοποιήσουμε το δημιουργίαGLJPanel () Αντίθετα, εάν θέλαμε ένα στοιχείο Swing αντί για ένα στοιχείο AWT.

Παρατηρήστε ότι περάσαμε στο GLC ικανότητες αντικείμενο που δημιουργήσαμε νωρίτερα. Αυτό επιτρέπει το GLD Σχεδίαση δημιουργήσαμε για να δημιουργήσουμε σωστά.

Τέλος, είμαστε έτοιμοι να προσθέσουμε ένα GLEventListener στο GLC καμβάς:

glcanvas.addGLEventListener (νέο SimpleGLEventListener ());

Η εφαρμογή μας του GLEventListener είναι SimpleGLEventListener. Θα φροντίσει για οποιοδήποτε σχέδιο που πρέπει να γίνει όταν λαμβάνει μια κλήση από το GLD Σχεδίαση και το μοναδικό μας GLC καμβάς. Όπως θα δείτε, αποφάσισα να μην σχεδιάσω τίποτα σε αυτό το πρόγραμμα. Τώρα για το GLEventListener:

εισαγωγή java.awt. *; εισαγωγή java.awt.event. *; εισαγωγή net.java.games.jogl. *;

/ ** * Για τους σκοπούς μας, έχουν σημασία μόνο δύο από τα * GLEventListeners. Αυτά θα είναι * init () και θα εμφανίζονται (). * / Η δημόσια τάξη SimpleGLEventListener εφαρμόζει το GLEventListener {

/ ** * Φροντίστε να ξεκινήσετε εδώ. * / public void init (GLDrawable σχέδιο) {

}

/ ** * Φροντίστε να σχεδιάσετε εδώ. * / δημόσια κενή οθόνη (GLDrawable drawable) {

}

/ ** * Κλήθηκε όταν το GLDrawable (GLCanvas * ή GLJPanel) άλλαξε σε μέγεθος. Δεν θα το χρειαζόμαστε αυτό, αλλά μπορεί τελικά να το χρειαστείτε - όχι ακόμα. * / public void rechape (GLD Σχεδίαση με δυνατότητα σχεδίασης, int x, int y, int πλάτος, int ύψος) {}

/ ** * Εάν το βάθος της οθόνης αλλάξει κατά την εκτέλεση του προγράμματος * καλείται αυτή η μέθοδος. * Σήμερα αυτό δεν συμβαίνει πολύ, εκτός εάν ο προγραμματιστής το κάνει. * / public void displayChanged (GLDDrawable drawable, boolean modeChanged, boolean deviceChanged) {}}

Αυτή είναι η καρδιά του έργου JOGL που θα κάνουμε. Παρατηρήστε το γραφικό UML παρακάτω. SimpleJoglApp είναι ένα JFrame. Περιέχει το δικό μας GLD Σχεδίαση, που είναι στην πραγματικότητα ένα GLC καμβάς, αλλά μην του το πείτε αυτό. Προσθέτουμε το SimpleGLEventListener, το οποίο υλοποιεί GLEventListener στο GLC καμβάς έτσι το GLC καμβάς ξέρει ότι μας ενδιαφέρει αν θέλει να γίνει οποιαδήποτε εργασία OpenGL GLDrawables μπορεί να ακούσει το αυτί σας, οπότε θα θελήσετε να βεβαιωθείτε ότι έχετε GLEventListener έχει βελτιστοποιηθεί… για πραγματικό.

Αυτή η εφαρμογή μπορεί να φαίνεται λίγο αναμεμιγμένη ανάλογα με το λειτουργικό σας σύστημα. Αυτό πρέπει να αναμένεται, επειδή εμφανίζεται απλώς τυχαία κομμάτια μνήμης σε αυτό το σημείο. Οπότε συγχαρητήρια για τα νέα σας ταλέντα γραφικών.

Είστε έτοιμοι για το πραγματικό πράγμα

Αφού εξοικειωθείτε με το προηγούμενο παράδειγμα, κάντε μια όμορφη εικόνα.

Εδώ είναι η επόμενη εφαρμογή σας. Βεβαιωθείτε ότι έχετε πληκτρολογήσει αυτό και όλα τα παραδείγματα. Ο εντοπισμός σφαλμάτων και το χάος μαζί τους θα σας βοηθήσουν να μάθετε γρήγορα πώς λειτουργούν.