Programavimas

3D grafikos programavimas „Java“, 1 dalis: „Java 3D“

Siekdama sukurti tikrą „Java“ platformą, „Sun“ anksti suprato, kad reikia užpildyti API paveikslėlį, išskyrus ribotą „Java 1.0“ pagrindinės platformos funkcionalumą. „Sun“ labai išaugo su 1.1 ir artėjančiais 1.2 leidimais, tačiau iš „Java“ galvosūkio vis dar trūksta dalių.

„Sun“ ir jos partneriai sukūrė „Java Media and Communication“ API, kad galėtų pateikti trūkstamus daugialypės terpės programavimo elementus. Du didžiausi kūriniai, 2D ir 3D grafika, yra skirti atitinkamai „Java 2D“ ir „3D“ API. „Java 2D“ yra pagrindinė platformos API, prasidedanti „Java 1.2“, o „Java 3D“ bus išleista kaip „Extension“ API netrukus po to, kai taps prieinama „1.2“ platforma. Neseniai baigėme „Java 2D“ stulpelių seriją; dabar atkreipiame dėmesį į „Java 3D“.

„Java 3D“ yra skirtas suteikti „Java“ kūrėjams galimybę rašyti programėles ir programas, teikiančias trimatį, interaktyvų turinį vartotojams. Šioje arenoje „Sun“ labai konkuruoja su kitomis 3D grafikos technologijomis, o „Java 3D“ laukia kalnų mūšis, jei norima nugalėti dabartinį grafikos standartą „OpenGL“.

Prašymas skaitytojų komentarų apie „Java“ 3D grafikos API rodo didelį susidomėjimą „Java 3D“ ir „Java OpenGL“ susiejimais, todėl nusprendžiau ateinančiais mėnesiais sutelkti savo pastangas šioms technologijoms.

VRML buvo išreikštas ribotesnis susidomėjimas. Todėl aš turėsiu spręsti VRML, pademonstruodamas jo naudojimą „Java 3D“ su VRML97 turinio krautuvais ir „Sun“ Java 3D VRML97 naršykle. „Direct3D“ sulaukė labai nedaug susidomėjimo, todėl nusprendžiau nesekti šiuo keliu, išskyrus tai, kad paminėčiau, kur viena iš kitų technologijų gali jį palaikyti ar sąveikauti.

„Java 3D“ privalumai ir trūkumai

Šį mėnesį pradedame „Java“ 3D grafikos API apžvalgas tyrinėdami „Java 3D“. Pirmiausia aptarsime kai kurias pagrindines API stipriąsias ir silpnąsias puses. 3D grafika kartais gali atrodyti gana tyli, todėl ją sunku paaiškinti. Jei turite kokių nors painiavos dėl mano pavyzdžių ar paaiškinimų, prašome parašyti man savo klausimus ar komentarus, ir aš padarysiu viską, kad juos išspręčiau.

„Java 3D“ pardavimo taškai:

  • Tai suteikia aukšto lygio objektyvų 3D grafikos vaizdą. „Java 3D“ tai iš dalies pasiekia naudodamas a scenos grafikas3D grafikos modelis. (Šią koncepciją išsamiau aptarsime vėliau straipsnyje.) Šis metodas skirtas padėti programuotojams, neturintiems daug grafikos ar daugialypės terpės programavimo patirties, naudoti 3D savo programose. Visiškai priešingai nei žemesnio lygio procedūrinės 3D API, pvz., „OpenGL“, skirtos optimizuoti kuo didesniam greičiui ir suteikti programuotojams kuo didesnę atvaizdavimo proceso kontrolę, „Java 3D“ turėtų būti pakankamai paprasta, kad bet kuris patyręs „Java“ programuotojas galėtų mokytis.

  • Jei jums nereikia žemo lygio prieigos prie atvaizdavimo operacijų, „Java 3D“ gali būti pasirinkimo galimybė. Pateikiama prieiga tik užklausoms per atributus ir pajėgumų bitai, forma ir funkcija panaši į „Java 2D“ atvaizdavimo patarimus. (Žr. Šaltinius, kuriuose pateikiamos nuorodos į mano ankstesnes „Java 2D“ serijas, kuriose buvo diskusijos ir 2D pateikimo patarimų pavyzdžiai).

  • Kur įmanoma, „Java 3D“ yra optimizuotas greičiui. Vykdymo metu naudojami atvaizdavimo pajėgumo bitai, kad scenos diagrama būtų optimizuota kuo greičiau. Šis metodas leidžia „Java 3D“ labiau pritaikyti interaktyvioms grafinėms aplinkoms (žaidimams, simuliacijoms, mažos delsos situacijoms), o ne neprisijungus naudojamoms aukštos kokybės grafikos programoms (pvz., „Renderavimo ūkiams“).

  • Didelį ir vis didesnį skaičių 3D krautuvų galima importuoti turinį į „Java 3D“ vykdymo laiką. „Sun“ padarė „Java 3D VRML97“ failų krautuvą ir naršyklę laisvai prieinamą su kodu. Ieškokite kito mėnesio Žiniasklaidos programavimas stulpelį, kad galėtumėte išsamiau ištirti „Java“ 3D krautuvus.

  • „Java 3D“ reikalingos vektorinės matematikos galimybės, kurių nėra kitur „Java“ platformoje. Šios matematikos operacijos šiuo metu yra javax.vecmath paketą ir ateityje gali būti perkelta į pagrindinę platformą.

  • „Java 3D“ palaiko daugybę egzotiškų įrenginių (pavyzdžiui, lazdelės, duomenų pirštinės ir ausinės). com.sun.j3d.utils.trackers „Sun“ įdiegtame pakete pateikiamos „Fakespace“, „Logitech“ ir „Polhemus“ įrenginių klasės. Šie įrenginiai vis dėlto nėra plačiai naudojami, todėl jų neaptarsiu labai išsamiai. Jei norite sužinoti daugiau apie įrenginių palaikymą, žr. „Sun“ „Java 3D“ svetaines ir „Java 3D“ adresų sąrašo archyvą (abu galima rasti iš pagrindinių „Sun Java 3D“ URL, pateiktų toliau esančiuose šaltiniuose).

„Java 3D“ turi daug privalumų, bet kaip su minusais? Jie įtraukia:

  • „Java 3D“ yra standartinė plėtinio API. „Java“ platformos licencijos turėtojams suteikiama galimybė įdiegti API, jei jie nori, tačiau jiems to įgyvendinti nereikia. „Java 3D“ padėties nustatymas kaip standartinis plėtinys rizikuoja sumažinti „Java 3D“ kodo perkeliamumą visose platformose - daugumai pardavėjų tenka stengtis neatsilikti tik nuo pagrindinės platformos pakeitimų ir papildymų.

  • „Java 3D“ turi didelių prieinamumo apribojimų. Tai yra „Java 3D“ kaip plėtinio API būsenos rezultatas. Vienintelis pagrindinis pardavėjas, šiuo metu teikiantis „Java 3D“ diegimą, yra „Sun“ su įdiegtais „Solaris“ ir „Win32“. Palyginti su „OpenGL“, kuris prieinamas kiekvienam „Unix“, „Windows“ ir daugeliui kitų operacinių sistemų skonių, „Java 3D“ kodo perkėlimas tarp platformų atrodo abejotinas.

  • Kartu su programinės įrangos prieinamumo problemomis kyla ir dokumentų trūkumų. „Sun“ ryžtingai stengiasi teikti „Java 3D“ kūrėjų mokymą ir palaikymą, tačiau vis dar trūksta kitų pramonės pastangų dokumentuojant „OpenGL“ ir jos naudojimą. „OpenGL Consortium“ svetainė yra kur kas gilesnė ir platesnė už viską, ką „Sun“ iki šiol pavyko sukurti „Java 3D“. Tai nėra nereikšmingas dalykas: dėl santykinio 3D grafikos API sudėtingumo reikalinga gera dokumentacija.

  • „Java 3D“ paslepia kūrėjo dujotiekio detales. Kadangi „Java 3D“ yra aukšto lygio API, ji tyčia nuo kūrėjo slepia atvaizdavimo dujotiekio detales, todėl ji nėra tinkama daugeliui problemų, kai tokia informacija yra svarbi. (Vėliau šioje 3D serijoje aptarsime „OpenGL“ žemesnio lygio modelį ir prieigą prie atvaizdavimo dujotiekio.)

  • „Java 3D“ komponentai yra sunkūs. Tai yra, jie turi vietinį (ne „Java“) bendraamžį, kuris iš tikrųjų atlieka atvaizdavimą. Tai gali apsunkinti GUI kūrimą, jei naudojate „Java Swing“ ir visus „Java“ arba lengvus komponentus. Yra keletas specialių problemų, tačiau paprastai lengvi ir sunkūs komponentai gerai nesimaišo tuose pačiuose konteinerio objektuose ir languose. Daugiau informacijos apie lengvojo ir sunkiojo komponentų problemas galite rasti šio straipsnio pabaigoje esančiuose šaltiniuose.

„Java 3D“ diegimas

Dabar, kai suprantame pagrindines „Java 3D“ savybes ir apribojimus, pasiruoškime išbandyti kodo pavyzdį.

„Java 3D“ yra beta versija „Win32“ ir „Solaris“. Labiau subrendusi „Sun“ įdiegta „Java 3D“ yra pastatyta ant „OpenGL“. Alfa kokybės „Direct3D“ diegimas taip pat yra „Win32“. Visiems reikalinga „Java 1.2“ su naujausia „Java 3D“ beta versija, atitinkančia „Java 1.2 Beta 4“. „Sun“ pažadėjo išleisti galutinį „Java 3D“ diegimą netrukus po to, kai išleis „Java 1.2“, kuris šiuo metu numatomas 1998 m. Gruodžio mėn.

Šiek tiek painus dalykas: „Sun“ išleido „Java 3D 1.0“ alfa diegimus, kurie atitiko „Java 3D 1.0“ API, tačiau niekada neišleido nieko daugiau nei alfa versijos „1.0“. Tada „Sun“ modifikavo API, išleisdama modifikuotą versiją kaip „Java 3D 1.1“ API. Po šios versijos buvo išleisti vadinamieji 1.1 beta versijos leidimai, iki šiol du. „Sun“ pažadėjo išleisti galutinę API ir įdiegimą netrukus po galutinio „Java 1.2“ platformos išleidimo. Tikimės, kad API stabilizavosi ir nebus atnaujinta, tačiau pasaulis vis dar laukia bonafide galutinio įgyvendinimo leidimo.

Kadangi būsimame stulpelyje aptarsime „Java OpenGL“ susiejimus, nusprendžiau taupyti ir naudoti „Open 3D“ „Java 3D“ versiją ir šiose diegimo instrukcijose. Jei įdiegsite „OpenGL“ versiją, kurią naudosite kartu su šiais „Java 3D“ pavyzdžiais, turėsite atvaizdavimo bibliotekas, kurių reikia, kad „Java-OpenGL“ pavyzdžiai būtų vėliau.

Programinės įrangos komponentai, kurių reikia norint naudoti „Java 3D“, yra šie:

  • „Java 3D“ vykdymo laikas, kurį galite gauti iš „Sun“ (reikalingas nemokamas „Java Developer Connection“ prisijungimas). Savo platformai būtinai pasirinkite „Java 3D“ OpenGL versiją (aš naudoju „Win32“). Nuo šiol naujausias „Win32 Java 3D“, skirtas „OpenGL“, yra 1.1 Beta 2, esantis java3d11-beta2-win32-opengl.exe, ir jo svoris yra maždaug 1,7 MB.

  • „OpenGL 1.1“, kartu su „Windows NT 4.0“ ir „Windows 95 OSR 2“. Jei turite „Windows 95“ OSR 1 leidimą, galite atsisiųsti „OpenGL“ palaikymą. Naujausią „Windows 95-OpenGL 1.1“ diegimą „Microsoft“ gali gauti kaip „opengl95.exe“ ir yra maždaug 0,5 MB.

  • „Java 1.2“, galima įsigyti iš „Sun“. (Atkreipkite dėmesį, kad, kai aš tai rašau, „Sun“ išleido naują „Java 1.2“ - 1 leidimo kandidatą. Naujausio leidimo pavyzdžiai bus kuo greičiau atnaujinti.) „Java 3D“ yra sujungta su 1.2 platforma, o „Sun“ pareiškė, kad java3d pomėgių pašto adresų sąrašas, kad jis nėra suinteresuotas atsieti API ir bandyti padaryti ją prieinamą su ankstesniais platformos leidimais.

Taip pat galite atsisiųsti „Java 3D“ dokumentaciją ir kodo pavyzdį. Abi yra prieinamos iš tos pačios nuorodos kaip ir „Java 3D“ vykdymo laikas.

Atminkite, kad nebereikia nustatyti aplinkos kintamųjų „CLASSPATH“, kad jūsų „Java“ arba „Appletviewer“ vykdomieji failai galėtų rasti plėtinių bibliotekas. Su „Java 1.2“ „Sun“ pagaliau sukūrė standartinį plėtinių katalogą. Šis katalogas yra JDK diegimo kataloge / jre / lib / ext /. Pavyzdžiui, mano sistemoje „Java 1.2 Beta 4“ yra įdiegta:

C: \ jdk1.2beta4 \

ir standartinis plėtinių katalogas yra:

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

Visos plėtinių bibliotekos turėtų įdėti savo „jar“ archyvus į šį plėtinių katalogą įdiegimo metu, o visi standartiniai JDK įrankiai žino, kad čia reikia ieškoti reikalingų klasės failų.

„Sun“ „Java 3D“ šiuose archyvuose yra tiek viešosios (dokumentuotos „Java 3D“ API specifikacijose), tiek privačios („Sun“ pritaikytos konkrečiai) klasės. Viešųjų klasių archyvuose yra:

  • j3dcore.jar - Yra klasės failai, skirti viešam „Java 3D“ paketui javax.media.j3d.

  • vecmath.jar - Turi klases javax.vecmath.

Privačius archyvus sudaro:

  • j3daudio.jar - Archyvuoja com.sun.j3d.audio klasės, kurios sukuria erdvinio garso palaikymą ant „Java Sound“, „Headspace“ pagrįsto garso variklio „Java“ dalies pritaikytos kopijos, debiutuojančios „Java 1.2“.

  • j3dutils.jar - Įtraukia įvairias „Sun“ naudingumo klases į 16 pakuočių ir pakuočių, esančių po žeme com.sun.j3d. Aš gilinsiuosi į šiuos paketus kitą mėnesį tęsdama „Java 3D“ diskusiją.

  • j3dutilscontrib.jar - Archyvuoja naudingos komunalinės paslaugos, kurias kiti prisidėjo prie „Sun“ pastangų. Po paketu yra septyni paketai com.sun.j3d hierarchija, įskaitant com.sun.j3d.utils.trackers minėtas kodas. Vėlgi, kito mėnesio stulpelyje bus pateikta daugiau informacijos apie šio indelio pakuotes.

Atkreipkite dėmesį, kad teoriškai jūs galite iš karto iškviesti metodus ir iškviesti bet kurią iš klasių, pateiktų nestandartiniuose paketuose, pvz., com.sun, bet įspėjimas ištuštinti: Nėra jokių garantijų, kad jie bus prieinami platformoje, kurioje jūsų kodas vykdomas. Pagal dabartinę praktiką „Java 3D“ galima įsigyti tik iš „Sun“, todėl daugelis kūrėjų naudojasi „Sun“ privačiuose archyvuose esančiomis klasėmis. Turėtumėte žinoti apie galimą perkėlimo kompromisą, kurį reikia pasirinkti.

Taip pat nėra magijos, kaip viešosios ir privačios „Java 3D“ klasės sąveikauja su sistemos ištekliais. „Sun“ įdiegia vietines bibliotekas J3D.dll ir j3daudio.dll pagal / jre / bin / kataloge. „Java 3D“ klasės naudoja vietinius metodus, kad iškviestų šiuos DLL ir sąsają su „Win32“ platforma ir „OpenGL“ atvaizdavimo biblioteka. (Panašios „Solaris“ diegimo bibliotekos yra.)

Paskutinė pastaba apie diegimą: „OpenGL“ atvaizdavimo dujotiekis skirtas pasinaudoti „OpenGL“ pagreičio aparatinės įrangos pranašumais, kad pagreitintų jūsų grafikos programas. Tačiau šiame stulpelyje turėtumėte galėti eksperimentuoti su pavyzdžiais be jokios specialios aparatūros. (Tiesą sakant, aš kuriu visus Pentium 150 MHz MMX nešiojamojo kompiuterio pavyzdžius be „OpenGL“ pagreičio įrangos.) Jei jus domina pagreičio kortelės, turėtumėte kreiptis į „OpenGL“ svetainę arba „Java 3D“ adresų sąrašą ( daugiau informacijos žr. Ištekliai). Aš planuoju įtraukti šiek tiek daugiau informacijos į kito mėnesio „Java 3D“ stulpelį apie pagreičio aparatūrą.

Vaizdo scenos šakos konstravimas

Kaip jau minėjau anksčiau, viena didžiausių scenos grafikas grafikos modelis yra tas, kad jis leidžia nepatyrusiems grafikos programuotojams pridėti 3D prie savo programų. Tradiciškai 3D programuotojai turėjo nurodyti, kur ir kaip turi būti nubrėžtos atskiros linijos ar kiti grafikos primityvai. Tačiau naudodamas scenos grafiką programuotojas paprasčiausiai sukuria medžių pavidalo struktūrą, kurioje yra mazgai, vaizduojantys perteikiamus objektus, taip pat pateikimo instrukcijos (pvz., Kur yra monitoriui rodomas vaizdas, programuotojo 3D pasaulio fizinė geometrija yra santykinis atstumas tarp daiktų).