Programiranje 3D grafike na Javi, 1. dio: Java 3D

Da bi izgradio istinsku Java platformu, Sun je rano shvatio da treba ispuniti API sliku izvan ograničene funkcionalnosti dostupne na osnovnoj platformi Java 1.0. Sun je uvelike razvio jezgru s izdanjima 1.1 i predstojećim 1.2, ali još uvijek nedostaju dijelovi iz Java slagalice.

Sun i njegovi partneri razvili su Java Media and Communication API-je kako bi pružili nedostajuće multimedijske programske dijelove. Dva najveća komada, 2D i 3D grafika, ciljana su Java 2D i 3D API-jevima. Java 2D je API osnovne platforme koji započinje s Javom 1.2, dok će Java 3D biti objavljen kao Extension API ubrzo nakon što 1.2 platforma postane dostupna. Nedavno smo završili seriju stupaca o Javi 2D; sada skrećemo pozornost na Javu 3D.

Java 3D namijenjen je programerima Java za mogućnost pisanja apleta i aplikacija koje korisnicima pružaju trodimenzionalni, interaktivni sadržaj. Sun ima veliku konkurenciju od ostalih tehnologija 3D grafike u ovoj areni, a Java 3D je predusret ako želi pobijediti postojeći grafički standard OpenGL.

Zahtjev za komentarom čitatelja o API-jevima 3D grafike za Javu pokazao je ozbiljan interes za vezivanja Java 3D i Java OpenGL, pa sam odlučio koncentrirati svoje napore na ove tehnologije u narednim mjesecima.

Ograničeni iznos interesa izražen je u VRML-u. Slijedom toga, bavit ću se VRML-om demonstrirajući njegovu upotrebu u Javi 3D s VRML97 učitavačima sadržaja i Sunovim Java 3D VRML97 preglednikom. Direct3D je dobio vrlo malo interesa, pa sam odlučio ne ići tim putem, osim spomenuti gdje jedna od ostalih tehnologija može podržavati ili surađivati ​​s njom.

Prednosti i nedostaci Java 3D-a

Ovog mjeseca započinjemo obilazak API-ja za 3D grafiku za Javu istražujući Java 3D. Za početak ćemo raspraviti neke od glavnih snaga i slabosti API-ja. 3D grafika ponekad se može činiti prilično nejasnom i stoga je teško objasniti. Ako imate bilo kakve zabune oko mojih primjera ili objašnjenja, slobodno mi pišite sa svojim pitanjima ili komentarima, a ja ću se potruditi da ih riješim.

Prodajna mjesta za Java 3D:

  • Omogućuje objektno orijentirani prikaz 3D grafike na visokoj razini. Java 3D to djelomično postiže pomoću 3D grafičkog modela temeljenog na grafu scene . (O ovom ćemo konceptu detaljnije razgovarati kasnije u članku.) Ovaj pristup namijenjen je programerima koji nemaju puno grafičkog ili multimedijskog programiranja i koriste 3D u svojim aplikacijama. U potpunoj suprotnosti s proceduralnim 3D API-jevima niže razine poput OpenGL-a, koji su dizajnirani tako da optimiziraju za najbolju moguću brzinu i programerima pružaju najveću moguću kontrolu nad postupkom prikazivanja, Java 3D treba biti dovoljno izravan za bilo kojeg iskusnog Java programera da naučiti.

  • Ako vam nije potreban pristup na niskoj razini operacijama prikazivanja, Java 3D možda je opcija. Pristup prikazivanju ograničen je na zahtjeve putem atributa i bitova sposobnosti, sličnih po obliku i funkciji kao savjeti za generiranje Java 2D. (Pogledajte Resurse za poveznice do moje prethodne serije o Javi 2D, koja je uključivala raspravu i primjere savjeta za 2D prikazivanje).

  • Java 3D optimiziran je za brzinu tamo gdje je to moguće. Izvršenje koristi bitove mogućnosti prikazivanja, zapravo, za optimizaciju grafa scene za najbrže moguće rendere. Ovim pristupom Java 3D je primjenjiviji na interaktivno grafičko okruženje (igre, simulacije, situacije s malim kašnjenjem) nego na izvanmrežne visokokvalitetne grafičke programe (poput render farmi).

  • Dostupan je velik i sve veći broj 3D učitavača za uvoz sadržaja u Java 3D runtime. Sun je napravio Java 3D VRML97 učitavač datoteka i preglednik koji su slobodno dostupni s kodom. Potražite stupac Programiranje medija za sljedeći mjesec kako biste detaljnije istražili Java 3D učitavače.

  • Java 3D zahtijeva vektorske matematičke mogućnosti koje nisu dostupne drugdje na Java platformi. Te se matematičke operacije trenutno nalaze u javax.vecmathpaketu i u budućnosti mogu biti premještene na osnovnu platformu.

  • Java 3D podržava brojne egzotične uređaje (na primjer štapiće, podatkovne rukavice i slušalice). com.sun.j3d.utils.trackersPaket uključen u provedbu Sunca pruža klase za Fakespace, Logitech i Polhemus uređaja. Ti se uređaji, međutim, ne koriste široko, pa ih neću detaljno raspravljati. Ako ste zainteresirani da saznate više o podršci za uređaje, pogledajte Sun-ove Java 3D stranice i arhivu Java 3D mailing liste (obje dostupne iz glavnih Sun Java 3D URL-ova uključenih u donje resurse).

Java 3D ima puno prednosti, ali što je s minusima? Oni uključuju:

  • Java 3D je standardni API za proširenje. Vlasnici licence za Java platformu imaju mogućnost implementiranja API-ja ako žele, ali od njega se ne traži da ga implementiraju. Pozicioniranje Java 3D-a kao standardnog proširenja predstavlja rizik od smanjenja prenosivosti Java 3D koda na više platformi - većina dobavljača mora se boriti da održi korak s promjenama i dodacima samo jezgrene platforme.

  • Java 3D ima ozbiljna ograničenja dostupnosti. To su rezultat statusa Java 3D-a kao API-ja za proširenje. Jedini glavni dobavljač koji trenutno nudi Java 3D implementaciju je Sun sa svojim implementacijama za Solaris i Win32. U usporedbi s OpenGL-om, koji je dostupan za sve okuse Unixa, Windows-a i mnogih drugih operativnih sustava, prenosivost Java 3D koda s više platformi izgleda upitno.

  • Uz probleme s dostupnošću softvera dolazi i do nedostataka u dokumentaciji. Sun ulaže hrabre napore u pružanje obuke za programere i podršku za Javu 3D, ali još uvijek propada u usporedbi s ostalim naporima industrije u dokumentiranju OpenGL-a i njegove upotrebe. Web stranica konzorcija OpenGL daleko je dublja i šira od svega što je Sun do sada uspio sastaviti za Java 3D. To nije mala stvar: relativna složenost API-ja za 3D grafiku čini dobru dokumentaciju nužnom.

  • Java 3D od programera skriva pojedinosti cjevovoda za prikazivanje. Budući da je Java 3D API visoke razine, on programeru namjerno skriva pojedinosti cjevovoda prikazivanja, što ga čini neprikladnim za značajan broj problema u kojima su takvi detalji važni. (Razgovarat ćemo o modelu niže razine OpenGL-a i pristupu cjevovodu za prikazivanje kasnije u ovoj 3D seriji.)

  • Java 3D komponente su teške. Odnosno, oni imaju izvorni (ne-Java) vršnjak koji zapravo vrši renderiranje. To vam može zakomplicirati razvoj GUI-a ako koristite Java Swing i njegove potpuno Java-e ili lagane komponente. Postoje neka posebna rješenja, ali općenito, lagane i teške komponente ne miješaju se dobro u istim objektima spremnika i prozorima. Više informacija o problemima lakih i teških komponenata dostupno je iz Resursa na kraju ovog članka.

Instaliranje Java 3D-a

Sad kad razumijemo glavne značajke i ograničenja Java 3D-a, pripremimo se za isprobavanje primjera koda.

Java 3D dostupan je u beta verziji za Win32 i Solaris. Zrelije Sunčeve implementacije Java 3D izgrađene su na vrhu OpenGL-a. Implementacija Direct3D alfa kvalitete također je dostupna za Win32. Svi trebaju Java 1.2, s najnovijom Java 3D beta koja odgovara Java 1.2 Beta 4. Sun je obećao objaviti konačnu Java 3D implementaciju ubrzo nakon što objavi Java 1.2, koja je trenutno na rasporedu u prosincu 1998. godine.

Pomalo zbunjujuća strana: Sunce je objavilo Java 3D 1.0 alfa implementacije, koje odgovaraju Java 3D 1.0 API-ju, ali nikada nije objavilo ništa drugo osim alfe za 1.0 API. Sun je zatim izmijenio API, izdavši izmijenjenu verziju kao Java 3D 1.1 API. Ova verzija praćena je izdanjima onoga što je nazvala 1.1 beta implementacijama, dvije do sada. Sun je obećao objaviti konačni API i implementaciju ubrzo nakon konačnog izdanja platforme Java 1.2. Nadamo se da se API stabilizirao i neće biti ponovljen, a svijet još uvijek čeka konačno izdanje implementacije u bonafidu.

Budući da ćemo u budućem stupcu pokrivati ​​Java OpenGL vezove, odlučio sam uštedjeti i koristiti OpenGL verziju Java 3D u ovim uputama za instalaciju. Ako instalirate verziju OpenGL za upotrebu s ovim Java 3D primjerima, imat ćete knjižnice prikazivanja potrebne za kasnije primjere Java-OpenGL-a.

Softverske komponente koje su vam potrebne za korištenje Java 3D su:

  • Java 3D runtime, dostupno od Sunca (potrebna je besplatna prijava za Java Developer Connection). Svakako odaberite OpenGL verziju Java 3D za svoju platformu (koristim Win32). Od ovog trenutka najnovija Win32 Java 3D za OpenGL je 1.1 Beta 2 u java3d11-beta2-win32-opengl.exe i teška je približno 1,7 MB.

  • OpenGL 1.1, u paketu sa sustavom Windows NT 4.0 i Windows 95 OSR 2. Ako imate OSR 1 izdanje sustava Windows 95, možete preuzeti podršku za OpenGL. Najnovija implementacija sustava Windows 95-OpenGL 1.1 dostupna je od Microsofta kao opengl95.exe i iznosi približno 0,5 MB.

  • Java 1.2, dostupan od Sun. (Imajte na umu da je, dok ovo pišem, Sun objavio novi Java 1.2 - Release Candidate 1. Primjeri će se ažurirati za najnovije izdanje što je prije moguće.) Java 3D spojen je na platformu 1.2, a Sun je izjavio na java3d-interes mailing lista da nema interesa za razdvajanje API-ja i pokušaj da ga učini dostupnim s prethodnim izdanjima platforme.

Po želji, možda ćete htjeti preuzeti i Java 3D dokumentaciju i primjer koda. Obje su dostupne s iste veze kao i Java 3D runtime.

Imajte na umu da više niste potrebni za postavljanje varijabli okoline CLASSPATH kako bi vaše izvršne datoteke Java ili appletviewer pronašle knjižnice proširenja. S Javom 1.2, Sun je napokon stvorio standardni direktorij za proširenja. Ovaj se direktorij nalazi na / jre / lib / ext / unutar vašeg instalacijskog direktorija JDK. Na primjer, na mom sustavu Java 1.2 Beta 4 je instalirana na:

C:\jdk1.2beta4\

a standardni direktorij proširenja je na:

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

Sve biblioteke proširenja trebale bi smjestiti svoje jar arhive u ovaj direktorij proširenja u vrijeme instalacije, a svi standardni JDK alati znaju ovdje tražiti potrebne datoteke klasa.

Za Sunovu Java 3D, ove arhive uključuju i javne (dokumentirane u specifikaciji Java 3D API) i privatne (klase specifične za Sun implementaciju). Arhiva javnih razreda uključuje:

  • j3dcore.jar- Sadrži datoteke klase za javni Java 3D paket javax.media.j3d.

  • vecmath.jar- Sadrži klase za javax.vecmath.

Privatne arhive uključuju:

  • j3daudio.jar- Arhivira com.sun.j3d.audioklase koje grade podršku za prostorni zvuk povrh prilagođene kopije Java dijela Java Sounda, zvučnog mehanizma temeljenog na Headspaceu, debitirajući u Javi 1.2.

  • j3dutils.jar- Inkapsulira razne klase korisnih programa Sun u 16 ukupnih paketa i potpaketa ispod com.sun.j3d. Dublje ću istražiti ove pakete u nastavku našeg Java 3D razgovora sljedećeg mjeseca.

  • j3dutilscontrib.jar- Arhivira korisne uslužne programe koje su drugi pridonijeli Sunovim naporima. Pod com.sun.j3dhijerarhijom postoji sedam paketa , uključujući com.sun.j3d.utils.trackersgore spomenuti kod. Ponovno, stupac sljedećeg mjeseca pružit će više informacija o paketima u ovoj tegli.

Imajte na umu da u teoriji možete instancirati i pozvati metode na bilo kojoj klasi koja se nudi u nestandardnim paketima, na primjer com.sun, ali upozorite emptor : Ne postoji jamstvo da će biti dostupni na platformi na kojoj se vaš kôd izvršava. U trenutnoj praksi Java 3D dostupan je samo od Sunca, tako da mnogi programeri zapravo koriste klase unutar Sunčevih privatnih arhiva. Trebali biste biti svjesni potencijalnog kompromisa prenosivosti koji je potreban za odabir da to učinite.

Nema čarolije ni u načinu na koji se javna i privatna Java 3D klase povezuju sa sistemskim resursima. Sun instalira matične knjižnice u J3D.dlli j3daudio.dllispod /jre/bin/direktorija. Java 3D klase koriste izvorne metode za pozivanje tih DLL-ova i sučelje s Win32 platformom i OpenGL bibliotekom prikaza. (Slične knjižnice postoje za implementacije Solarisa.)

Posljednja napomena o instalaciji: Cjevovod za prikazivanje OpenGL dizajniran je da iskoristi hardver za ubrzavanje OpenGL da bi ubrzao vaše grafičke aplikacije. Za potrebe ovog stupca, međutim, trebali biste moći eksperimentirati s primjerima bez ikakvog posebnog hardvera. (Zapravo razvijam sve primjere na Pentium 150-MHz MMX prijenosnom računalu bez OpenGL hardvera za ubrzavanje.) Ako vas zanimaju kartice za ubrzanje, trebali biste se obratiti web mjestu OpenGL ili Java 3D mailing listi ( za više informacija pogledajte Resursi). Planiram uključiti malo više informacija u sljedeći mjesec u 3D 3D stupac o hardveru za ubrzavanje.

Konstruiranje grane pogleda scene

Kao što sam ranije napomenuo, jedna od najvećih prednosti grafičkog modela grafika scene je što omogućava neiskusnim grafičkim programerima da dodaju 3D svojim aplikacijama. Tradicionalno, 3D programeri morali su odrediti gdje će se i kako crtati pojedinačne crte ili drugi grafički primitivi. Međutim, koristeći graf scene, programer jednostavno kreira strukturu nalik stablu koja sadrži čvorove koji predstavljaju objekte koji će se prikazati, kao i upute za prikazivanje (kao što je gdje se nalazi točka prikaza prikazana monitoru, fizička geometrija 3D svijeta programer stvara relativne udaljenosti između stvari).