<meta http-equiv='pics-label' content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline EN v2.0" l gen true for "http://interval.cz" r (nz 1 vz 1 lz 1 oz 1 cz 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://interval.cz" r (n 0 s 0 v 0 l 0))' />
<h2>Java a 3D grafika - Geometry (GeometryStripArray)</h2>
<p id='prepend'>Vrcholy t∞les, kterß jsme vytvo°ili v p°edchozφm Φlßnku, nebyly sdφleny mezi jednotliv²mi troj·helnφky, p°esto₧e se troj·helnφky vzßjemn∞ dot²kaly. Z hlediska nßrok∙ na pam∞¥ je takov² zp∙sob ulo₧enφ pom∞rn∞ neefektivnφ. V tomto Φlßnku se seznßmφme se t°φdami pro vytvß°enφ troj·helnφkov²ch trs∙ a pßs∙, jejich₧ vyu₧itφ tento problΘm zΦßsti °eÜφ. V druhΘ Φßsti Φlßnku pak trochu odboΦφme a ukß₧eme si jeden docela zajφmav² algoritmus pro generovßnφ "krajin".</p>
<p>Na nßsledujφcφm obrßzku je zobrazen p°φklad trsu troj·helnφk∙ a pßsu troj·helnφk∙. ╚φsla v obrßzku udßvajφ po°adφ, v jakΘm do t∞chto objekt∙ vklßdßme vrcholy.</p>
<div class='image'><img src='podklady/kuzelka/906/trsyapasy.png' alt='╚φslovßnφ vrchol∙ v trsech a pßsech' title='╚φslovßnφ vrchol∙ v trsech a pßsech' /></div>
<p>T°φdy pro prßci s trsy a pßsy jsou vÜechny odvozeny od abstraktnφ t°φdy GeometryStripArray, kterß je odvozena od t°φdy GeometryArray. V tΘto t°φd∞ je definovßn konstruktor, s nφm₧ budeme v tomto Φlßnku pracovat, a to <samp>GeometryStripArray(int vtxCount, int vertexFormat, int stripVertexCount[])</samp>. Tento konstruktor p°ebφrß t°i parametry. Prvnφ z nich, vtxCount, urΦuje celkov² poΦet vrchol∙, kterΘ budou ulo₧eny v tomto objektu, druh² parametr mß stejn² v²znam jako u konstruktoru t°φdy GeometryArray a urΦuje tedy, co vÜechno bude v tomto objektu ulo₧eno (sou°adnice vrchol∙, barvy, normßlovΘ vektory a dalÜφ). Poslednφm parametrem je pole Φφsel typu int, kterß udßvajφ poΦet vrchol∙ v jednotliv²ch pßsech, pop°φpad∞ trsech, proto₧e do objektu GeometryStripArray jich m∙₧eme ulo₧it i vφce.</p>
<p>Pro nastavovßnφ vrchol∙, barev a pro ostatnφ Φinnosti, jako je nap°φklad dotazovßnφ se "getter" metodami, se pou₧φvajφ metody definovanΘ ve t°φd∞ GeometryArray, s nφ₧ jsme se ji₧ seznßmili.</p>
<p>Nynφ m∙₧eme p°ejφt k prvnφmu p°φkladu, jφm₧ bude vytvo°enφ ÜroubovΘ plochy pomocφ pßsu troj·helnφk∙. Pßsy troj·helnφk∙ se v Jav∞ 3D vytvß°ejφ pomocφ instancφ t°φdy TriangleStripArray. NßÜ program, kter² vytvß°φ Üroubovou plochu, nenφ p°φliÜ efektivnφ kv∙li p°φliÜ velkΘmu poΦtu volßnφ funkcφ sinus a kosinus. Tato volßnφ by Üla nahradit pou₧itφm rotace o konstantnφ ·hel, ale kv∙li Φitelnosti jsem je ponechal v tomto tvaru.</p>
<p>Zdrojov² k≤d zde neuvßdφm cel², proto₧e k vypoΦφtßnφ normßlov²ch vektor∙ je v n∞m pou₧ita t°φda NormalGenerator, s nφ₧ jsme se jeÜt∞ nesetkali.</p>
<p>V dalÜφm p°φkladu vytvo°φme pro zm∞nu ku₧elovou plochu pomocφ trsu troj·helnφk∙. Pro vytvß°enφ trs∙ troj·helnφk∙ budeme pot°ebovat t°φdu TriangleFanArray. Pro efektivitu tohoto programu platφ totΘ₧, co jsme si °ekli u p°edchozφho programu.</p>
<p>To je zatφm vÜe, co se t²Φe t°φd odvozen²ch od t°φdy GeometryArray. P°φÜt∞ se zaΦneme zab²vat indexovanou geometriφ. Nynφ se podφvßme na jeden docela zajφmav² algoritmus pro generovßnφ terΘn∙.</p>
<h3>Generovßnφ terΘn∙</h3>
<p>Pro generovßnφ terΘn∙ existuje celß °ada algoritm∙, z nich₧ asi nejpopulßrn∞jÜφ jsou ty vyu₧φvajφcφ fraktßly (pokud vßs tato problematika zajφmß, tak na Rootu vyÜel Φlßnek <a href='http://www.root.cz/clanek/2210'>o mid-point displacement algoritmu</a>). My se v tomto Φlßnku nebudeme zab²vat ₧ßdn²m algoritmem vyu₧φvajφcφm fraktßly, ale ukß₧eme si modifikaci "kopeΦkovΘho" algoritmu popsanou na <a href='http://www.robot-frog.com'>robot frog</a>.</p>
<p>Zßkladnφ myÜlenka tohoto algoritmu je velice prostß. Na nßhodn∞ vybranß mφsta umφstφme kopeΦky s nßhodn²mi velikostmi. P°i dostateΦn∞ velkΘm mno₧stvφ kopeΦk∙ zaΦne nßÜ terΘn p°ipomφnat skuteΦnou krajinu, by¥ ne tak realistickou, jako bychom zφskali p°i pou₧itφ n∞jakΘho algoritmu vyu₧φvajφcφho fraktßl∙, ale i to m∙₧e b²t mnohdy p°φnosem.</p>
<p>V programu to ud∞lßme nßsledovn∞. ZaΦneme s height-mapou, jejφ₧ v²Üky nastavφme na nulu. Nßhodn∞ vybereme bod le₧φcφ na naÜφ ploÜe, co₧ bude st°ed kopeΦku, a k n∞mu nßhodn∞ vybereme dalÜφ Φφslo û polom∞r. Ke ka₧dΘmu bodu uvnit° kruhu danΘho polom∞rem a st°edem p°iΦteme hodnotu <samp>polom∞r*polom∞r - (k-x)*(k-x) - (j-y)*(j-y)</samp>, co₧ je vzorec pro rotaΦnφ paraboloid "p°eklopen² sm∞rem dol∙". Tento postup zopakujeme, kolikrßt budeme chtφt. Potom cel² terΘn posuneme, aby jeho nejni₧Üφ bod m∞l z-ovou sou°adnici rovnou nule. Dßle vynßsobφme vÜechny body hodnotou <samp>1/(max-min)</samp>, dφky Φemu₧ budou vÜechny v²Üky v intervalu od 0 do 1. V²Üky vÜech bod∙ potom m∙₧eme umocnit na druhou. Tento krok sice nenφ nezbytn², jeho vyu₧itφm ale m∙₧eme zφskat krajinu s hezk²mi ·dolφΦky. Nakonec vÜechny v²Üky vynßsobφme parametrem maxVyska, udßvajφcφm maximßlnφ v²Üku naÜeho terΘnu. Zdrojov² k≤d, kter² toto vÜechno d∞lß, je na nßsledujφcφm v²pisu:</p>
<div class='sample'>
package interval.j3d;
<br />
<br />import java.util.Random;
<br />
<br />public class Hills {
<br /> <span class='comment'>// vytvß°et tuto t°φdu by mohlo b²t zbyteΦnΘ</span>
<br /> private Hills() {
<br /> }
<br /> <span class='comment'>//tato metoda nßm naplnφ pole data hodnotami odpovφdajφcφmi</span>
<br /> <span class='comment'>//v²Ükßm jednotliv²ch bod∙ v naÜem terΘnu</span>
<br /> public static void generateTerrain(float data[][], int minPolomer, int maxPolomer, int pocetIteraci, float maxVyska){
<p>Objekt Shape3D, obsahujφcφ nßÜ terΘn, pak vytvo°φme snadno s vyu₧itφm t°φdy HeightMap z p°edchozφho Φlßnku, jak m∙₧eme vid∞t dßle. (T°φdu HeightMap lze snadno upravit tak, aby pou₧φvala pßsy troj·helnφk∙.)</p>
<br />HeightMap hm = new HeightMap(heights, 1.2f, 1.2f);
</div>
<p>Pokud nastavφme p°φliÜ mal² poΦet iteracφ, nebude nßÜ terΘn vypadat v∙bec reßln∞. S velkou pravd∞podobnostφ to bude pouze n∞kolik osamocen²ch Φßstφ rotaΦnφch paraboloid∙ trΦφcφch z roviny. P°esv∞dΦit se o tom m∙₧eme na nßsledujφcφm obrßzku, kter² byl vytvo°en s poΦtem iteracφ rovn²m deseti:</p>
<div class='image'><img src='podklady/kuzelka/906/hills_10iter.png' alt='TerΘn vytvo°en² deseti iteracemi' title='TerΘn vytvo°en² deseti iteracemi' /></div>
<p>DalÜφ obrßzek u₧ ukazuje terΘn, u n∞ho₧ jsme poΦet iteracφ nastavili na mnohem v∞tÜφ hodnotu, konkrΘtn∞ 800:</p>
<p>Poslednφ obrßzek jeÜt∞ ukazuje, jak by vypadal terΘn, pokud bychom v²Üky nejprve neumocnili. Zßle₧φ samoz°ejm∞ jen na vßs, kterou variantu si zvolφte.</p>
<div class='image'><img src='podklady/kuzelka/906/hills_800iter_bez_umocneni.png' alt='TerΘn vytvo°en² 800 iteracemi bez umocn∞nφ v²Üky' title='TerΘn vytvo°en² 800 iteracemi bez umocn∞nφ v²Üky' /></div>
<p>Tento algoritmus je pochopiteln∞ mo₧nΘ r∙zn∞ obm∞≥ovat. Nap°φklad m∙₧eme zm∞nit funkci generujφcφ kopeΦky. TaktΘ₧ m∙₧eme nßhodn∞ jednou vytvo°it kopeΦek a jindy zase ·dolφ. Zm∞nit se dß takΘ rozlo₧enφ nßhodn²ch Φφsel, nap°φklad je mo₧nΘ pou₧φt gaussovskΘ rozlo₧enφ. Zkrßtka, mo₧nostφ je nep°ebern∞.</p>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3476'>Kurz SVG - vypl≥ovßnφ I</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3479'>PPWizard - pokroΦilß makra, podmφnky a standardnφ definice</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3478'>Transformace dat z databßze pomocφ XSL v .NET jednoduÜe</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3481'>Strßnkovßnφ v ovlßdacφm prvku DataGrid bez pou₧itφ PostBack</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3477'>Zpracovßnφ databßzov²ch dat p°es XSLT v ASP</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=3473' title='(25 komentß°∙)'>Sedφm na konßri a Φtu Computerworld</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3468' title='(23 komentß°∙)'>PPWizard - tvo°φme a spravujeme WWW strßnky</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3474' title='(22 komentß°∙)'>PφÜeme pro web - o sφle slov</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3464' title='(15 komentß°∙)'>Kurz SVG - grafickß primitiva</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3472' title='(10 komentß°∙)'>Cryptography v .NET - Symmetric a Asymmetric encryption</a></li>