Navigace

Hlavnφ menu

 

Java a 3D grafika - primitiva

Jsou situace, kdy pot°ebujeme zobrazovat slo₧itΘ objekty reßlnΘho sv∞ta, kterΘ nenφ mo₧nΘ vytvo°it jinak ne₧ zadßnφm sou°adnic jednotliv²ch vrchol∙, na druhou stranu jsou vÜak i situace, kdy jsou t∞lesa, kterß chceme zobrazovat, snadno matematicky definovatelnß. Mezi takovß pat°φ nap°φklad ku₧ely, kvßdry nebo koule. A prßv∞ tato primitiva budou vedle seznßmenφ se s t°φdou Appearance hlavnφ nßplnφ tohoto Φlßnku.

V Jav∞ 3D jsou vÜechna primitiva odvozena od bßzovΘ t°φdy Primitive z balφΦku com.sun.j3d.utils.geometry. Tato t°φda je navzdory tomu, co by se dalo oΦekßvat, odvozena od t°φdy Group, mφsto toho, aby byla odvozena od t°φdy Shape3D. S objekty Shape3D vÜak pracuje takΘ, pouze je to skryto p°ed zraky programßtor∙.

Manipulace s primitivy je, jak by se sluÜelo, snadnß a p°φmoΦarß, tedy do urΦitΘ mφry. StaΦφ zadat polom∞r a mßme kouli, staΦφ Üφ°ka, v²Üka a dΘlka a na sv∞t∞ je kvßdr. Ostatn∞, konstruktory mluvφ samy za sebe.

Kouli je mo₧nΘ vytvo°it nap°φklad volßnφm konstruktoru Sphere(float radius), kter² vytvo°φ kouli o polom∞ru rovnΘm parametru radius umφst∞nou v poΦßtku soustavy sou°adnic. Stejn∞ jako u dalÜφch primitiv, s nimi₧ se seznßmφme dßle, m∙₧eme i u koule urΦit "hrubost", tedy mno₧stvφ vrchol∙ mnohost∞nu aproximujφcφho kouli. To pochopiteln∞ nelze urΦit p°φmo, ale jen prost°ednictvφm parametru divisions v konstruktoru Sphere(float radius, int flags, int divisions), kter² urΦuje rozliÜenφ vzhledem k sou°adnicov²m osßm.

Konstruktor Box(float width, float height, float length, Appearance ap) vytvß°φ kvßdr o zadan²ch rozm∞rech, jeho₧ st°ed le₧φ v poΦßtku, tedy sou°adnice jeho pravΘho p°ednφho vrcholu jsou [width/2, height/2, length/2]. V²znam parametru Appearance si vysv∞tlφme dßle v tomto Φlßnku. T°φda Box je jedinß z podt°φd t°φdy Primitive, kterß vy₧aduje ve vÜech sv²ch konstruktorech p°edßnφ objektu Appearance.

DalÜφ z primitiv, ku₧el, je mo₧nΘ vytvo°it volßnφm konstruktoru Cone(float radius, float height). Takto vytvo°en² ku₧el mß podstavu o polom∞ru radius a jeho v²Üka je rovna height. Osa soum∞rnosti ku₧ele le₧φ na ose y a st°ed tΘto osy le₧φ v poΦßtku soustavy sou°adnic. Pokud chceme u ku₧ele urΦit rozliÜenφ, musφme konstruktoru p°edat dva parametry û jeden pro rovinu podstavy (xdivision), druh² pro osu, v nφ₧ le₧φ osa ku₧ele (ydivision). Konstruktor vypadß takto: Cone(float radius, float height, int flags, int xdivision, int ydivision, Appearance ap).

Poslednφ t°φdou z naÜeho v²Φtu je t°φda Cylinder, kterß slou₧φ k vytvß°enφ vßlc∙. Konstruktoru Cylinder (float radius, float height) se p°edßvajφ dva parametry, polom∞r podstavy (radius) a v²Üka vßlce (height). DalÜφ konstruktory, vy₧adujφcφ vφce parametr∙, jsou analogickΘ ke konstruktor∙m ji₧ zmφn∞n²ch t°φd.

Na nßsledujφcφm obrßzku jsou zobrazena vÜechna zmi≥ovanß primitiva. Pokud ale majφ vypadat skuteΦn∞ trojrozm∞rn∞, neobejdeme se bohu₧el bez sv∞tel, s nimi₧ se seznßmφme a₧ v p°φÜtφm Φlßnku, proto zde nynφ neuvßdφm zdrojov² k≤d.

Ukßzka jednotliv²ch primitiv

Pokud mßme ve scΘn∞ n∞kolik objekt∙ Primitive se stejnou geometriφ, je vytvo°en jen jeden objekt Geometry, kter² je pak sdφlen mezi t∞mito objekty. Tato optimalizaΦnφ technika mß n∞kolik vedlejÜφch d∙sledk∙, z nich₧ nejv²znamn∞jÜφ je, ₧e zm∞nφme-li objekt Geometry jednomu objektu, zm∞nφ se tφm u vÜech. Pokud tedy budete chtφt, aby se objekty Geometry nesdφlely, nastavte v konstruktoru p°φznak GEOMETRY_NOT_SHARED.

Appearance

Vzhled objekt∙ ve scΘn∞ je dßn jednak geometriφ t∞chto objekt∙, obsa₧enΘ v objektech Geometry (v nich mohou b²t ulo₧eny i informace o barv∞, o tom ale a₧ jindy), jednak informacemi ulo₧en²mi v objektech Appearance, kterΘ udr₧ujφ vlastnosti jako je nap°φklad barva, Üφ°ka hran nebo "materißl, ze kterΘho je objekt vytvo°en". Materißlem jsou myÜleny vlastnosti povrchu vzhledem k osv∞tlenφ.

Je toho docela dost, co lze pomocφ objekt∙ Appearance ud∞lat, nikoli vÜe je ale stejn∞ u₧iteΦnΘ. AΦkoli je to p°ekvapujφcφ, nap°φklad barvu p°φliÜ nevyu₧ijete, proto₧e ta je u₧iteΦnß pouze u neosv∞tlen²ch objekt∙, mφsto toho budete spφÜe urΦovat materißl. Poj∩me se nynφ alespo≥ v krßtkosti seznßmit s vφcemΘn∞ u₧iteΦn²mi metodami t°φdy Appearance.

Metoda setColoringAttributes(ColoringAttributes attr) umo₧≥uje nastavovat druh stφnovßnφ a barvu, kterß vÜak, jak u₧ bylo °eΦeno, je pou₧ita pouze tehdy, pokud nenφ objekt osvφcen. To je trochu zvlßÜtnφ, proto₧e druh stφnovßnφ m∙₧ete u osv∞tlen²ch objekt∙ pot°ebovat, zatφmco barva nastavovanß v tΘm₧e objektu se u nich v∙bec neprojevφ.

Konstruktor t°φdy ColoringAttributes(Color3f color, int shade) vy₧aduje dva parametry. Prvnφ z nich, objekt Color3f je klasickß RGB barva bez alfa kanßlu urΦenß t°emi Φφsly float z intervalu 0 a₧ 1. Druh² parametr urΦuje typ stφnovßnφ, kter² nab²vß jednΘ z hodnot konstant definovan²ch ve t°φd∞ ColoringAttributes SHADE_FLAT, SHADE_GOURAUD, FASTEST a NICEST (p°itom v∞tÜinou, ale nemusφ tomu tak b²t v₧dy, platφ, ₧e SHADE_FLAT je to samΘ jako FASTEST a SHADE_GOURAUD jako NICEST). Pokud pou₧ijete stφnovßnφ SHADE_FLAT, bude mφt ka₧d² troj·helnφk jednu barvu po celΘ svΘ ploÜe, zatφmco kdy₧ pou₧ijete stφnovßnφ SHADE_GOURAUD, bude ka₧d² vrchol troj·helnφku moci mφt jinou barvu a barva uvnit° tohoto troj·helnφku se bude postupn∞ m∞nit mezi t∞mito vrcholy. Porovnat v²sledek obou stφnovacφch model∙ m∙₧ete na nßsledujφcφm obrßzku.

Ukßzka stφnovßnφ

DalÜφ z parametr∙, kterΘ m∙₧eme pomocφ objekt∙ Appearance ovliv≥ovat, jsou vlastnosti Φar a bod∙. K tomu slou₧φ metody setPointAttributes(PointAttributes attrinutes) a setLineAttributes(LineAttributes attributes). A₧ budeme vytvß°et drßt∞nΘ modely, ukß₧eme si jejich pou₧itφ, zatφm pro nßs nemajφ velk² v²znam.

Docela zajφmavΘ ale je vyu₧itφ pr∙hlednosti, k Φemu₧ slou₧φ metoda setTransparencyAttributes(TransparencyAttributes attributes). Konstruktor TransparencyAttributes(int transparencyMode, float transparencyValue) p°ebφrß dva parametry. Parametr transparencyMode nab²vß hodnoty jednΘ z konstant BLENDED, SCREEN_DOOR, FASTEST, NICEST nebo NONE, definovan²ch ve t°φd∞ TransparencyAttributes. Nejzajφmav∞jÜφ z t∞chto m≤d∙ je BLENDED, kter², pokud mßte v objektu Geometry ulo₧eny hodnoty alfa transparence u jednotliv²ch vrchol∙, zkombinuje tyto hodnoty podle urΦitΘho vzorce s hodnotou v objektu Appearance. Nßsledujφcφ obrßzek byl vytvo°en s vyu₧itφm pr∙hlednosti s hodnotami parametr∙ transparencyMode rovnΘm NICEST a transparencyValue rovnΘm 0.5 (0 je pro nepr∙hlednΘ objekty, 1 pro zcela pr∙hlednΘ).

Ukßzka transparence

To je vÜe, co jsme zatφm schopni vyu₧φt. P°φÜt∞ rozÜφ°φme svΘ znalosti o ji₧ zmi≥ovanou prßci se sv∞tly.

Ku₧elka, Ond°ej (19. 2. 2004)

Java a 3D grafika

P°esto₧e prßce s 3D grafikou nepat°φ ke standardnφmu nasazenφ Javy, m∙₧e i v tomto oboru dosßhnout velmi zajφmav²ch v²sledk∙, prost°ednictvφm specißlnφho Java 3D API. Tato sΘrie Φlßnk∙ dosud nebyla ukonΦena!