Programmazione grafica 3D in Java, Parte 1: Java 3D

Per creare una vera piattaforma Java, Sun si rese presto conto che era necessario completare il quadro API oltre alle funzionalità limitate disponibili nella piattaforma core Java 1.0. Sun ha sviluppato molto il core con le versioni 1.1 e 1.2 imminenti, ma mancano ancora alcuni pezzi del puzzle Java.

Sun ei suoi partner hanno sviluppato le API Java Media and Communication per fornire i pezzi di programmazione multimediale mancanti. Due dei pezzi più grandi, la grafica 2D e 3D, sono mirati rispettivamente con le API Java 2D e 3D. Java 2D è un'API della piattaforma principale che inizia con Java 1.2, mentre Java 3D verrà rilasciato come API di estensione poco dopo che la piattaforma 1.2 sarà disponibile. Abbiamo recentemente terminato una serie di colonne su Java 2D; ora rivolgiamo la nostra attenzione a Java 3D.

Java 3D ha lo scopo di fornire agli sviluppatori Java la capacità di scrivere applet e applicazioni che forniscono agli utenti contenuti interattivi tridimensionali. Sun ha una forte concorrenza da altre tecnologie grafiche 3D in questo campo, e Java 3D ha davanti a sé una dura battaglia se vuole sconfiggere lo standard grafico in carica, OpenGL.

Una richiesta di commenti da parte dei lettori sulle API grafiche 3D per Java ha indicato un serio interesse per i collegamenti Java 3D e Java OpenGL, quindi ho deciso di concentrare i miei sforzi su queste tecnologie nei prossimi mesi.

Un interesse più limitato è stato espresso in VRML. Di conseguenza, mi occuperò del VRML dimostrando il suo utilizzo in Java 3D con i caricatori di contenuti VRML97 e il browser Java 3D VRML97 di Sun. Direct3D ha ricevuto pochissimo interesse, quindi ho deciso di non seguire questa strada, se non per menzionare dove una delle altre tecnologie potrebbe supportarla o interagire con essa.

Pro e contro di Java 3D

Questo mese iniziamo il nostro tour delle API grafiche 3D per Java esplorando Java 3D. Inizieremo discutendo alcuni dei principali punti di forza e di debolezza dell'API. La grafica 3D può sembrare a volte piuttosto ottusa e, quindi, può essere difficile da spiegare. Se hai ancora dubbi sui miei esempi o spiegazioni, non esitare a scrivermi con le tue domande o commenti e farò del mio meglio per affrontarli.

Punti di vendita per Java 3D:

  • Fornisce una vista orientata agli oggetti di alto livello della grafica 3D. Java 3D realizza questo in parte utilizzando un modello grafico 3D basato su grafici di scena . (Discuteremo questo concetto più dettagliatamente più avanti nell'articolo). Questo approccio ha lo scopo di aiutare i programmatori senza molta esperienza di programmazione grafica o multimediale a utilizzare il 3D nelle loro applicazioni. In netto contrasto con le API 3D procedurali di livello inferiore come OpenGL, progettate per ottimizzare la massima velocità possibile e dare ai programmatori il massimo controllo possibile sul processo di rendering, Java 3D è pensato per essere abbastanza semplice da consentire a qualsiasi programmatore Java esperto di imparare.

  • Se non è necessario un accesso di basso livello alle operazioni di rendering, Java 3D potrebbe essere un'opzione. L'accesso al rendering è limitato alle richieste tramite attributi e bit di capacità, simili per forma e funzione ai suggerimenti di rendering di Java 2D. (Vedi Risorse per i collegamenti alla mia serie precedente su Java 2D, che includeva discussioni ed esempi di suggerimenti per il rendering 2D).

  • Java 3D è ottimizzato per la velocità ove possibile. Il runtime utilizza i bit di capacità di rendering, infatti, per ottimizzare il grafico della scena per i rendering più veloci possibili. Questo approccio rende Java 3D più applicabile agli ambienti grafici interattivi (giochi, simulazioni, situazioni a bassa latenza) che alle applicazioni grafiche offline di alta qualità (come le render farm).

  • È disponibile un numero elevato e crescente di caricatori 3D per importare contenuti nel runtime Java 3D. Sun ha reso disponibile gratuitamente un caricatore di file Java 3D VRML97 e un browser con il codice. Cerca la colonna Programmazione multimediale del mese prossimo per esplorare i caricatori Java 3D in modo più dettagliato.

  • Java 3D richiede funzionalità di matematica vettoriale non disponibili altrove nella piattaforma Java. Queste operazioni matematiche si trovano attualmente nel javax.vecmathpacchetto e potrebbero essere spostate nella piattaforma principale in futuro.

  • Java 3D supporta una serie di dispositivi esotici (bacchette, guanti per dati e cuffie, ad esempio). Il com.sun.j3d.utils.trackerspacchetto incluso nell'implementazione di Sun fornisce classi per dispositivi Fakespace, Logitech e Polhemus. Questi dispositivi, tuttavia, non sono ampiamente utilizzati, quindi non li discuterò in dettaglio. Se sei interessato a saperne di più sul supporto dei dispositivi, fai riferimento ai siti Java 3D di Sun e all'archivio della mailing list Java 3D (entrambi disponibili dagli URL principali di Sun Java 3D inclusi nelle Risorse di seguito).

Java 3D ha molti vantaggi, ma per quanto riguarda i contro? Loro includono:

  • Java 3D è un'API di estensione standard. I licenziatari della piattaforma Java hanno la possibilità di implementare l'API se lo desiderano, ma non sono tenuti a implementarla. Il posizionamento di Java 3D come estensione standard rischia di ridurre la portabilità del codice Java 3D tra le piattaforme: la maggior parte dei fornitori deve lottare per tenere il passo con le modifiche e le aggiunte alla sola piattaforma principale.

  • Java 3D ha gravi limitazioni di disponibilità. Questi sono il risultato dello stato di Java 3D come API di estensione. L'unico importante fornitore che attualmente fornisce un'implementazione Java 3D è Sun, con le sue implementazioni per Solaris e Win32. Rispetto a OpenGL, disponibile per ogni tipo di Unix, Windows e molti altri sistemi operativi, la portabilità multipiattaforma del codice Java 3D sembra discutibile.

  • Insieme ai problemi di disponibilità del software vengono i deficit di documentazione. Sun sta compiendo uno sforzo coraggioso per fornire formazione agli sviluppatori e supporto per Java 3D, ma è ancora insufficiente rispetto al resto degli sforzi del settore per documentare OpenGL e il suo utilizzo. Il sito Web del consorzio OpenGL è molto più ampio e profondo di qualsiasi cosa Sun sia riuscita a mettere insieme per Java 3D finora. Questo non è un punto minore: la relativa complessità delle API grafiche 3D rende necessaria una buona documentazione.

  • Java 3D nasconde i dettagli della pipeline di rendering allo sviluppatore. Poiché Java 3D è un'API di alto livello, nasconde intenzionalmente i dettagli della pipeline di rendering allo sviluppatore, il che lo rende inadatto per un numero significativo di problemi in cui tali dettagli sono importanti. (Discuteremo il modello di livello inferiore di OpenGL e l'accesso alla pipeline di rendering più avanti in questa serie 3D.)

  • I componenti Java 3D sono pesanti. Cioè, hanno un peer nativo (non Java) che esegue effettivamente il rendering. Questo può complicare lo sviluppo della GUI se utilizzi Java Swing e i suoi componenti interamente Java, o leggeri. Ci sono alcune soluzioni alternative speciali, ma in generale, i componenti leggeri e pesanti non si mescolano bene negli stessi oggetti contenitore e finestre. Ulteriori informazioni sui problemi dei componenti leggeri-pesanti sono disponibili nelle risorse alla fine di questo articolo.

Installazione di Java 3D

Ora che abbiamo compreso le principali caratteristiche e limitazioni di Java 3D, prepariamoci a provare un codice di esempio.

Java 3D è disponibile in versione beta per Win32 e Solaris. La più matura delle implementazioni Sun di Java 3D è basata su OpenGL. Per Win32 è disponibile anche un'implementazione di Direct3D di qualità alfa. Tutti richiedono Java 1.2, con l'ultima beta di Java 3D corrispondente a Java 1.2 Beta 4. Sun ha promesso di rilasciare l'implementazione finale di Java 3D poco dopo il rilascio di Java 1.2, attualmente previsto per dicembre 1998.

A parte un po 'di confusione: Sun ha rilasciato le implementazioni alpha di Java 3D 1.0, che corrispondevano all'API Java 3D 1.0, ma non ha mai rilasciato nulla oltre all'alfa per l'API 1.0. Sun ha quindi modificato l'API, rilasciando la versione modificata come API Java 3D 1.1. Questa versione è stata seguita con i rilasci di ciò che ha chiamato implementazioni beta 1.1, due finora. Sun ha promesso di rilasciare un'API finale e un'implementazione poco dopo il rilascio finale della piattaforma Java 1.2. Si spera che l'API si sia stabilizzata e non venga rivista, ancora una volta, con il mondo ancora in attesa di una versione finale autentica di un'implementazione.

Poiché tratteremo i collegamenti Java OpenGL in una colonna futura, ho deciso di risparmiare e utilizzare la versione OpenGL di Java 3D anche in queste istruzioni di installazione. Se installi la versione OpenGL da usare con questi esempi Java 3D, avrai le librerie di rendering necessarie per gli esempi Java-OpenGL che verranno successivamente.

I componenti software necessari per utilizzare Java 3D sono:

  • Runtime Java 3D, disponibile da Sun (è richiesto l'accesso gratuito a Java Developer Connection). Assicurati di scegliere la versione OpenGL di Java 3D per la tua piattaforma (sto usando Win32). Al momento, l'ultimo Win32 Java 3D per OpenGL è 1.1 Beta 2, in java3d11-beta2-win32-opengl.exe, e pesa circa 1,7 MB.

  • OpenGL 1.1, in bundle con Windows NT 4.0 e Windows 95 OSR 2. Se hai la versione OSR 1 di Windows 95, però, puoi scaricare il supporto OpenGL. L'ultima implementazione di Windows 95-OpenGL 1.1 è disponibile da Microsoft come opengl95.exe e occupa circa 0,5 MB.

  • Java 1.2, disponibile da Sun. (Si noti che mentre scrivo questo, Sun ha rilasciato un nuovo Java 1.2 - Release Candidate 1. Gli esempi verranno aggiornati per l'ultima versione il prima possibile.) Java 3D è accoppiato alla piattaforma 1.2 e Sun ha dichiarato sul java3d-interest mailing list che non ha interesse a disaccoppiare l'API e provare a renderla disponibile con le versioni precedenti della piattaforma.

Facoltativamente, potresti anche voler scaricare la documentazione Java 3D e il codice di esempio. Entrambi sono disponibili dallo stesso collegamento del runtime Java 3D.

Si noti che non è più necessario impostare le variabili di ambiente CLASSPATH affinché i propri eseguibili java o appletviewer trovino le librerie di estensioni. Con Java 1.2, Sun ha finalmente creato una directory di estensione standard. Questa directory si trova in / jre / lib / ext / all'interno della directory di installazione di JDK. Ad esempio, sul mio sistema, Java 1.2 Beta 4 è installato in:

C:\jdk1.2beta4\

e la directory dell'estensione standard si trova in:

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

Tutte le librerie di estensioni dovrebbero posizionare i propri archivi jar in questa directory delle estensioni al momento dell'installazione e tutti gli strumenti JDK standard sanno di cercare qui i file di classe necessari.

Per Java 3D di Sun, questi archivi includono classi sia pubbliche (documentate nella specifica API Java 3D) che private (specifiche dell'implementazione Sun). Gli archivi delle classi pubbliche includono:

  • j3dcore.jar- Contiene file di classe per il pacchetto Java 3D pubblico javax.media.j3d.

  • vecmath.jar- Contiene classi per javax.vecmath.

Gli archivi privati ​​includono:

  • j3daudio.jar- Archivia le com.sun.j3d.audioclassi, che creano il supporto per l'audio spazializzato sopra una copia personalizzata della porzione Java del motore audio Java Sound, basato su Headspace, che debutta in Java 1.2.

  • j3dutils.jar- Incapsula una varietà di classi di utilità Sun in 16 pacchetti totali e sottopacchetti sottostanti com.sun.j3d. Approfondirò questi pacchetti nel prosieguo del mese prossimo della nostra discussione su Java 3D.

  • j3dutilscontrib.jar- Archivia le utilità utili fornite da altri agli sforzi di Sun. Ci sono sette pacchetti sotto la com.sun.j3dgerarchia, incluso il com.sun.j3d.utils.trackerscodice sopra menzionato. Di nuovo, la colonna del mese prossimo fornirà maggiori informazioni sui pacchetti in questo jar.

Nota che in teoria puoi istanziare e chiamare metodi su una qualsiasi delle classi fornite in pacchetti non standard come com.sun, ma avvertimento : non c'è garanzia che saranno disponibili sulla piattaforma su cui viene eseguito il codice. Nella pratica corrente, Java 3D è disponibile solo da Sun, quindi molti sviluppatori utilizzano le classi all'interno degli archivi privati ​​di Sun. È necessario essere consapevoli del potenziale compromesso in termini di portabilità che comporta la scelta di farlo.

Non c'è nemmeno magia nel modo in cui le classi Java 3D pubbliche e private si interfacciano con le risorse di sistema. Sun installa le librerie native nella J3D.dlle j3daudio.dllsotto la /jre/bin/directory. Le classi Java 3D utilizzano metodi nativi per chiamare queste DLL e interfacciarsi con la piattaforma Win32 e la libreria di rendering OpenGL. (Esistono librerie simili per le implementazioni di Solaris.)

Una nota finale sull'installazione: la pipeline di rendering OpenGL è progettata per sfruttare l'hardware di accelerazione OpenGL per velocizzare le applicazioni grafiche. Ai fini di questa colonna, tuttavia, dovresti essere in grado di sperimentare gli esempi senza alcun hardware speciale. (In effetti, sto sviluppando tutti gli esempi su un laptop MMX Pentium da 150 MHz senza hardware di accelerazione OpenGL.) Se sei interessato alle schede di accelerazione, dovresti fare riferimento al sito Web OpenGL o alla mailing list Java 3D ( vedi Risorse) per ulteriori informazioni. Ho in programma di includere un po 'più di informazioni nella colonna Java 3D del prossimo mese anche sull'hardware di accelerazione.

Costruire il ramo della vista della scena

Come ho notato in precedenza, uno dei maggiori punti di forza del modello grafico del grafico di scena è che consente ai programmatori grafici inesperti di aggiungere il 3D alle loro applicazioni. Tradizionalmente, i programmatori 3D dovevano specificare dove e come disegnare le singole linee o altre primitive grafiche. Utilizzando un grafico di scena, tuttavia, il programmatore crea semplicemente una struttura ad albero contenente i nodi che rappresentano gli oggetti da renderizzare così come le istruzioni di rendering (come dove si trova il punto di vista visualizzato sul monitor, la geometria fisica del mondo 3D il programmatore sta creando e distanze relative tra le cose).