<h2>Java a 3D grafika - Geometry (PointArray, LineArray a TriangleArray)</h2>
<p id='prepend'>V tomto Φlßnku se zaΦneme zab²vat vytvß°enφm objekt∙ prost°ednictvφm instancφ t°φdy Shape3D. Ukß₧eme si, jak pomocφ ·seΦek vytvo°it drßtov² model krychle, a pak si povφme, jak se dajφ pomocφ troj·helnφk∙ vytvß°et t∞lesa se st∞nami.</p>
<p>Ne₧ se pustφte do Φtenφ tohoto Φlßnku, doporuΦuji vßm o₧ivit si pov∞domφ o tom, jakΘ objekty se objevujφ v grafu scΘny, jakΘ podmφnky musφ graf scΘny spl≥ovat a k Φemu jsou dobrΘ objekty Appearance, prost°ednictvφm Φlßnku <a href='http://interval.cz/clanek.asp?article=2834' title='Ku₧elka, Ond°ej: Java a 3D grafika - graf scΘny'>Java a 3D grafika - graf scΘny.</a></p>
<p>Pro vytvß°enφ trojrozm∞rn²ch objekt∙ se pou₧φvajφ objekty Shape3D, kterΘ mohou odkazovat na instance podt°φd abstraktnφ t°φdy Geometry a na objekty Appearance. (Jeden objekt Shape3D m∙₧e odkazovat i na n∞kolik objekt∙ Geometry, ale ty musφ b²t stejnΘho typu.) Tyto objekty se jim p°i°azujφ bu∩ p°φmo v konstruktoru <samp>Shape3D(Geometry geometry, Appearance appearance)</samp>, nebo pomocφ metod <samp>setGeometry(Geometry geometry)</samp> a <samp>setAppearance(Appearance appearance)</samp>.</p>
<p>Objekty Geometry obsahujφ vlastnφ data objekt∙, tedy sou°adnice vrchol∙, normßlovΘ vektory, barvy vrchol∙ a sou°adnice slou₧φcφ k otexturovßnφ. V objektech Appearance pak jsou ulo₧eny informace o materißlu, Üφ°ce Φar, tlouÜ¥ce bod∙, o tom, zda se mß nebo nemß pou₧φt antialiasing a tak dßle. Podrobn∞ji jsme se ale t°φd∞ Appearance v∞novali v Φlßnku <a href='http://interval.cz/clanek.asp?article=3126' title='Ku₧elka, Ond°ej: Java a 3D grafika - primitiva'>o grafick²ch primitivech</a>, tak₧e na tomto mφst∞ snad postaΦφ jen tato krßtkß zmφnka.</p>
<h3>T°φda GeometryArray a jejφ potomci</h3>
<p>Vzhledem k tomu, ₧e t°φd odvozen²ch od t°φdy Geometry je pom∞rn∞ dost, rozlo₧φme si povφdßnφ o nich do n∞kolika Φlßnk∙. V tomto Φlßnku zaΦneme n∞kolika potomky t°φdy GeometryArray, konkrΘtn∞ t°φdami PointArray, LineArray a TriangleArray.</p>
<p>JednoduÜÜφ verze konstruktor∙ vÜech Φty° zmφn∞n²ch t°φd p°ebφrajφ pouze dva parametry - poΦet vrchol∙ a jejich "formßt", tedy bitovΘ p°φznaky °φkajφcφ, co p°esn∞ bude v danΘm objektu Geometry ulo₧eno. P°φznaky definovanΘ ve t°φd∞ GeometryArray jsou <samp>COORDINATES</samp> pro sou°adnice, <samp>NORMALS</samp> pro normßlovΘ vektory, <samp>COLOR_3</samp> pro barvu bez alfa-transparence, <samp>COLOR_4</samp> pro barvu s alfa-transparencφ, <samp>TEXTURE_COORDINATES_2</samp>, <samp>TEXTURE_COORDINATES_3</samp> a <samp>TEXTURE_COORDINATES_4</samp> pro sou°adnice textur. Tak nap°φklad budeme-li chtφt vytvo°it instanci t°φdy PointArray obsahujφcφ Φty°i barevnΘ body, bude volßnφ konstruktoru vypadat takto: <samp>PointArray(4, GeometryArray.COORDINATES | GeometryArray.COLOR_3);</samp>.</p>
<p>Mßme-li u₧ objekt GeometryArray vytvo°en², musφme do n∞ho vlo₧it pot°ebnß data. Nßsledujφ metody slou₧φcφ pro nastavenφ sou°adnic vrchol∙:</p>
<p>V poli "coordinates" jsou ulo₧eny sou°adnice vrchol∙. Parametr "index" oznaΦuje pozici v poli "coordinates", kde se sou°adnice nachßzejφ. Metody pro nastavenφ barev, normßlov²ch vektor∙ a sou°adnic textur jsou velice podobnΘ a postupn∞ se k nim dostaneme alespo≥ v p°φkladech.</p>
<h4>T°φda LineArray</h4>
<p>Nynφ u₧ toho vφme dost na to, abychom mohli s vyu₧itφm t°φdy LineArray, kterß je urΦena k vytvß°enφ t∞les z ·seΦek, vytvo°it jednoduchou t°φdu odvozenou od t°φdy Shape3D slou₧φcφ k vytvß°enφ drßtov²ch krychlφ. Jejφ k≤d nßsleduje:</p>
<div class='sample'>
package interval.j3d;
<br />
<br />import javax.media.j3d.*;
<br />
<br />public class DratovaKrychle extends Shape3D {
<br />
<br /> float souradnice[] =
<br /><span class='comment'>//sou°adnice bod∙, v₧dy dva body pro ·seΦku</span>
<br /> {-1,-1,1, -1,1,1, -1,1,1, 1,1,1,
<br /> 1,1,1, 1,-1,1, 1,-1,1, -1,-1,1,
<br /> -1,-1,-1, -1,1,-1, -1,1,-1, 1,1,-1,
<br /> 1,1,-1, 1,-1,-1, 1,-1,-1, -1,-1,-1,
<br /> -1,-1,1, -1,-1,-1, -1,1,1, -1,1,-1,
<br /> 1,1,1, 1,1,-1, 1,-1,1, 1,-1,-1};
<br />
<br /> public DratovaKrychle(float hrana) {
<br /><span class='comment'>//nastavφme velikost hran</span>
<br /><span class='comment'>//nastavφme tlouÜ¥ku Φßry na 3 pixely, povolφme antialiasing</span>
<br /> LineAttributes la = new LineAttributes(3, LineAttributes.PATTERN_SOLID, true);
<br /> app.setLineAttributes(la);
<br /> return app;
<br /> }
<br />}
</div>
<p>Jak m∙₧ete sami vid∞t, je k≤d tΘto t°φdy velice jednoduch². Pouze v konstruktoru vytvß°φ objekt Geometry, do kterΘho vlo₧φ sou°adnice zadanΘ v poli "souradnice", kterΘ jeÜt∞ p°edtφm vynßsobφ parametrem "hrana/2", abychom mohli vytvß°et krychle r∙zn²ch velikostφ. Toto je v²sledek:</p>
<p>Pou₧itφ tΘto t°φdy a takΘ dalÜφch t°φd v tomto Φlßnku, krom∞ t°φdy PointArray, je mnohdy dost ne·spornΘ z hlediska nßrok∙ na pam∞¥ û nap°φklad sou°adnice ka₧dΘho z vrchol∙ krychle v p°φkladu uklßdßme t°ikrßt. ╪eÜenφm mohou b²t podt°φdy, bu∩ t°φdy GeometryStripArray nebo t°φdy IndexedGeometryArray. O tom ale a₧ jindy.</p>
<h4>T°φda PointArray</h4>
<p>T°φda PointArray nßm umo₧≥uje zobrazovat jednotlivΘ vrcholy. Ve spojenφ s nφ se hodφ vyu₧φt mo₧nosti nastavenφ tlouÜ¥ky bod∙ prost°ednictvφm t°φdy PointAttributes, jejφ₧ instance se p°ipojujφ k p°φsluÜn²m objekt∙m Appearance. Konstruktor <samp>PointAttributes(float pointSize, boolean antialiasing)</samp> p°ebφrß dva parametry. Parametr "pointSize" urΦuje tlouÜ¥ku bod∙ a parametr "antialiasing" urΦuje, jestli se mß pou₧φt antialiasing.</p>
<p>T°φdu PointArray vyu₧ijeme k vylepÜenφ p°edchozφho p°φkladu tφm, ₧e do ka₧dΘho vrcholu krychle nakreslφme bod zadanΘ tlouÜ¥ky. NaÜe novß t°φda vÜak nebude rozÜi°ovat t°φdu Shape3D, ale bude odvozena od t°φdy Group (kv∙li nemo₧nosti vklßdat do objekt∙ Shape3D objekty Geometry r∙znΘho typu, v tomto p°φpad∞ tedy instance t°φd LineArray a PointArray).</p>
<div class='sample'>
package interval.j3d;
<br />
<br />import javax.media.j3d.*;
<br />
<br />public class DratovaKrychle2 extends Group {
<br />
<br /> float souradnice[] =
<br /> {1,1,1, -1,1,1, 1,-1,1, 1,1,-1,
<br /> -1,-1,1, -1,1,-1, 1,-1,-1, -1,-1,-1};
<br />
<br /> public DratovaKrychle2(float hrana) {
<br /> for (int i = 0; i < 24; i++)
<br /> souradnice[i] *= hrana/2f;
<br /> Shape3D shape2 = new Shape3D();
<br /><span class='comment'>//objektu shape2 nastavφme objekt Geometry</span>
<br /> shape2.setGeometry(vytvorGeometryBodu());
<br /><span class='comment'>//objektu shape2 nastavφme objekt Appearance</span>
<br /><span class='comment'>//p°idßme objekt DratovaKrychle</span>
<br /> addChild(new DratovaKrychle(hrana));
<br /> addChild(shape2);
<br /> }
<br /> Geometry vytvorGeometryBodu(){
<br /> PointArray pointArray = new PointArray(8, GeometryArray.COORDINATES);
<br /> pointArray.setCoordinates(0, souradnice);
<br /> return pointArray;
<br /> }
<br /> Appearance vytvorAppearanceBodu(){
<br /> Appearance app = new Appearance();
<br /> PointAttributes pa = new PointAttributes(10, true);
<br /> app.setPointAttributes(pa);
<br /> return app;
<br /> }
<br />}
</div>
<p>A takto vypadß v²sledek:</p>
<div class='image'><img src='podklady/kuzelka/865/dratova_krychle2.png' alt='Drßtovß krychle se zv²razn∞n²mi vrcholy' title='Drßtovß krychle se zv²razn∞n²mi vrcholy' /></div>
<p>Pro lepÜφ p°edstavu si jeÜt∞ ukß₧eme, jak by mohla vypadat instance tΘto t°φdy zakreslenß v grafu scΘny, jak to m∙₧ete vid∞t na nßsledujφcφm obrßzku:</p>
<p>T°φda TriangleArray slou₧φ, jak u₧ jejφ nßzev napovφdß, k vytvß°enφ t∞les z troj·helnφk∙. Jejφ vyu₧itφ si ukß₧eme na vytvo°enφ Φty°st∞nu. Abychom si takΘ ukßzali, jak pracovat s barvami p°i°azen²mi jednotliv²m vrchol∙m, o₧ivφme st∞ny naÜeho Φty°st∞nu nßhodn∞ vybran²mi barvami.</p>
<div class='sample'>
package interval.j3d;
<br />
<br />import javax.media.j3d.*;
<br />import javax.vecmath.*;
<br />import java.util.Random;
<br />
<br />public class Ctyrsten extends Shape3D {
<br /><span class='comment'>//vypoΦφtßme si dv∞ odmocniny, kterΘ budeme pot°ebovat</span>
<br /> Color3f color = new Color3f(rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
<br /> for (int j = 0; j < 3; j++)
<br /> ta.setColor(3*i+j, color);
<br /> }
<br /> return ta;
<br /> }
<br />}
</div>
<p>Obarvenφ tohoto t∞lesa provßdφme v metod∞ <samp>vytvorGeometry()</samp>, kde volßnφm metody <samp>setColor(int i, Color3f color)</samp> nastavujeme ka₧d²m t°em bod∙m urΦujφcφm st∞nu jednu nßhodn∞ vybranou barvu. Barvy jsme ale klidn∞ mohli nastavit odliÜnΘ pro ka₧d² vrchol - pak by se v jednotliv²ch st∞nßch postupn∞ m∞nily.</p>
<p>Objekty, kterΘ jsme v tomto Φlßnku vytvo°ili, majφ jeden velk² nedostatek - sv∞tla na n∞ nemajφ ₧ßdn² ·Φinek. Jak se s tφmto nedostatkem vypo°ßdat, o tom si povφme p°φÜt∞.</p>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3380'>VyΦiÜt∞nφ tabulky z MS Wordu v MSIE JavaScriptem</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3383'>Kompletnφ pr∙vodce XSLT - °φzenφ toku transformace</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3385'>èt∞pßnka Sunkovß: Jeden za vÜechny, vÜichni za jednoho</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3379'>SMARTY - cache, WAP a bezpeΦnost</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3381'>╚eskß on-line reklama - internet a chu¥ na bagety</a></li>
</ul>
</div>
</div>
<div class='page-right-box cauldron'>
<h3>Diskuznφ kotel</h3>
<div class='page-right-box-in'>
<ul>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3357' title='(57 komentß°∙)'>Se°azenφ tabulky JavaScriptem snadno a rychle</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3363' title='(29 komentß°∙)'>JavaScript, programujeme internetovΘ aplikace</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3364' title='(29 komentß°∙)'>Kam pat°φ menu</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3368' title='(20 komentß°∙)'>Eric Meyer o CSS - Ovlßdn∞te kaskßdovΘ styly!</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3380' title='(16 komentß°∙)'>VyΦiÜt∞nφ tabulky z MS Wordu v MSIE JavaScriptem</a></li>