<p id='prepend'>V p°edchozφm Φlßnku jsme si ukßzali, jak se s pomocφ Java 3D API vytvß°φ jednoduchß scΘna. V tomto Φlßnku se podφvßme podrobn∞ji na problematiku grafu scΘny. Ukß₧eme si, jak jej zakreslovat a seznßmφme se s bßzov²mi t°φdami v∞tÜiny objekt∙ objevujφcφch se ve scΘn∞.</p>
<h3>Jak zakreslovat graf scΘny</h3>
<p>Jak znßmo, dokß₧e obΦas jeden obrßzek osv∞tlit urΦitou problematiku daleko lΘpe ne₧ n∞kolik desφtek °ßdk∙ textu a v p°φpad∞ grafu scΘny to platφ dvojnßsob. Jen si zkuste p°edstavit, jak slovy popisujete nßsledujφcφ jednoduch² graf:</p>
<div class='image'><img src='podklady/kuzelka/687/graf.png' alt ='jednoduch² graf scΘny' title ='jednoduch² graf scΘny' /></div>
<p>A to obsahuje pouze t°i barevnΘ krychle (ColorCube), z nich₧ dv∞ jsou transformovßny jednφm spoleΦn²m objektem TransformGroup, z Φeho₧ jedna je transformovßna jeÜt∞ dalÜφm objektem TransformGroup, a t°etφ je transformovßna jin²mi dv∞ma objekty TransformGroup.</p>
<p>A te∩ popravd∞. ╚emu jste rozum∞li lΘpe? Obrßzku, p°esto₧e jste v n∞m neznali nejmΘn∞ polovinu pou₧it²ch symbol∙, nebo p°edchßzejφcφmu zmatenΘmu textu? A co teprve, kdybyste v obrßzku v²znam vÜech symbol∙ znali? Myslφm si, ₧e obrßzek vyhrßvß.</p>
<p>Nynφ si poj∩me vysv∞tlit v²znam pou₧it²ch symbol∙. Nßsledujφcφ obrßzek je vÜechny shrnuje. (Tento zp∙sob zßpisu je p°evzat z oficißlnφho tutorißlu.)</p>
<div class='image'><img src='podklady/kuzelka/687/info.png' alt ='pou₧φvanΘ symboly' title ='pou₧φvanΘ symboly' /></div>
<p>Se t°φdami <strong>VirtualUniverse</strong> a <strong>Locale</strong> jsme se seznßmili ji₧ minule. Te∩ je na Φase vysv∞tlit si, k Φemu slou₧φ ty zb²vajφcφ. Instance t°φd odvozen²ch od prvnφ z nich, t°φdy <strong>Group</strong>, majφ v grafu, °eΦeno slovy klasickΘ terminologie pro popis strom∙, roli uzl∙, tzn. mohou mφt pouze jednoho rodiΦe a neomezen∞ potomk∙.</p>
<p>T°φda <strong>Leaf</strong> je nadt°φdou pro t°φdy, jejich₧ instance jsou v danΘm stromu listy, co₧ znamenß, ₧e u₧ nemajφ ₧ßdnΘ dalÜφ potomky. P°φkladem m∙₧e b²t t°φda <em>ColorCube</em>, se kterou jsme se seznßmili v minulΘm Φlßnku a se kterou pracujeme i dnes.</p>
<p>Mo₧nß vßs nynφ napadß otßzka, proΦ jsou v ukßzkovΘm grafu objekty ColorCube zobrazeny jako obdΘlnφky a ne jako troj·helnφky, co₧ by podle v²Üe uvedenΘho bylo jist∞ sprßvn∞jÜφ. Inu, tady zase jednou zvφt∞zil pragmatismus nad p°esn²m vyjad°ovßnφm. On toti₧ troj·helnφk nenφ prßv∞ nejvhodn∞jÜφ pro zßpis delÜφho textu. Z toho d∙vodu, pokud nßs bude v budoucnu zajφmat u n∞jakΘho objektu v grafu jeho p°esn² nßzev, zobrazφme jej jako obdΘlnφk.</p>
<p>P°edposlednφ ze symbol∙ v tabulce, ovßl, oznaΦuje instance t°φd, kterΘ jsou odvozeny od t°φdy <strong>NodeComponent</strong>. Podt°φdami t°φdy NodeComponent jsou nap°φklad t°φdy <em>Appearance</em> a <em>Geometry</em>, se kter²mi se blφ₧e seznßmφme v n∞kterΘm z dalÜφch Φlßnk∙ tΘto sΘrie. Prozatφm snad postaΦφ, kdy₧ si °ekneme, ₧e t°φdy odvozenΘ od tΘto t°φdy nejsou formßln∞ p°φmo souΦßstφ stromu, proto₧e na n∞ odkazujφ objekty list∙ (Leaf), co₧ by jinak nebylo mo₧nΘ (list p°ece nem∙₧e mφt potomky), nejednß se tedy formßln∞ o vztah potomek-rodiΦ.</p>
<h3>Äijφcφ a zkompilovanΘ objekty</h3>
<p>Vlo₧φme-li objekt BranchGroup do objektu Locale, stanou se tento objekt a objekty v n∞m obsa₧enΘ takzvan∞ ₧iv²mi. To znamenß, ₧e kv∙li v²konu bude graf scΘny p°eveden do v²hodn∞jÜφ podoby, co₧ s sebou nev²hodu v tom, ₧e ji₧ nebudeme moci nadßle p°idßvat objekty do objekt∙ Group nebo m∞nit transformaΦnφ matici v objektech TransformGroup. </p>
<p>Pochopiteln∞ jsou vÜak situace, kdy scΘnu chceme m∞nit i nadßle - a¥ u₧ pot°ebujeme animovat existujφcφ objekty nebo p°idßvat novΘ. Pak musφme n∞jak oznaΦit ty Φßsti scΘny, kterΘ se budou m∞nit. K tomu slou₧φ metody <samp>void setCapability(int bit)</samp>, <samp>void clearCapability(int bit)</samp> a <samp>boolean getCapability(int bit)</samp>. Parametr bit typu int, p°edßvan² vÜem t∞mto metodßm, nese bitov² p°φznak urΦujφcφ, co je s dan²m objektem (respektive jeho potomky), mo₧nΘ d∞lat. Metoda setCapability(int bit) "zapφnß" tento p°φznak, metoda clearCapability(int bit) tento p°φznak vypφnß a koneΦn∞ metoda getCapability(int bit) vracφ true, pokud je dan² p°φznak nastaven².</p>
<p>Nap°φklad ve t°φd∞ Group jsou definovßny mimo jinΘ nßsledujφcφ p°φznaky: <samp>ALLOW_CHILDREN_EXTEND</samp> dovolujφcφ p°idßvat dalÜφ objekty do danΘho objektu Group, <samp>ALLOW_CHILDREN_READ</samp> dovolujφcφ p°istupovat k potomk∙m danΘho objektu a <samp>ALLOW_CHILDREN_WRITE</samp> umo₧≥ujφcφ upravovat odkazy na potomky tohoto objektu. Ve t°φd∞ TransformGroup jsou pak definovßny dalÜφ p°φznaky: <samp>ALLOW_TRANSFORM_READ</samp> dovolujφcφ p°istupovat k transformaΦnφ matici a pota₧mo i jejφm jednotliv²m slo₧kßm (rotace, posunutφ) a <samp>ALLOW_TRANSFORM_WRITE</samp> umo₧≥ujφcφ m∞nit transformaci, co₧ je nezbytnΘ nap°φklad pro animovßnφ. Krom∞ ji₧ zmφn∞n²ch p°φznak∙ vÜak existujφ i dalÜφ, s nimi₧ se setkßme v n∞kterΘm z dalÜφch Φlßnk∙.</p>
<p>Sice je mo₧nΘ renderovat i scΘnu, kterß je pouze ₧ijφcφ, ale pokud chcete v∞tÜφ rychlost, je pot°eba objekty BranchGroup ve scΘn∞ jeÜt∞ navφc "zkompilovat". K tomu slou₧φ metoda <samp>compile()</samp>, jejφ₧ volßnφ zp∙sobφ dalÜφ zm∞ny v internφ reprezentaci scΘny. Jejφ pou₧φvßnφ je nav²sost u₧iteΦnΘ a neexistuje prakticky ₧ßdn² d∙vod, proΦ ji ignorovat.</p>
<h3>Mal² p°φklad</h3>
<p>Nynφ si na krßtkΘm p°φkladu ukß₧eme pou₧itφ toho, co jsme se dnes nauΦili. V²sledek nebude nijak osl≥ujφcφ, p∙jde o dalÜφ variaci na tΘma barevnΘ krychle. Nejprve vytvo°φme scΘnu s barevnou krychlφ, jejφm₧ rodiΦem bude objekt TransformGroup, pak ji zkompilujeme a teprve a₧ potom ji budeme transformovat ·pravou objektu TransformGroup, co₧ znamenß, ₧e se nevyhneme pou₧itφ metody setCapability(int bit), co₧ je v podstat∞ hlavnφm ·Φelem tohoto p°φkladu. Celou scΘnu si pro procviΦenφ rovn∞₧ zakreslφme.</p>
<div class='image'><img src='podklady/kuzelka/687/graf2.png' alt ='graf scΘny p°φkladu' title ='graf scΘny p°φkladu' /></div>
<br /> <span class='comment'>//nastavφme ·hel otoΦenφ na 30░ </span>
<br /> tr1.rotX(Math.PI/6);
<br /> <span class='comment'>//vytvo°φme druhou transformaΦnφ matici </span>
<br /> Transform3D tr2 = new Transform3D();
<br /> <span class='comment'>//nastavφme ·hel otoΦenφ na 60░ </span>
<br /> tr2.rotY(-Math.PI/3);
<br /> <span class='comment'>//vynßsobφme spolu matice </span>
<br /> tr2.mul(tr1);
<br /> return tr2;
<br /> }
<br /> public static void main(String[] args){
<br /> new Capabilities().show();
<br />  }
<br />}
</div>
<p>Na tomto p°φkladu sice nenφ u₧iteΦnost popsan²ch technik p°φliÜ z°etelnß, a₧ se ale budeme zab²vat animovßnφm objekt∙, neobejdeme se bez nich. Nßsledujφcφ obrßzek je v²sledkem pou₧itφ p°edchßzejφcφho k≤du:</p>
<div class='image'><img src='podklady/kuzelka/687/capture.png' alt ='v²sledek p°φkladu' title ='v²sledek p°φkladu' /></div>
<p>P°φÜt∞ se seznßmφme s t°φdami pro tvorbu geometrick²ch primitiv a ukß₧eme si, jak upravovat jejich vzhled (barvu a dalÜφ vlastnosti) pomocφ objekt∙ Appearance.</p>
<div class='refer'>
<h3>P°edchozφ Φlßnky</h3>
<ul>
<li><a href='http://interval.cz/clanek.asp?article=2752'>Java a 3D grafika</a></li>
<li><a href='http://interval.cz/redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2856'>ZnakovΘ sady v praxi</a></li>
<li><a href='http://interval.cz/redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2849'>Vytvß°enφ dokument∙ PDF v PHP</a></li>
<li><a href='http://interval.cz/redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2852'>Interval v zajetφ Φφsel</a></li>
<li><a href='http://interval.cz/redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2850'>CSS2 - podpora kaskßdov²ch styl∙ v sedmiΦkovΘ °ad∞ Opery</a></li>
<li><a href='http://interval.cz/redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2844'>P.E.T. - jednoduch² Üablonovacφ systΘm v PHP</a></li>