Programování

Programování 3D grafiky v Javě, Část 1: Java 3D

Aby bylo možné vybudovat skutečnou platformu Java, společnost Sun si brzy uvědomila, že je nutné vyplnit obrázek API nad rámec omezených funkcí dostupných v základní platformě Java 1.0. Sun velmi rozšířil jádro s verzemi 1.1 a blížícími se 1.2, ale v logice Java stále chybí některé kousky.

Společnost Sun a její partneři vyvinuli rozhraní Java Media and Communication API, aby poskytli chybějící části multimediálního programování. Dva z největších kousků, 2D a 3D grafika, jsou zaměřeny na Java 2D a 3D API. Java 2D je základní platformní API počínaje verzí Java 1.2, zatímco Java 3D bude vydána jako Extension API krátce poté, co bude k dispozici platforma 1.2. Nedávno jsme dokončili řadu sloupců v prostředí Java 2D; nyní věnujeme pozornost Java 3D.

Java 3D má dát vývojářům Java schopnost psát applety a aplikace, které uživatelům poskytují trojrozměrný interaktivní obsah. Sun má v této aréně těžkou konkurenci z jiných 3D grafických technologií a Java 3D má před sebou těžkou bitvu, pokud má porazit dosavadní grafický standard OpenGL.

Žádost o komentáře čtenářů k 3D grafickým API pro Javu naznačila vážný zájem o vazby Java 3D a Java OpenGL, proto jsem se rozhodl soustředit své úsilí na tyto technologie v příštích měsících.

Omezené množství zájmu bylo vyjádřeno ve VRML. V důsledku toho se budu zabývat VRML tím, že předvedu jeho použití v prostředí Java 3D pomocí zavaděčů obsahu VRML97 a prohlížeče Java 3D VRML97. Direct3D se těšil velmi malému zájmu, takže jsem se rozhodl nepokračovat touto cestou, kromě zmínky o tom, kde ji může podporovat nebo spolupracovat některá z dalších technologií.

Výhody a nevýhody Java 3D

Tento měsíc zahajujeme naši prohlídku 3D grafických API pro Javu zkoumáním Java 3D. Začneme tím, že probereme některé z hlavních silných a slabých stránek API. 3D grafika může někdy vypadat poněkud tupě, a proto může být obtížné ji vysvětlit. Máte-li jakékoli přetrvávající nejasnosti ohledně mých příkladů nebo vysvětlení, neváhejte a napište mi se svými dotazy nebo připomínkami, a já se budu snažit je řešit.

Prodejní body pro Java 3D:

  • Poskytuje objektově orientovaný pohled na 3D grafiku na vysoké úrovni. Java 3D toho částečně dosahuje pomocí a graf scény- založený 3D grafický model. (O tomto pojmu se budeme podrobněji bavit dále v článku.) Tento přístup má pomoci programátorům, kteří nemají velké zkušenosti s programováním grafiky nebo multimédií, používat ve svých aplikacích 3D. V ostrém kontrastu s nižšími úrovněmi, procedurálními 3D API, jako je OpenGL, které jsou navrženy tak, aby optimalizovaly na nejlepší možnou rychlost a poskytly programátorům co největší kontrolu nad procesem vykreslování, má být Java 3D dostatečně přímočará pro každého zkušeného programátora Java, aby Učit se.

  • Pokud nepotřebujete nízkoúrovňový přístup k vykreslovacím operacím, může být řešením Java 3D. Přístup k vykreslení je omezen na požadavky prostřednictvím atributy a bitů schopností, podobnou formou a funkcí jako rady pro vykreslování Java 2D. (Viz Zdroje pro odkazy na mé předchozí série o prostředí Java 2D, které zahrnovaly diskusi a příklady rad pro vykreslování 2D).

  • Java 3D je optimalizována na rychlost, kde je to možné. Modul runtime ve skutečnosti využívá bity schopností vykreslování k optimalizaci grafu scény pro nejrychlejší možné vykreslení. Díky tomuto přístupu je aplikace Java 3D použitelnější v interaktivních grafických prostředích (hry, simulace, situace s nízkou latencí) než v offline vysoce kvalitních grafických aplikacích (jako jsou vykreslovací farmy).

  • K importu obsahu do běhového prostředí Java 3D je k dispozici velký a rostoucí počet 3D zavaděčů. Sun zpřístupnil zavaděč a prohlížeč souborů Java 3D VRML97 s kódem. Podívejte se na příští měsíc Programování médií sloupec prozkoumat Java 3D zavaděče podrobněji.

  • Java 3D vyžaduje možnosti vektorové matematiky, které nejsou k dispozici jinde na platformě Java. Tyto matematické operace se aktuálně nacházejí v javax.vecmath balíček a v budoucnu může být přesunut na základní platformu.

  • Java 3D podporuje řadu exotických zařízení (například hůlky, datové rukavice a náhlavní soupravy). The com.sun.j3d.utils.trackers balíček zahrnutý v implementaci Sunu poskytuje třídy pro zařízení Fakespace, Logitech a Polhemus. Tato zařízení však nejsou široce používána, takže je nebudu podrobně rozebírat. Pokud máte zájem o další informace o podpoře zařízení, podívejte se na webové stránky Java 3D společnosti Sun a archiv adresářů Java 3D (oba jsou k dispozici na hlavních adresách URL Sun Java 3D uvedených v níže uvedených zdrojích).

Java 3D má spoustu výhod, ale co nevýhody? Obsahují:

  • Java 3D je standardní rozšíření API. Držitelé licence na platformu Java mají možnost implementovat API, pokud se jim líbí, ale nejsou povinni jej implementovat. Umístění Java 3D jako standardní rozšíření riskuje snížení přenositelnosti kódu Java 3D napříč platformami - většina prodejců se musí snažit držet krok se změnami a doplňky samotné základní platformy.

  • Java 3D má přísná omezení dostupnosti. Ty jsou výsledkem stavu prostředí Java 3D jako rozšíření API. Jediným významným dodavatelem, který v současné době poskytuje implementaci Java 3D, je Sun s implementacemi pro systémy Solaris a Win32. Ve srovnání s OpenGL, který je k dispozici pro všechny varianty Unixu, Windows a mnoha dalších operačních systémů, vypadá přenositelnost kódu Java 3D napříč platformami sporně.

  • Spolu s problémy s dostupností softwaru přicházejí deficity dokumentace. Sun vyvíjí statečné úsilí poskytovat školení pro vývojáře a podporu pro Java 3D, ale ve srovnání se zbytkem průmyslového úsilí při dokumentování OpenGL a jeho používání stále zaostává. Web OpenGL Consortium je mnohem hlubší a širší než cokoli, co se Sunu dosud podařilo sestavit pro Java 3D. To není drobný bod: díky relativní složitosti 3D grafických API je dobrá dokumentace nutností.

  • Java 3D skryje podrobnosti vývojového kanálu od vývojáře. Protože Java 3D je rozhraní API na vysoké úrovni, záměrně skryje podrobnosti vykreslovacího kanálu před vývojářem, což jej činí nevhodným pro značný počet problémů, kde jsou tyto podrobnosti důležité. (O modelu nižší úrovně OpenGL a přístupu k vykreslovacímu kanálu budeme diskutovat později v této sérii 3D.)

  • Komponenty Java 3D jsou těžké. To znamená, že mají nativní (jiný než Java) peer, který ve skutečnosti provádí vykreslování. To může komplikovat vývoj vašeho grafického uživatelského rozhraní, pokud používáte Java Swing a jeho all-Java nebo lehké komponenty. Existují některá speciální řešení, ale obecně se lehké a těžké komponenty ve stejných objektech a oknech dobře nemíchají. Další informace o problémech s lehkými a těžkými součástmi najdete v Zdrojích na konci tohoto článku.

Instalace Java 3D

Nyní, když chápeme hlavní rysy a omezení Java 3D, pojďme si vyzkoušet nějaký ukázkový kód.

Java 3D je k dispozici v beta verzi pro Win32 a Solaris. Zralejší implementace Java 3D od Sunu je postavena na OpenGL. Pro Win32 je k dispozici také implementace Direct3D v alfa kvalitě. Všechny vyžadují Java 1.2, přičemž nejnovější Java 3D beta odpovídá Java 1.2 Beta 4. Sun slíbil vydání finální implementace Java 3D krátce po vydání Java 1.2, která je aktuálně naplánována na prosinec 1998.

Trochu matoucí stranou: Společnost Sun vydala implementace Java 3D 1.0 alfa, které odpovídaly API Java 3D 1.0 API, ale nikdy nevydala nic jiného než alfa pro 1.0 API. Sun poté upravil API a uvolnil upravenou verzi jako API Java 3D 1.1. Po této verzi následovaly verze implementace beta verze 1.1, zatím dvě. Sun slíbil, že vydá finální API a implementaci krátce po finálním vydání platformy Java 1.2. Doufejme, že se API stabilizovalo a nebude znovu revidováno, přičemž svět stále čeká na finální vydání implementace bonafide.

Vzhledem k tomu, že se budeme v budoucnu zabývat vazbami Java OpenGL, rozhodl jsem se v těchto instalačních pokynech také ušetřit a použít OpenGL verzi Java 3D. Pokud nainstalujete verzi OpenGL pro použití s ​​těmito příklady Java 3D, budete mít knihovny pro vykreslování, které potřebujete, aby příklady Java-OpenGL přišly později.

Softwarové komponenty, které potřebujete k používání Java 3D, jsou:

  • Modul runtime Java 3D, dostupný od společnosti Sun (je vyžadováno přihlášení pomocí Java Developer Connection). Nezapomeňte pro svou platformu zvolit verzi OpenGL Java 3D (používám Win32). Nejnovější Win32 Java 3D pro OpenGL je od nynějška 1.1 Beta 2 v souboru java3d11-beta2-win32-opengl.exe a váží přibližně 1,7 MB.

  • OpenGL 1.1, dodávaný s Windows NT 4.0 a Windows 95 OSR 2. Pokud máte vydání OSR 1 pro Windows 95, můžete si stáhnout podporu OpenGL. Nejnovější implementace Windows 95-OpenGL 1.1 je k dispozici od společnosti Microsoft jako opengl95.exe a má přibližně 0,5 MB.

  • Java 1.2, k dispozici od společnosti Sun. (Všimněte si, že když píšu toto, společnost Sun vydala novou verzi Java 1.2 - Release Candidate 1. Příklady budou aktualizovány pro nejnovější verzi co nejdříve.) Java 3D je spojena s platformou 1.2 a Sun uvedl na java3d-interest mailing list, že nemá zájem na oddělení API a pokusu o jeho zpřístupnění s předchozími verzemi platforem.

Volitelně můžete také stáhnout dokumentaci Java 3D a ukázkový kód. Oba jsou k dispozici ze stejného odkazu jako Java 3D runtime.

Vezměte prosím na vědomí, že již nemusíte nastavovat proměnné prostředí CLASSPATH, aby vaše spustitelné soubory Java nebo appletviewer mohly najít knihovny rozšíření. S prostředím Java 1.2 vytvořil Sun konečně standardní adresář rozšíření. Tento adresář se nachází na / jre / lib / ext / v instalačním adresáři JDK. Například v mém systému je Java 1.2 Beta 4 nainstalována na:

C: \ jdk1.2beta4 \

a standardní adresář rozšíření je na:

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

Všechny knihovny rozšíření by měly umístit své jarní archivy do tohoto adresáře rozšíření v době instalace a všechny standardní nástroje JDK vědí, že zde mohou hledat potřebné soubory tříd.

U prostředí Sun 3D Java tyto archivy zahrnují jak veřejné (dokumentované ve specifikaci Java 3D API), tak soukromé (specifické pro implementaci Sun) třídy. Veřejné archivy tříd zahrnují:

  • j3dcore.jar - Obsahuje soubory třídy pro veřejný balíček Java 3D javax.media.j3d.

  • vecmath.jar - Obsahuje kurzy pro javax.vecmath.

Soukromé archivy zahrnují:

  • j3daudio.jar - Archivuje com.sun.j3d.audio třídy, které staví podporu pro prostorový zvuk nad vlastní kopií Java části zvukového modulu Java Sound, založeného na Headspace, debutujícího v Javě 1.2.

  • j3dutils.jar - Zapouzdřuje různé třídy nástrojů Sun do 16 celkových balíčků a dílčích balíčků pod nimi com.sun.j3d. Do těchto balíčků se ponořím hlouběji v pokračování naší diskuse o Java 3D příští měsíc.

  • j3dutilscontrib.jar - Archivuje užitečné nástroje, které přispěly ostatní k úsilí společnosti Sun. Pod balíčkem je sedm balíčků com.sun.j3d hierarchie, včetně com.sun.j3d.utils.trackers výše uvedený kód. Sloupec příští měsíc opět poskytne více informací o balíčcích v této jar.

Vezměte prosím na vědomí, že teoreticky můžete vytvářet instance a volat metody na kterékoli ze tříd poskytovaných v nestandardních balíčcích, jako je com. slunce, ale upozornění emptor: Neexistuje žádná záruka, že budou k dispozici na platformě, na které je váš kód spuštěn. V současné praxi je Java 3D k dispozici pouze od společnosti Sun, takže mnoho vývojářů ve skutečnosti používá třídy v soukromých archivech společnosti Sun. Měli byste si být vědomi možného kompromisu přenositelnosti, který s sebou nese volba.

Neexistuje žádné kouzlo v tom, jak veřejné a soukromé třídy Java 3D propojují se systémovými prostředky. Sun instaluje nativní knihovny do J3D.dll a j3daudio.dll pod / jre / bin / adresář. Třídy Java 3D používají nativní metody k volání těchto knihoven DLL a rozhraní s platformou Win32 a knihovnou vykreslování OpenGL. (Podobné knihovny existují pro implementace systému Solaris.)

Jedna závěrečná poznámka k instalaci: Vykreslovací kanál OpenGL je navržen tak, aby využíval výhody akceleračního hardwaru OpenGL k urychlení vašich grafických aplikací. Pro účely tohoto sloupce byste však měli mít možnost experimentovat s příklady bez speciálního hardwaru. (Ve skutečnosti vyvíjím všechny příklady na notebooku Pentium 150 MHz MMX bez hardwaru pro akceleraci OpenGL.) Pokud vás zajímají akcelerační karty, měli byste se podívat na web OpenGL nebo na seznam adresářů Java 3D ( viz Zdroje) pro více informací. Mám v plánu zahrnout trochu více informací také do sloupce Java 3D pro příští měsíc na hardwaru akcelerace.

Sestavení větve pohledu na scénu

Jak jsem již uvedl dříve, jednou z největších silných stránek graf scény grafický model je v tom, že umožňuje nezkušeným grafickým programátorům přidávat do svých aplikací 3D. Tradičně museli 3D programátoři určit, kde a jak mají být jednotlivé čáry nebo jiné grafické primitivy kresleny. Pomocí scénického grafu však programátor jednoduše vytvoří stromovou strukturu obsahující uzly, které představují objekty, které mají být vykresleny, a také pokyny pro vykreslení (například kde se nachází hledisko zobrazené na monitoru, fyzická geometrie 3D světa, programátor je vytváření a relativní vzdálenosti mezi věcmi).

$config[zx-auto] not found$config[zx-overlay] not found