Ohjelmointi

3D-grafiikan ohjelmointi Javalla, osa 1: Java 3D

Todellisen Java-alustan rakentamiseksi Sun huomasi jo varhaisessa vaiheessa, että sen täytyi täyttää API-kuva Java 1.0 -ydinalustan rajoitettujen toimintojen lisäksi. Sun on kasvanut ytimessä paljon 1.1- ja tulevilla 1.2 -julkaisuilla, mutta Java-palapelistä puuttuu vielä joitain kappaleita.

Sun ja sen kumppanit kehittivät Java Media and Communication -sovellusliittymät tarjoamaan puuttuvat multimediaohjelmointikappaleet. Kaksi suurinta kappaletta, 2D- ja 3D-grafiikat, on kohdistettu Java 2D- ja 3D-sovellusliittymillä. Java 2D on ydinalustan sovellusliittymä, joka alkaa Java 1.2: lla, kun taas Java 3D julkaistaan ​​laajennussovellusliittymänä pian sen jälkeen, kun 1.2-ympäristö on tullut saataville. Olemme äskettäin valmistuneet sarjasarjan Java 2D: lle; nyt kiinnitämme huomiomme Java 3D: hen.

Java 3D: n on tarkoitus antaa Java-kehittäjille mahdollisuus kirjoittaa sovelmia ja sovelluksia, jotka tarjoavat kolmiulotteista, interaktiivista sisältöä käyttäjille. Sunilla on jonkin verran kilpailua muiden 3D-grafiikatekniikoiden kanssa tällä areenalla, ja Java 3D: llä on edessään ylämäkeen taistelu, jos se haluaa voittaa nykyisen grafiikkastandardin, OpenGL: n.

Pyyntö lukijoiden kommenteista Java-grafiikkasovellusliittymistä osoitti vakavaa kiinnostusta Java 3D- ja Java OpenGL -sidontaan, joten olen päättänyt keskittyä ponnisteluihini näihin tekniikoihin tulevina kuukausina.

Rajoitettu määrä kiinnostusta ilmaistiin VRML: ssä. Tästä syystä aion käsitellä VRML: ää osoittamalla sen käytön Java 3D: ssä VRML97-sisältökuormaajien ja Sunin Java 3D VRML97 -selaimen avulla. Direct3D sai hyvin vähän kiinnostusta, joten olen päättänyt olla jatkamatta tätä tietä lukuun ottamatta mainintaa siitä, missä jokin muu tekniikka voi tukea sitä tai toimia sen kanssa.

Hyödyt ja haitat Java 3D: lle

Tässä kuussa aloitamme Java-grafiikan sovellusliittymien kiertueen tutustumalla Java 3D: hen. Aloitamme keskustelemalla joistakin API: n tärkeimmistä vahvuuksista ja heikkouksista. 3D-grafiikka voi tuntua toisinaan melko tylsältä, joten sitä voi olla vaikea selittää. Jos sinulla on viivästynyt hämmennys esimerkkeistä tai selityksistä, kirjoita minulle kysymyksiisi tai kommentteihisi, ja teen parhaani ratkaista ne.

Myyntipisteet Java 3D: lle:

  • Se tarjoaa korkean tason olio-näkymän 3D-grafiikasta. Java 3D saavuttaa tämän osittain käyttämällä a kohtauskaavio-pohjainen 3D-grafiikkamalli. (Keskustelemme tästä käsitteestä tarkemmin myöhemmin artikkelissa.) Tämän lähestymistavan tarkoituksena on auttaa ohjelmoijia, joilla ei ole paljon grafiikkaa tai multimediaohjelmointikokemusta, käyttämään 3D: tä sovelluksissaan. Jyrkässä vastakohtana alemman tason menettelytapojen 3D-sovellusliittymille, kuten OpenGL, jotka on suunniteltu optimoimaan paras mahdollinen nopeus ja antamaan ohjelmoijille suurin mahdollinen hallinta renderöintiprosessissa, Java 3D: n on tarkoitus olla riittävän yksinkertainen kaikille kokeneille Java-ohjelmoijille oppia.

  • Jos et tarvitse matalan tason käyttöoikeutta renderointitoimintoihin, Java 3D voi olla vaihtoehto. Käyttöoikeuden tarjoaminen on rajoitettu verkkopalveluihin määritteet ja kapasiteettibitit, muodoltaan ja toiminnaltaan samanlainen kuin Java 2D: n renderointivihjeet. (Katso Resurssit linkkejä edelliseen sarjaan Java 2D: ssä, joka sisälsi keskustelua ja esimerkkejä 2D: n renderointivihjeistä.)

  • Java 3D on optimoitu nopeutta varten aina kun mahdollista. Suorituksen aikana käytetään renderöintikykybittejä, mikä optimoi näkymäkäyrän mahdollisimman nopeasti. Tämä lähestymistapa tekee Java 3D: stä paremmin sovellettavissa interaktiivisiin grafiikkaympäristöihin (pelit, simulaatiot, pieniviiveiset tilanteet) kuin offline-laadukkaisiin grafiikkasovelluksiin (kuten renderöintitilat).

  • Suuri ja kasvava määrä 3D-latauslaitteita on käytettävissä sisällön tuomiseen Java 3D -ajoon. Sun on asettanut Java 3D VRML97 -tiedostolataimen ja selaimen vapaasti saataville koodilla. Etsi seuraavan kuukauden Median ohjelmointi -sarakkeessa voit tutustua Java 3D -kuormaajiin tarkemmin.

  • Java 3D vaatii vektorimatemaattiset ominaisuudet, joita ei ole muualla Java-alustalla. Nämä matemaattiset operaatiot sijaitsevat tällä hetkellä javax.vecmath paketti ja se voidaan siirtää ydinalustalle tulevaisuudessa.

  • Java 3D tukee useita eksoottisia laitteita (esimerkiksi sauvat, datakäsineet ja kuulokkeet). com.sun.j3d.utils.trackers Sunin toteutukseen sisältyvä paketti tarjoaa luokkia Fakespace-, Logitech- ja Polhemus-laitteille. Näitä laitteita ei kuitenkaan käytetä laajalti, joten en keskustele niistä yksityiskohtaisesti. Jos haluat lisätietoja laitetukesta, tutustu Sunin Java 3D -sivustoihin ja Java 3D -postituslistojen arkistoon (molemmat saatavana alla olevista resursseista olevista Sun Java 3D: n pääosoitteista).

Java 3D: llä on paljon etuja, mutta entä haitat? Ne sisältävät:

  • Java 3D on tavallinen laajennussovellusliittymä. Java-alustan lisenssinsaajille annetaan mahdollisuus toteuttaa sovellusliittymä, jos he haluavat, mutta heidän ei tarvitse ottaa sitä käyttöön. Java 3D: n sijoittaminen vakiolaajennuksena uhkaa vähentää Java 3D -koodin siirrettävyyttä eri alustoilla - useimpien toimittajien on taisteltava pysyä mukana pelkästään ydinalustan muutoksissa ja lisäyksissä.

  • Java 3D: llä on vakavia saatavuusrajoituksia. Nämä ovat seurausta Java 3D: n tilasta laajennussovellusliittymänä. Ainoa merkittävä toimittaja, joka tarjoaa tällä hetkellä Java 3D -asennuksen, on Sun, ja sen Solaris- ja Win32-sovellukset. Verrattuna OpenGL: ään, joka on saatavana jokaiselle Unixin, Windowsin ja monien muiden käyttöjärjestelmien makulle, Java 3D -koodin välinen siirrettävyys näyttää kyseenalaiselta.

  • Ohjelmistojen saatavuusongelmien ohella tulee dokumentaation puutteita. Sun pyrkii tarjoamaan kehittäjäkoulutusta ja tukea Java 3D: lle voimakkaasti, mutta se ei silti ole riittävän alhainen verrattuna alan muihin pyrkimyksiin dokumentoida OpenGL: ää ja sen käyttöä. OpenGL-konsortion verkkosivusto on paljon syvempi ja laajempi kuin mikään muu, mitä Sun on tähän mennessä onnistunut koottamaan Java 3D: lle. Tämä ei ole vähäinen asia: 3D-grafiikkasovellusliittymien suhteellinen monimutkaisuus tekee hyvän dokumentoinnin välttämättömäksi.

  • Java 3D piilottaa renderöintiputken yksityiskohdat kehittäjältä. Koska Java 3D on korkean tason sovellusliittymä, se piilottaa tarkoituksella renderöintiputken yksityiskohdat kehittäjältä, mikä tekee siitä sopimattoman useille ongelmille, joissa tällaiset yksityiskohdat ovat tärkeitä. (Keskustelemme OpenGL: n alemman tason mallista ja pääsystä renderointiputkelle myöhemmin tässä 3D-sarjassa.)

  • Java 3D -komponentit ovat raskaita. Eli heillä on natiivi (ei-Java) -vertaisryhmä, joka todella tekee renderoinnin. Tämä voi vaikeuttaa käyttöliittymäkehitystäsi, jos käytät Java Swingiä ja sen kaikkia Java-komponentteja tai kevyitä komponentteja. On olemassa joitain erityisiä kiertotapoja, mutta yleensä kevyet ja raskaat osat eivät sekoita hyvin samoissa konttiesineissä ja ikkunoissa. Lisätietoja kevyiden ja raskaiden komponenttien ongelmista on saatavana tämän artikkelin lopussa olevista resursseista.

Java 3D: n asentaminen

Nyt kun ymmärrämme Java 3D: n tärkeimmät ominaisuudet ja rajoitukset, valmistaudumme kokeilemaan esimerkkikoodia.

Java 3D on saatavana beetana Win32: lle ja Solarisille. Aikuisemmat Sunin Java 3D -toteutukset on rakennettu OpenGL: n päälle. Alpha-laatuinen Direct3D-toteutus on saatavana myös Win32: lle. Kaikki tarvitsevat Java 1.2: n, ja uusin Java 3D-beeta vastaa Java 1.2 Beta 4: ää. Sun on luvannut julkaista lopullisen Java 3D -toteutuksen pian sen jälkeen, kun se on julkaissut Java 1.2: n, joka on tällä hetkellä suunniteltu joulukuussa 1998.

Hieman hämmentävä sivu: Sun julkaisi Java 3D 1.0 -alfa-toteutukset, jotka vastasivat Java 3D 1.0 -sovellusliittymää, mutta se ei koskaan julkaissut mitään muuta kuin alfa-versiota 1.0-sovellusliittymälle. Sitten Sun muutti sovellusliittymää julkaisemalla muokatun version Java 3D 1.1 -sovellusliittymänä. Tätä versiota seurattiin julkaisemalla ns. 1.1-beeta-toteutukset, kaksi toistaiseksi. Sun on luvannut julkaista lopullisen sovellusliittymän ja toteutuksen pian Java 1.2 -alustan viimeisen julkaisun jälkeen. Toivottavasti sovellusliittymä on vakiintunut eikä sitä ole uudistettu, kun taas maailma odottaa edelleen toteutuksen lopullista lopullista julkaisua.

Koska aiomme käsitellä Java OpenGL -sidoksia tulevassa sarakkeessa, olen päättänyt säästää ja käyttää Java 3D: n OpenGL-versiota myös näissä asennusohjeissa. Jos asennat OpenGL-version käytettäväksi näiden Java 3D -esimerkkien kanssa, sinulla on tarvittavat renderointikirjastot, jotta Java-OpenGL-esimerkit tulevat myöhemmin.

Java 3D: n käyttämiseen tarvittavat ohjelmistokomponentit ovat:

  • Java 3D-ajonaika, saatavana Sunilta (vaaditaan ilmainen Java Developer Connection -kirjautuminen). Varmista, että valitset käyttöjärjestelmällesi Java 3D: n OpenGL-version (käytän Win32: tä). Tästä lähtien uusin Win32 Java 3D for OpenGL on 1.1 Beta 2, java3d11-beta2-win32-opengl.exe-tiedostossa ja painaa noin 1,7 Mt.

  • OpenGL 1.1, mukana Windows NT 4.0 ja Windows 95 OSR 2. Jos sinulla on kuitenkin Windows 95: n OSR 1 -julkaisu, voit ladata OpenGL-tuen. Uusimman Windows 95-OpenGL 1.1 -asennuksen on saatavana Microsoftilta nimellä opengl95.exe, ja se on noin 0,5 Mt.

  • Java 1.2, saatavana Sunilta. (Huomaa, että kirjoittaessani tätä Sun on julkaissut uuden Java 1.2 - Release Candidate 1 -esimerkin. Esimerkkejä päivitetään uusinta versiota varten mahdollisimman pian.) Java 3D on liitetty 1.2-alustaan, ja Sun on ilmoittanut java3d-kiinnostuksen postituslista, että sillä ei ole kiinnostusta irrottaa sovellusliittymää ja yrittää asettaa se saataville aiempien alustojen julkaisujen kanssa.

Voit myös halutessasi ladata Java 3D -dokumentaation ja esimerkkikoodin. Molemmat ovat saatavilla samasta linkistä kuin Java 3D-ajonaikainen.

Huomaa, että sinun ei enää tarvitse asettaa CLASSPATH-ympäristömuuttujia, jotta java- tai appletviewer-suoritustiedostosi löytävät laajennuskirjastot. Java 1.2: n avulla Sun on vihdoin luonut vakiolaajennushakemiston. Tämä hakemisto sijaitsee / jre / lib / ext / JDK-asennushakemistossasi. Esimerkiksi järjestelmässäni Java 1.2 Beta 4 on asennettu osoitteeseen:

C: \ jdk1.2beta4 \

ja vakiolaajennushakemisto on osoitteessa:

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

Kaikkien laajennuskirjastojen tulisi sijoittaa purkkiarkistonsa tähän laajennushakemistoon asennuksen yhteydessä, ja kaikki tavalliset JDK-työkalut tietävät etsivänsä tarvittavia luokkatiedostoja.

Sunin Java 3D: ssä nämä arkistot sisältävät sekä julkisia (Java 3D API -määrityksessä dokumentoituja) että yksityisiä (Sun-sovelluskohtaisia) luokkia. Julkisen luokan arkistoihin sisältyy:

  • j3dcore.jar - Sisältää luokkatiedostot julkista Java 3D -pakettia varten javax.media.j3d.

  • vecmath.jar - Sisältää luokkia javax.vecmath.

Yksityisiä arkistoja ovat:

  • j3daudio.jar - Arkistoi com.sun.j3d.audio luokat, jotka rakentavat spatialisoidun äänen tuen Java 1.2: n, Headspace-pohjaisen äänimoottorin Java-osan mukautetun kopion päälle.

  • j3dutils.jar - Kapseloi useita Sun-apuohjelmaluokkia 16 kokonaispakettiin ja alipakettiin com.sun.j3d. Aion syventyä näihin paketteihin seuraavan kuukauden jatkoa Java 3D -keskustelulle.

  • j3dutilscontrib.jar - Arkistoi hyödyllisiä apuohjelmia, jotka muut ovat auttaneet Sunin pyrkimyksissä. Paketin alla on seitsemän pakettia com.sun.j3d hierarkia, mukaan lukien com.sun.j3d.utils.trackers edellä mainittu koodi. Jälleen seuraavan kuukauden sarake antaa lisätietoja tämän purkin pakkauksista.

Huomaa, että teoreettisesti voit instantisoida ja kutsua menetelmiä mihin tahansa luokkiin, jotka tarjotaan ei-standardipaketeissa, kuten com. aurinko, mutta varoitus tyhjästä: Ei ole takeita siitä, että ne ovat saatavilla alustalla, jolla koodisi suoritetaan. Nykyisessä käytännössä Java 3D on saatavana vain Sunilta, joten monet kehittäjät käyttävät itse asiassa luokkia Sunin yksityisissä arkistoissa. Sinun tulisi olla tietoinen mahdollisesta siirrettävyyden kompromissista, joka liittyy sen valitsemiseen.

Ei ole taikaa siinä, miten julkiset ja yksityiset Java 3D -luokat ovat vuorovaikutuksessa järjestelmäresurssien kanssa. Sun asentaa natiivikirjastot sisään J3D.dll ja j3daudio.dll alla / jre / bin / hakemistoon. Java 3D -luokat käyttävät natiivia menetelmiä kutsua nämä DLL: t ja käyttöliittymän Win32-alustan ja OpenGL-renderöintikirjaston kanssa. (Samanlaisia ​​kirjastoja on olemassa Solaris-toteutuksille.)

Viimeinen huomautus asennuksesta: OpenGL-renderöintiputki on suunniteltu hyödyntämään OpenGL-kiihdytyslaitteistoa grafiikkasovellusten nopeuttamiseksi. Tässä sarakkeessa sinun on kuitenkin voitava kokeilla esimerkkejä ilman erityistä laitteistoa. (Itse kehitän kaikkia esimerkkejä Pentium 150 MHz: n MMX-kannettavasta, jossa ei ole OpenGL-kiihdytyslaitteistoa.) Jos olet kiinnostunut kiihdytyskorteista, sinun kannattaa tutustua OpenGL-verkkosivustoon tai Java 3D -postituslistaan ​​( katso Resurssit). Aion sisällyttää hieman enemmän tietoa myös ensi kuun Java 3D -sarakkeeseen kiihdytyslaitteista.

Kohtauksen näkymän haaran rakentaminen

Kuten aiemmin totesin, yksi kohtauskaavio grafiikkamalli on, että se antaa kokemattomille grafiikan ohjelmoijille mahdollisuuden lisätä 3D-sovelluksiaan. Perinteisesti 3D-ohjelmoijien on pitänyt määritellä, mihin ja miten yksittäiset viivat tai muut grafiikkaprimitiivit piirretään. Kohtauskaaviota käyttämällä ohjelmoija kuitenkin yksinkertaisesti luo puumaisen rakenteen, joka sisältää solmut, jotka edustavat renderoitavia objekteja sekä renderointiohjeita (kuten missä näytölle näytetty näkökulma sijaitsee, ohjelmoijan 3D-fyysinen geometria ja suhteelliset etäisyydet asioiden välillä).