Programmering

3D-grafikprogrammering i Java, del 1: Java 3D

For at opbygge en ægte Java-platform indså Sun tidligt, at det var nødvendigt at udfylde API-billedet ud over den begrænsede funktionalitet, der er tilgængelig i Java 1.0-kerneplatformen. Sun har vokset kernen meget med 1.1 og forestående 1.2 udgivelser, men der mangler stadig nogle brikker i Java-puslespillet.

Sun og dets partnere udviklede Java Media og Communication API'er til at levere de manglende multimedieprogrammeringsstykker. To af de største stykker, 2D og 3D-grafik, er målrettet mod henholdsvis Java 2D og 3D API'er. Java 2D er en kerneplatform API, der begynder med Java 1.2, mens Java 3D frigives som en Extension API kort efter, at 1.2-platformen bliver tilgængelig. Vi har for nylig afsluttet en række kolonner på Java 2D; nu vender vi vores opmærksomhed mod Java 3D.

Java 3D er beregnet til at give Java-udviklere mulighed for at skrive applets og applikationer, der giver tredimensionelt, interaktivt indhold til brugerne. Sun har en del hård konkurrence fra andre 3D-grafikteknologier på denne arena, og Java 3D har en opadgående kamp foran sig, hvis det er for at besejre den etablerede grafikstandard, OpenGL.

En anmodning om læserkommentarer om 3D-grafik-API'er til Java viste alvorlig interesse for Java 3D- og Java OpenGL-bindinger, så jeg har besluttet at koncentrere min indsats om disse teknologier i de kommende måneder.

En mere begrænset interesse blev udtrykt i VRML. Derfor vil jeg beskæftige mig med VRML ved at demonstrere dens anvendelse i Java 3D med VRML97-indholdsindlæsere og Suns Java 3D VRML97-browser. Direct3D modtog meget lidt interesse, så jeg har besluttet ikke at følge denne vej, bortset fra at nævne, hvor en af ​​de andre teknologier kan understøtte eller interoperere med den.

Fordele og ulemper ved Java 3D

Denne måned begynder vi vores rundvisning i 3D-grafik-API'er til Java ved at udforske Java 3D. Vi starter med at diskutere nogle af API'ens store styrker og svagheder. 3D-grafik kan til tider virke temmelig stump og kan derfor være vanskelig at forklare. Hvis du har nogen dvælende forvirring omkring mine eksempler eller forklaringer, er du velkommen til at skrive til mig med dine spørgsmål eller kommentarer, så vil jeg gøre mit bedste for at adressere dem.

Salgspunkter til Java 3D:

  • Det giver en objektorienteret visning af 3D-grafik på højt niveau. Java 3D udfører dette delvist ved hjælp af en scene graf-baseret 3D-grafikmodel. (Vi diskuterer dette koncept mere detaljeret senere i artiklen.) Denne tilgang er beregnet til at hjælpe programmører uden meget grafik eller multimedieprogrammeringserfaring med at bruge 3D i deres applikationer. I skarp kontrast til lavere niveau, proceduremæssige 3D API'er som OpenGL, som er designet til at optimere til den bedst mulige hastighed og give programmører den størst mulige kontrol over gengivelsesprocessen, er Java 3D beregnet til at være ligetil nok til, at enhver erfaren Java-programmør kan lære.

  • Hvis du ikke har brug for lavt niveau adgang til gengivelsesoperationer, kan Java 3D være en mulighed. Rendering af adgang er begrænset til anmodninger via egenskaber og kapacitetsbits, svarer i form og funktion til Java 2Ds gengivelsestip. (Se ressourcer for links til min tidligere serie om Java 2D, som indeholdt diskussion og eksempler på 2Ds gengivelsestip).

  • Java 3D er optimeret til hastighed, hvor det er muligt. Runtime bruger gengivelsesfunktionsbits, faktisk for at optimere scenegrafen til de hurtigst mulige gengivelser. Denne tilgang gør Java 3D mere anvendelig til interaktive grafikmiljøer (spil, simuleringer, situationer med lav latens) end til offline grafikapplikationer i høj kvalitet (som gengivelsesbedrifter).

  • Et stort og voksende antal 3D-loadere er tilgængelige for at importere indhold til Java 3D-runtime. Sun har gjort en Java 3D VRML97-filindlæser og browser frit tilgængelig med kode. Se efter næste måneds Medieprogrammering kolonne for at udforske Java 3D-læssere mere detaljeret.

  • Java 3D kræver vektor-matematiske funktioner, der ikke er tilgængelige andetsteds på Java-platformen. Disse matematiske operationer er i øjeblikket placeret i javax.vecmath pakke og kan flyttes til kerneplatformen i fremtiden.

  • Java 3D understøtter et antal eksotiske enheder (f.eks. Tryllestave, datahandsker og headset). Det com.sun.j3d.utils.trackers pakke inkluderet i Suns implementering giver klasser til Fakespace, Logitech og Polhemus enheder. Disse enheder bruges dog ikke meget, så jeg vil ikke diskutere dem i detaljer. Hvis du er interesseret i at finde ud af mere om enhedsunderstøttelse, henvises til Suns Java 3D-websteder og Java 3D-postlistearkivet (begge tilgængelige fra de vigtigste Sun Java 3D-URL'er inkluderet i ressourcerne nedenfor).

Java 3D har mange fordele, men hvad med ulemperne? De omfatter:

  • Java 3D er en standardudvidelses-API. Java-platformlicenshavere får mulighed for at implementere API'en, hvis de vil, men de er ikke forpligtet til at implementere det. Java 3D's positionering som en standardudvidelse løber risikoen for at reducere bærbarheden af ​​Java 3D-kode på tværs af platforme - de fleste leverandører skal kæmpe for at holde trit med ændringer og tilføjelser til kerneplatformen alene.

  • Java 3D har alvorlige tilgængelighedsbegrænsninger. Disse er resultatet af Java 3Ds status som en udvidelses-API. Den eneste store leverandør, der i øjeblikket leverer en Java 3D-implementering, er Sun med dens implementeringer til Solaris og Win32. Sammenlignet med OpenGL, som er tilgængelig for enhver smag af Unix, Windows og mange andre operativsystemer, ser den bærbare platform på Java 3D-kode tvivlsomt ud.

  • Sammen med softwaretilgængelighedsproblemer kommer dokumentationsunderskud. Sun gør en tapper indsats for at yde udvikleruddannelse og support til Java 3D, men det mangler stadig i forhold til resten af ​​branchens bestræbelser på at dokumentere OpenGL og dets anvendelse. OpenGL Consortiums websted er langt dybere og bredere end noget, Sun hidtil har formået at sammensætte til Java 3D. Dette er ikke et mindre punkt: Den relative kompleksitet af 3D-grafik-API'er gør god dokumentation til en nødvendighed.

  • Java 3D skjuler gengivelsesrørledningsdetaljer fra udvikleren. Fordi Java 3D er et API på højt niveau, skjuler det bevidst detaljer om gengivelsesrørledningen fra udvikleren, hvilket gør det uegnet til et betydeligt antal problemer, hvor sådanne detaljer er vigtige. (Vi diskuterer OpenGLs model på lavere niveau og adgang til gengivelsesrørledningen senere i denne 3D-serie.)

  • Java 3D-komponenter er tunge. Det vil sige, de har en indfødt (ikke-Java) peer, der rent faktisk gør gengivelsen. Dette kan komplicere din GUI-udvikling, hvis du bruger Java Swing og dets alt-Java- eller lette komponenter. Der er nogle specielle løsninger, men generelt blandes lette og tunge komponenter ikke godt i de samme containerobjekter og vinduer. Flere oplysninger om problemer med letvægts-tungvægtskomponenter er tilgængelige fra ressourcerne i slutningen af ​​denne artikel.

Installation af Java 3D

Nu hvor vi forstår de vigtigste funktioner og begrænsninger ved Java 3D, lad os gøre os klar til at prøve nogle eksempler på kode.

Java 3D er tilgængelig i beta til Win32 og Solaris. Den mere modne af Suns implementeringer af Java 3D er bygget oven på OpenGL. En alfa-kvalitet Direct3D-implementering er også tilgængelig til Win32. Alle kræver Java 1.2, med den nyeste Java 3D-beta svarende til Java 1.2 Beta 4. Sun har lovet at frigive den endelige Java 3D-implementering kort efter at den frigiver Java 1.2, som i øjeblikket er planlagt til december 1998.

En lidt forvirrende side om side: Sun frigav Java 3D 1.0 alfa-implementeringer, som svarede til Java 3D 1.0 API, men det frigav aldrig noget ud over alfa til 1.0 API. Sun modificerede derefter API'en og frigav den modificerede version som Java 3D 1.1 API. Denne version blev fulgt med udgivelser af, hvad den kaldte 1.1 beta-implementeringer, to hidtil. Sun har lovet at frigive en endelig API og implementering kort efter den endelige frigivelse af Java 1.2-platformen. Forhåbentlig har API'en stabiliseret sig og vil ikke blive revet, endnu en gang, med verden stadig venter på en endelig frigivelse af en implementering.

Fordi vi vil dække Java OpenGL-bindinger i en fremtidig kolonne, har jeg besluttet at spare og bruge OpenGL-versionen af ​​Java 3D også i denne installationsvejledning. Hvis du installerer OpenGL-versionen til brug sammen med disse Java 3D-eksempler, har du de gengivelsesbiblioteker, du har brug for, for at Java-OpenGL-eksemplerne kan komme senere.

De softwarekomponenter, du har brug for for at bruge Java 3D, er:

  • Java 3D-runtime, tilgængelig fra Sun (gratis login til Java Developer Connection krævet). Sørg for at vælge OpenGL-versionen af ​​Java 3D til din platform (jeg bruger Win32). Fra nu af er den seneste Win32 Java 3D til OpenGL 1.1 Beta 2 i java3d11-beta2-win32-opengl.exe og vejer ca. 1,7 MB.

  • OpenGL 1.1, leveret med Windows NT 4.0 og Windows 95 OSR 2. Hvis du har OSR 1-udgivelsen af ​​Windows 95, kan du dog downloade OpenGL-support. Den seneste implementering af Windows 95-OpenGL 1.1 fås fra Microsoft som opengl95.exe og er ca. 0,5 MB.

  • Java 1.2, tilgængelig fra Sun. (Bemærk, at når jeg skriver dette, har Sun frigivet en ny Java 1.2 - Release Candidate 1. Eksempler opdateres til den nyeste version så hurtigt som muligt.) Java 3D er koblet til 1.2-platformen, og Sun har udtalt på postliste med java3d-interesse, at den ikke har nogen interesse i at afkoble API'en og forsøge at gøre den tilgængelig med tidligere platformudgivelser.

Eventuelt kan du også downloade Java 3D-dokumentation og eksempelkode. Begge er tilgængelige fra det samme link som Java 3D-runtime.

Bemærk, at du ikke længere er forpligtet til at indstille CLASSPATH-miljøvariablerne, så dine java- eller appletviewer-eksekverbare filer kan finde udvidelsesbiblioteker. Med Java 1.2 har Sun endelig oprettet en standard udvidelsesmappe. Denne mappe findes på / jre / lib / ext / i din JDK-installationsmappe. For eksempel er Java 1.2 Beta 4 på mit system installeret på:

C: \ jdk1.2beta4 \

og standardudvidelsesmappen er på:

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

Alle udvidelsesbiblioteker skal placere deres jar-arkiver i denne udvidelsesmappe ved installationstidspunktet, og alle standard JDK-værktøjer ved at søge her efter nødvendige klassefiler.

For Suns Java 3D inkluderer disse arkiver både offentlige (dokumenteret i Java 3D API-specifikationen) og private (Sun-implementeringsspecifikke) klasser. Offentlige klassearkiver inkluderer:

  • j3dcore.jar - Indeholder klassefiler til den offentlige Java 3D-pakke javax.media.j3d.

  • vecmath.jar - Indeholder klasser til javax.vecmath.

Private arkiver inkluderer:

  • j3daudio.jar - Arkiverer com.sun.j3d.audio klasser, der bygger understøttelse af rumlig lyd oven på en brugerdefineret kopi af Java-delen af ​​Java Sound, Headspace-baseret lydmotor, der debuterer i Java 1.2.

  • j3dutils.jar - Indkapsler en række Sun-hjælpeklasser i 16 samlede pakker og underpakker nedenunder com.sun.j3d. Jeg vil grave dybere ned i disse pakker i næste måneds fortsættelse af vores Java 3D-diskussion.

  • j3dutilscontrib.jar - Arkiver nyttige hjælpeprogrammer, som andre har bidraget til Suns indsats. Der er syv pakker under com.sun.j3d hierarki, herunder com.sun.j3d.utils.trackers ovennævnte kode. Igen vil kolonnen i næste måned give mere information om pakkerne i denne krukke.

Bemærk, at i teorien kan du instantiere og kalde metoder på nogen af ​​de klasser, der leveres i ikke-standardpakker som f.eks com.sun, men advarselstømmer: Der er ingen garanti for, at de vil være tilgængelige på den platform, din kode udfører på. I den nuværende praksis er Java 3D kun tilgængelig fra Sun, så mange udviklere bruger faktisk klasser i Suns private arkiver. Du skal være opmærksom på den mulige afvejning af bærbarhed, der er forbundet med at vælge at gøre det.

Der er ingen magi i, hvordan den offentlige og private Java 3D-klasser grænseflade med systemressourcer, enten. Sun installerer indfødte biblioteker i J3D.dll og j3daudio.dll under / jre / bin / vejviser. Java 3D-klasser bruger native metoder til at kalde disse DLL'er og grænseflade til Win32-platformen og OpenGL-gengivelsesbiblioteket. (Lignende biblioteker findes til Solaris-implementeringer.)

En sidste note om installation: OpenGL-gengivelsesrørledningen er designet til at drage fordel af OpenGL-accelerationshardware til at fremskynde dine grafikapplikationer. I forbindelse med denne kolonne skal du dog være i stand til at eksperimentere med eksemplerne uden nogen speciel hardware. (Faktisk udvikler jeg alle eksemplerne på en Pentium 150-MHz MMX bærbar computer uden OpenGL-accelerationshardware.) Hvis du er interesseret i accelerationskort, skal du henvise til OpenGL-webstedet eller Java 3D-mailinglisten ( se Ressourcer) for mere information. Jeg planlægger også at inkludere lidt mere information i næste måneds Java 3D-kolonne om accelerationshardware.

Konstruktion af udsigtsgrenen af ​​scenen

Som jeg nævnte tidligere, er en af ​​de største styrker i scene graf grafikmodel er, at det giver uerfarne grafikprogrammerere mulighed for at tilføje 3D til deres applikationer. Traditionelt har 3D-programmører været nødt til at specificere, hvor og hvordan de enkelte linjer eller andre grafiske primitiver skal tegnes. Ved hjælp af en scenediagram opretter programmøren imidlertid simpelthen en trælignende struktur, der indeholder noder, der repræsenterer objekter, der skal gengives, samt gengivelsesinstruktioner (såsom hvor synspunktet, der vises til skærmen, er placeret, fysisk geometri i 3D-verdenen programmøren skaber og relative afstande mellem ting).