Está en la página 1de 16

Slovensk technick univerzita v Bratislave

FAKULTA INFORMATIKY A INFORMANCH TECHNOLGI

Anaglyph pomocou Java3D v2


http://code.google.com/p/anaglyph-java3d-demo/ Odborn praktikum

Meno: Milo Radoinsk Predmet: Odborn praktikum kolsk rok: 2009/2010

1 VOD....................................................................................................................................................................3 1.1 ANAGLYPH.........................................................................................................................................................3 1.2 JAVA3D ...........................................................................................................................................................3 1.3 FYZICK A VIRTULNY SVET.................................................................................................................................4 2 RENDEROVANIE V JAVA3D...........................................................................................................................5 2.1 VOD................................................................................................................................................................5 2.2 HLAVN HRI....................................................................................................................................................5 2.3 PODMIENKY RENDEROVANIA A API.......................................................................................................................6 2.4 MANIPULCIA SCNY (BEHAVIOUR)........................................................................................................................7 3 ANALZA RIEENIA........................................................................................................................................8 3.1 JEDEN POHAD, JEDNO PLTNO..............................................................................................................................8 3.2 DVA POHADY, DVE PLTNA.................................................................................................................................9 3.3 DVA POHADY, TRI PLTNA, KONEN RIEENIE.....................................................................................................10 3.4 OBJEKTOV DIAGRAM RIEENIA...........................................................................................................................11 4 TVORBA ANAGLYPH.....................................................................................................................................12 4.1 KONCEPTULNY NVRH..................................................................................................................................... 12 4.2 PODROBN NVRH............................................................................................................................................ 13 5 LOGICK MODEL SYSTMU......................................................................................................................15 5.1 ODDELENIE A SPOJENIE ZLEITOST.....................................................................................................................16

1 vod
Cieom projektu bolo natudova problematiku tvorby Anaglyph obrzkov v prostred Java3d a vytvori v tomto prostred demontran program AnaglyphDemo.

1.1 Anaglyph
Anaglyph je vonm okom vnman ako dvojit / zdvojen obraz jednej scny. Pri pouit 3d okuliarov, ktor maj modr a erven filter sa anaglyph jav ako priestorov obrzok, t.j. obrzok, v ktorom sa d vnma hbka. Anaglyph mono vytvori syntzou dvoch obrzkov jednej scny, priom mono rozli tri rzne prpady vstupov: 1. Jeden pohad na scnu, t.j. jeden obrzok. V tomto prpade je k dispozci iba jedno vnmanie scny / obrzok. Druh obrzok / vnmanie sveta sa vytvor posunutm pvodnho obrzku v smere osi x v ubovonom smere. 2. Dva pohady na scnu a dva ciele pohadu. V tomto prpade s k dispozci dve rzne vnmania jednej scny / obrzky z dvoch rznych stanovsk. Pozorovate pri zmene stanoviska po priamke nemen vektor pohadu. To znamen, e pozorovate sa pozer stle pred seba tm istm smerom vektory pohadu VP1 a VP2 pre obidve stanovisk s rovnak a rovnoben. 3. Dva pohady na scnu a jeden cie pohadu. Aj v tomto prpade s k dispozci dve rzne vnmania jednej scny. Avak v tomto prpade pozorovate pri zmene stanoviska po priamke men aj vektor pohadu, pretoe sa pozer stle na to ist miesto. Uveden sa d interpretova aj tak, e pozorovate men stanovisko po krunici so stredom, ktor je cie pohadu. Vektory pohadu VP1 a VP2 nie s rovnoben. AnaglyphDemo pouva vnmanie scny slo 3, t.j. dva pohady a jeden cie pohadu.

1.2 Java3D
Kninica Java3D je uren pre tvorbu a renderovanie trojrozmernej scny sveta. Pojem scna asi intuitvne chpe kad ako viditen as sveta. Kninica Java3D je postaven na dtovej truktre s nzvom graf scny (Scene Graph). Graf scny obsahuje definciu scny, t.j. objekty, ktor sa nachdzaj na scne, ich pozciu, vzhad objektov, pohad na scnu, pozciu kamery a in. Aj ke je zauvan pojem graf scny, v skutonosti ide o strom, take v alom texte bude pouvan aj pojem strom alebo pod strom. Graf scny v Java3d mono logicky rozdeli na dva pod stromy: Obsah scny content branch. Definuje obsah, teda o sa nachdza na scne, kde sa to nachdza a ako to vyzer farba, materil a in. alej definuje svetl scny, tie ich pozciu a smer a sprvanie objektov. Pohad na scnu / vnmanie scny view branch. Definuje ako sa pozorovate pozer na scnu, pozciu kamery / oka a smer pohadu. Vzhadom k tomu, e graf scny je v podstate strom, mono v om rozli vntorn uzly a listy. Vntorn uzly sa pouvaj hlavne ako transforman uzly, t.j. intancie triedy TransformGroup, ktor obsahuj maticu transformcie posunutie, rotcia a in. Listy stromu mu by bu objekty, svetl a sprvanie (content branch) alebo pohad a kamera (view branch). Graf scny v Java3D mono budova od korea stromu k listom stromu prkazom node.addChild, kde node ako vntorn uzol stromu me by troch typov: BranchGroup kompilan jednotka, TransformGroup pre vetkch potomkov (podstrom) plat dan transformcia, Group nad trieda prvch dvoch menovanch typov. V tejto prci budem pojmy ako uzol, list, potomok a podstrom intenzvne pouva v rovnakom vzname ako s

v terii grafov / stromov. Vnimkou je pojem potomok, ktorm tu oznaujem ubovon uzol v podstrome, nie len priamy nasledovnk.

1.3 Fyzick a virtulny svet


Kninica Java3d rozliuje fyzick a virtulny svet scnu. Fyzick svet je svet pozorovatea, v ktorom sa nachdza. Virtulny svet je svet, ktor obsahuje scnu, teda virtulne objekty, ktor vnma pozorovate. Pozorovate nie je sasou scny, t.j. virtulneho sveta, je vo fyzickom svete, z ktorho vnma scnu cez okno (na obrzku Obr. 1 je to image plate). Obidva svety maj svoj vlastn sradnicov systm, t.j. poiatok a orientciu os a s oddelen oknom do scny. Pozorovate vnma scnu cez tzv. okno do scny. Aj ke pozorovate nie je sasou virtulneho sveta, m pozciu a orientciu vo fyzickom ako aj vo virtulnom svete. Jeho pozcia vo virtulnom svete vyplva z pozcie vo fyzickom svete a z pozcie okna do scny vo virtulnom svete. Pozcia pozorovatea ovplyvuje o vid a vnma v okne do scny.

Obr. 1 Dva svety v java3d

2 Renderovanie v Java3D
Pre tvorbu Anaglyph v Java3d je dleit pochopi ak Java3d triedy a komponenty sa podieaj na renderovan scny. Tieto komponenty meme nsledne upravi a vyui pre nae potreby.

2.1 vod
Renderovanie scny v Java3d je proces, ktor sa realizuje za elom zobrazenia scny na obrazovke alebo za elom zskania dt / obrzku pre alie dodaton spracovanie. V obidvoch prpadoch je cieom / miestom renderovania tzv. pltno trieda Canvas3D, priom v prvom prpade sa jedn o tzv. onscreen pltno, v druhom prpade o tzv. offscreen pltno. AnaglyphDemo vyuva obidva typy pltna: dve offscreen pltna ako zdrojov pltna a jedno onscreen pltno ako cieov pltno. Zdrojov pltna reprezentuj pohad avho a pravho oka (jedno pltno na jedno oko) a pouvaj sa na syntzu cieovho anaglyph obrzku v cieovom pltne. Kninica Java3d podporuje automatick a manulne renderovanie scny v zvislosti od typu pltna (onscreen / offscreen) alebo inch faktorov. Automatick renderovanie pltna znamen, e renderovanie sa realizuje sstavne na pozad ako proces onscreen pltno. Manulne renderovanie je renderovanie na iados klienta, t.j. klient mus da podnet na server, aby realizoval renderovanie scny offscreen pltno.

2.2 Hlavn hri


Najdleitejm komponentom pri renderovan scny je samozrejme samotn scna. Ja sa zameriam iba na jej as (pod strom), ktor definuje pohad na scnu ViewBranch. Tto as grafu scny definuje okno do scny, ktor m svoju vekos, pozciu a orientciu, vi obrzok Obr. 1. Konkrtne okno do scny sa definuje v triede ViewPlatform (listy stromu), pozcia a orientcia sa definuje v triede TransformGroup (uzly stromu). Kad graf scny mus obsahova podstrom ViewBranch a v om aspo jeden objekt triedy ViewPlatform. Nasleduje strun popis a diagram tried astnkov procesu renderovania: ViewPlatform (okno do scny). Reprezentuje pozorovatea scny vo virtulnom svete okno do scny. Pozcia a orientcia okna je dan vntornmi transformanmi uzlami TransformGroup, ktor s v strome na ceste od korea k listom stromu. Jedn sa o pozciu a orientciu vo virtulnom svete. ViewPlatform sa v strome nachdza ako list. View. Trieda View je hlavn trieda modelu renderovania v Java3d. Reprezentuje proces renderovania, ktor je aktvny, ke je pripojen na scnu, konkrtne na objekt triedy ViewPlatform, vi obrzok Obr. 2. Trieda View referencuje vetky objekty / triedy, ktor s potrebn k renderovaniu scny ako napr. pltno (canvas3d), hlavu pozorovatea (PhysicalBody) alebo samotn scnu. Take ke sa objekt triedy View pripoj na ViewPlatform (scnu), aktivuje sa renderovanie na pltno triedy Canvas3D, vi obrzok Obr. 2. Canvas3D. Reprezentuje pltno, ktor je cieom renderovania. Pltno mus by vloen do awt kontajnera hlavn okno aplikcie alebo applet. Pltno m v okne svoju pozciu a vekos. V jednom okne me by viac ako jedno pltno, priom pltna sa v okne / kontajneri zobrazia poda definovanho rozmiestnenia (layout). PhysicalBody. Reprezentuje pozorovatea scny v relnom svete, ktor sa pozer cez okno na scnu. Tak ako okno do scny aj pozorovate m svoje sradnice.

class View graf scn y - pod strom Vi ewBranch uzo l strom u j av ax.media.j 3d.TransformGroup

j av a.awt.Container

l ist strom u j av ax.media.j 3d.ViewPlatform

j av ax.media.j3d.Canv as3D

j av ax.media.j 3d.View

j av ax.media.j 3d.PhysicalBody

Obr. 2 Renderovanie scny - diagram tried

2.3 Podmienky renderovania a API


Vo veobecnosti pre renderovanie musia by splnen dve podmienky v kontexte pohadu (trieda javax.media.j3d.View). Obidve podmienky s znzornen aj na obrzku Obr. 2.: 1. pohad vid scnu, t.j. objekt triedy View odkazuje objekt triedy ViewPlatform 2. pohad vid pltno, t.j. objekt triedy View referencuje objekt triedy Canvas3D Pltno typu Onscreen sa renderuje automaticky, pokia sa explicitne nevypne prkazom stopRenderer. Pltno typu Offscreen je mon renderova manulne a tie automaticky. Pvodne sa tento typ pltna renderoval iba manulne. Neskr sa do kninice java3d pridala podpora pre automatick renderovanie. Renderovanie Offscreen pltna v manulnom reime sa aktivuje prkazom renderOffScreenBuffer. Volanie tohto prkazu je asynchrnne, t.j. koniec prkazu nezaruuje koniec renderovania, pretoe prkaz sa realizuje a kon nezvisle od renderovania. Koniec renderovania v tomto prpade signalizuje metda postSwap. To znamen, e a v ase volania tejto metdy pltno obsahuje aktulny obrzok scny, ktor sa me poui na alie spracovanie, napr. v naom prpade na syntzu Anaglyph obrzku (vemi dleit). Na renderovanie Offscreen pltna v automatickom reime je potrebn splni tri podmienky (toto u nie je dleit, mete ignorova): 1. Oznakova offscreen pltno rozhranm AutoOffScreenCanvas3D (experimentlna podpora). V programovacom jazyku Java to znamen vytvori triedu, ktor ded Canvas3d a implementuje rozhranie AutoOffScreenCanvas3D. 2. Umiestni offscreen pltno do kontajnera java.awt.Container, ako je napr. hlavn okno aplikcie 3. Ak je v pohade prtomn onscreen pltno, mus ma vypnut renderovanie prkazom stopRenderer. Tto podmienku sa mi nepodarilo overi, prv dve no.

2.4 Manipulcia scny (behaviour)


S jednotlivmi objektmi v scne mono manipulova myou. Mono to robi tromi spsobmi: Rotcia (MouseRotate) Posun v rovine XY (MouseTranslate) Posun pozd osi Z (MouseZoom) Pre kad spsob manipulcie je potrebn vytvori a vloi do grafu scny manipulan objekt typu, ktor je uveden v ztvorke. Manipulan objekty s sasou obsahovej vetvy stromu, nie vetvy pre pohad. Uveden ilustruje prklad:
BranchGroup objRoot; // kore stromu scny TransformGroup trg = new TransformGroup(new Transform3D()); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); MouseRotate mouseRotate = new MouseRotate(trg); mouseRotate.setSchedulingBounds(bounds); mouseRotate.setupCallback(anf); objRoot.addChild(mouseRotate); MouseTranslate mouseTranslate = new MouseTranslate(trg); mouseTranslate.setSchedulingBounds(bounds); mouseTranslate.setupCallback(anf); objRoot.addChild(mouseTranslate);

V uvedenom prklade mono obsah scny definova na dvoch miestach podstrom uzla objRoot alebo podstrom uzla trg. Rozdiel medzi nimi je v tom, e scna definovan pod uzlom objRoot je statick, nepodlieha manipulcii myou. Naopak scna definovan pod uzlom trg je dynamick podlieha manipulcii. alej vysvetlm preo. Mu zato manipulan objekty mouseRotate a mouseTranslate a transforman uzol trg, na ktor odkazuj obidva tieto manipulan objekty. Transforman uzol trg hr pri manipulcii kov lohu. Je nositeom informcie o polohe objektov v scne, ktor s pod nm (jeho potomkovia). Tto informciu nesie vo forme transformanej matice, ktor reprezentuje opercie otoenia a posunutia objektov. Pri manipulcii scny dochdza k zmene matice v objekte trg, na ktor odkazuj manipulan objekty. Z pohadu pozorovatea scny tm vlastne dochdza k zmene polohy alebo otoenia vetkch objektov scny, ktor s pod trg (potomkovia uzla trg). V uvedenom prklade je dleit ete prkaz setupCallback(anf). Tento prkaz definuje obsluhu udalosti transformChanged, ktor nastva pri zmene matice transformcie uzla trg, t.j. pri manipulcii scny. Parametrom prkazu je konkrtny objekt, ktor implementuje metdu transformChanged rozhrania MouseBehaviorCallback. Obsluha udalosti transformChanged sa me vyui napr. pri renderovan scny scna sa nemus renderova sstavne, ale iba pri zmene transformanej matice (implicitne sa renderuje sstavne).

3 Analza rieenia
V tejto kapitole uvediem evolciu kdu tak ako prebiehala pri rieen od jednoduchho cvinho programu a k predbenmu rieeniu. Pjde vak len o kostru rieenia, t.j. hlavn program. V jednotlivch tdich programu sa bude postupne zvyova poet pohadov a/alebo pltien pre potreby rieenia. V grafe scny sa nebude zvyova poet objektov ViewPlatform, pretoe koncov rieenie si vysta s jednm.

3.1 Jeden pohad, jedno pltno


Canvas3D canvas = new Canvas3D(graphicsConfig, false); // onscreen canvas.setMonoscopicViewPolicy(View.CYCLOPEAN_EYE_VIEW); SimpleUniverse u = new SimpleUniverse(canvas); BranchGroup scene = createSceneContent(); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(scene); this.add(canvas); // this = awt kontajner

Kd v tejto ukke vytvor ViewBranch, ktor obsahuje jeden pohad, jedno pltno a jeden objekt triedy ViewPlatform. Pltno sa vytvra explicitne. O ostatn sa postar kontruktor triedy SimpleUniverse. Menovite sa postar o to, e vytvor pohad, explicitne vytvoren pltno vlo do pohadu a vytvor okno do scny (ViewPlatform), na ktor pripoj pohad. Celkovo kontruktor triedy SimpleUniverse vytvor cel podstrom ViewBranch tak, ako definuje obrzok Obr. 2, to vetko okrem triedy awt.container. Trieda SimpleUniverse vytvra okno do scny so sradnicami (0,0,0) s orientciou (0,0,-Z). Cez toto okno s viditen iba objekty scny, ktor maj zporn Z sradnicu. Tento problm sa d elegantne a rchlo vyriei prkazom setNominalViewingTransform, ktor posunie okno do scny v kladnom smere osi Z na pozciu (0,0,2).

3.2 Dva pohady, dve pltna


// vytvor dve pltna Canvas3D canvas1 = new Canvas3D(graphicsConfig, false); // onscreen Canvas3D canvas2 = new Canvas3D(graphicsConfig, false); // onscreen canvas1.setMonoscopicViewPolicy(View.LEFT_EYE_VIEW); canvas2.setMonoscopicViewPolicy(View.RIGHT_EYE_VIEW); // vytvor dva pohady na scnu // prv pohad sa vytvor implicitne v SimpleUniverse // druh pohad treba vytvori explicitne / manulne SimpleUniverse u = new SimpleUniverse(canvas1); View view1 = u.getViewer().getView(); View view2 = new View(); PhysicalBody myBod = view1.getPhysicalBody(); myBod.setLeftEyePosition(new Point3d(-.006,0.0, 0.0)); myBod.setRightEyePosition(new Point3d(+.006,0.0, 0.0)); view2.setPhysicalBody(myBod); view2.setPhysicalEnvironment(view1.getPhysicalEnvironment()); view2.attachViewPlatform(u.getViewingPlatform().getViewPlatform()); view2.addCanvas3D(canvas2); // vytvor obsah scny BranchGroup scene = createSceneContent(); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(scene); // viditen s oboje pltna - bud umiestnen veda seba this.setLayout(new FlowLayout()); // this = awt kontajner this.add(canvas1); this.add(canvas2);

Kd v tejto ukke vytvor jeden ViewBranch, ktor obsahuje dva pohady, dve onscreen pltna a jeden ViewPlatform. Kad z pohadov referencuje jedno pltno, ktor je umiestnen v awt kontajnery a okno do scny (ViewPlatform). Viditen s oboje pltna v oboch pohadoch. Pohady nie s identick. Kad pohad zobrazuje scnu trochu inak. Avak rozdiel v zobrazen scny nie je dan rznymi oknami do scny ( ViewPlatform) alebo transformciami, pretoe kontruktor triedy SimpleUniverse vytvra vdy iba jedno okno do scny (ViewPlatform). Rozdiel v zobrazen scny je dan tmito faktormi: 1. Boli definovan rozdielne pozcie avho a pravho oka (setLeftEyePosition, setRightEyePosition) pozorovatea myBod. 2. Pre obidva pohady bolo pecifikovan (nepriamo cez pltno), ktor oko pozorovatea reprezentuje dan pohad, View1 av oko, View2 prav oko. Bolo to realizovan prkazom setMonoscopicViewPolicy v objekte canvas1 a canvas2. Take hoci uveden kd vytvor v grafe scny iba jeden ViewPlatform, t.j. iba jedno okno do scny, je mon vytvori dve rzne vnmania scny v dvoch pohadoch. To vetko vaka pozorovateovi myBod a jeho dvom oiam. Vzhadom k tomu, e SimpleUniverse vytvra len jeden pohad (view1), druh pohad (view2) sa mus vytvori manulne.

3.3 Dva pohady, tri pltna, konen rieenie


// vytvor tri pltna // dve zdrojov offscreen pltna, jedno cieov onscreen pltno OffScreenCanvas3D canvas1 = new OffScreenCanvas3D(cc); OffScreenCanvas3D canvas2 = new OffScreenCanvas3D(cc); AnaglyphCanvas3D canvas3 = new AnaglyphCanvas3D(cc); // onscreen canvas1.setMonoscopicViewPolicy(View.LEFT_EYE_VIEW); canvas2.setMonoscopicViewPolicy(View.RIGHT_EYE_VIEW); // zdroj dt mus vidie ciel (zdrojov pltno mus vidie cieov) canvas1.setDestCanvas(canvas3); // canvas1 vid canvas3 canvas2.setDestCanvas(canvas3); // canvas2 vid canvas3 canvas3.stopRenderer(); // je neefektvne renderova sstavne // vytvor dva pohady na scnu SimpleUniverse u = new SimpleUniverse(canvas1); View view1 = u.getViewer().getView(); View view2 = new View(); PhysicalBody myBod = view1.getPhysicalBody(); myBod.setLeftEyePosition(new Point3d(-.006,0.0, 0.0)); myBod.setRightEyePosition(new Point3d(+.006,0.0, 0.0)); view2.setPhysicalBody(myBod); view2.setPhysicalEnvironment(view1.getPhysicalEnvironment()); view2.attachViewPlatform(u.getViewingPlatform().getViewPlatform()); view2.addCanvas3D(canvas2); view1.addCanvas3D(canvas3); // umon java3d manipulaciu (behavior) // vytvor obsah scny BranchGroup scene = createSceneContent(); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(scene); // viditen je iba pltno canvas3 this.add(canvas3); // this = awt kontajner

V tejto kapitole je naznaen kostra rieenia. Kd v ukke vyie vytvor ViewBranch, ktor obsahuje dva pohady, dve offscreen pltna (canvas1 a canvas2) a jeden ViewPlatform, podobne ako v predchdzajcej kapitole. Okrem toho sa tu vytvra jedno onscreen pltno (canvas3), ktor sa vak nepouva na renderovanie scny. Toto pltno sa pouva na syntzu a zobrazovanie anaglyph obrzku. Podkladom pre syntzu anaglyph s obrzky renderovan v pltnach canvas1 a canvas2. Konen rieenie teda pouva tri pltna. Zdrojov pltna canvas1 a canvas2 sa pouvaj na renderovanie scny z pohadu avho a pravho oka dve rzne vnmania scny. Cieov pltno canvas3 sa pouva na syntzu anaglyph z pohadov avho a pravho oka a na zobrazenie anaglyph. Treba vak zdrazni, e tu u nesta pvodn Java3D implementcia pltna Canvas3D. T bola rozren v triedach OffScreenCanvas3D a AnaglyphCanvas3D. Ako to vyzer objektovo, naznauje alia kapitola Objektov diagram rieenia. Samotn proces tvorby anaglyph ako je navrhnut a implementovan naznauje kapitola Tvorba anaglyph. V nej sa dozviete ako pltna spolupracuj pri syntze a zobrazen anaglyph, e tto spoluprca prebieha v manulnom reime, t.j. je vyvolan a riaden udalosami.

3.4 Objektov diagram rieenia


V tejto kapitole je uveden objektov diagram rieenia, ako je uveden v predchdzajcej kapitole. V tabuke pod obrzkom je uveden el a dvody vzieb medzi jednotlivmi objektmi.
object Koncept riesenia

left eye view : jav ax.media.j 3d.View

view_platform : jav ax.media.j 3d.ViewPlatform

right eye view : j av ax.media.j 3d.View

canvas1 : OffScreenCanv as3D

main window : j av a.awt.Container

canvas2 : OffScreenCanv as3D

canv as3 : AnaglyphCanvas3D

Obr. 3 Objektov diagram

Linka 1 2 3 4 5

Dvod / el Je podmienkou pre renderovanie scny v Java3D. Je podmienkou pre renderovanie scny v Java3D. Sli na prenos dajov / renderovanho obrzku z canvas1 a canvas2 do anaglyph pltna canvas3. Umon zobrazi onscreen pltno canvas3 v hlavnom okne. Umon manipulciu objektov v scne (behavior).

4 Tvorba anaglyph
V tejto kapitole opem proces tvorby anaglyph v rmci AnaglyphDemo v dvoch pohoadoch: konceptulny a podrobn. Tvorba anaglyph prebieha v manulnom reime, t.j. je riaden udalosami, ktor generuje kninica Java3D. AnaglyphDemo pouva dva typy udalosti: 1. transformChanged nastva pri zmene matice transformcie, t.j. pri manipulcii scny, ke dochdza k zmene vnmania scny viac o tom vi kapitola Manipulcia scny (behaviour). 2. postSwap signalizuje koniec renderovania offscreen pltna, ktor vyvolala metda renderOffScreenBuffer, viac o tom vi kapitola Podmienky renderovania a API. Uveden udalosti maximalizuj efektivitu pri renderovan v tom zmysle, e minimalizuj nadbytonos opercii poda hesla: sprav iba nevyhnutne nutn.

4.1 Konceptulny nvrh


Predpodmienky: 1. Pltno canvas1 m alokovan buffer (obrzok) canvas1_buffer. 2. Pltno canvas2 m alokovan buffer (obrzok) canvas2_buffer. 3. Pltno canvas3 m referenciu na canvas1_buffer a canvas2_buffer. Po splnen uvedench pred podmienok mono tvorbu anaglyph realizova v tchto krokoch: 1. Dolo k manipulcii scny zo strany pouvatea (treba zobrazi / aktualizova scnu) 2. Java3D generuje udalos transformChanged. 3. AnaglyphDemo vol metdu renderOffScreenBuffer pre obidve zdrojov pltna canvas1 a canvas2. 4. Java3D renderuje pltno canvas1 aktualizuje sa canvas1_buffer. 5. Java3D vol metdu postSwap na pltne canvas1 AnaglyphDemo aktualizuje prznak canvas1_buffer_ready. 6. Java3D renderuje pltno canvas2 aktualizuje sa canvas2_buffer. 7. Java3D vol metdu postSwap na pltne canvas2 AnaglyphDemo aktualizuje prznak canvas2_buffer_ready. 8. Pltno canvas3 m k dispozcii dve aktualizovan vnmania scny zdrojov obrzky na tvorbu anaglyph. AnaglyphDemo vol metdu repaint objektu canvas3. 9. V metde paint sa zobrazuje cieov pltno canvas3. Tesne pred zobrazenm pltna sa rob syntza anaglyph. Syntza anaglyph je bitov opercia, ktor m na vstupe zdrojov obrzky canvas1_buffer a canvas2_buffer. Vstupom syntzy je tie obrzok (bitmapa) a jej zobrazenie je tie bitov opercia. Pozorn itate si v uvedenej postupnosti urite vimol dva detaily: 1. Pltna preaili a pouili niektor tandardn metdy Java a Java3d tried. Konkrtne to boli metdy: MouseBehaviorCallback.transformChanged javax.media.j3d.Canvas3D.postSwap java.awt.Component.repaint java.awt.Component.paint 2. AnaglyphDemo tu vystupuje ako ierna skrinka (systm) a jeho aktivity (volanie metd, aktualizcia premennch) sa realizuj vdy v rmci obsluhy udalosti, ktor generovalo java3d alebo samotn anaglyphDemo (repaint / paint). Uveden postupnos krokov je len ilustran, zanedbva konen nvrh a riadenie na strane AnaglyphDemo. Riadenie potrebuj body 3 a 8. V bode 3 je to riadenie, ktor rozhoduje, e nov beh postupnosti sa nezane skr ako sa skon star jednotliv behy sa nemu prekrva. V bode 8 je riadenie, ktor plnuje volanie metdy canvas3.repaint v ase, ke s

aktualizovan zdrojov obrzky canvas1_buffer a canvas2_buffer. V uvedenej postupnosti krokov s k tomuto elu pouit prznaky canvas1_buffer_ready a canvas2_buffer_ready. V konenom nvrhu to zrejme bude inak pouije sa jedna riadiaca stavov premenn na vetko na bod 3 a 8.

4.2 Podrobn nvrh


V tejto kapitole je uveden spresnen opis tvorby anaglyph. Oproti konceptulnemu nvrhu obsahuje pouit / relne triedy a premenn.
sd AnaglyphRendering AnaglyphFaca de u ser scen e offscre en can vasX :OffScre enCan vas3D ja va 3d viewX :V iew o nscre en ca nva s3 :An aglyphCan va s3D Ana glyph Fa ctory

m an ipu lacia scen y()

{RState==0}

transform Cha n ge d() RSta te Set(4)

loop ov er canv as1 and canvas2 if RState == 0 [for X=1 to 2 ] ren derOffS creen Buffer() re nd er()

p ostS wap() setIm age X() setIm a ge X() RSta te Add(X) opt [RS tate==7] rep ain t() pa int() Cre ateAna gl yph() RSta teSet(0)

Obr. 4 Tvorba anaglyph - sekvenn diagram

Vzhadom k tomu, e dvojiky objektov (canvas1 a canvas2, view1 a view2) pouvaj pri renderovan rovnak alebo prov opercie, je vhodn ich nahradi jednm zstupnm objektom v cykle s dvomi iterciami. Take miesto objektov canvas1 a canvas2 je v diagrame pouit jeden objekt s nzvom canvasX a miesto objektov view1 a view2 objekt viewX, kde znak X je pouit ako zstupn znak a tie ako riadiaca premenn cyklu, ktor men hodnotu od 1 po 2.

Stavov premenn RState objektu triedy AnaglyphFacade sli na riadenie. Postupne men svoju hodnotu od 0 po 7 v krokoch 0 4 5 7, kde jednotliv hodnoty maj tento vznam: 0 je zaiaton stav 4 nastala udalos transformChanged 5 canvas1_buffer je aktualizovan 6 canvas2_buffer je aktualizovan 7 buffer v obidvoch pltnach je aktualizovan

5 Logick model systmu


V tejto kapitole je uveden diagram tried projektu AnaglyphDemo. V diagrame s farebne rozlen jednotliv zleitosti / balky: Anaglyph (zelen farba): Obsahuje objekty, ktor zabezpeuj anaglyph vnmanie scny. Hlavnou triedou je AnaglyphFacade, ktor k tomuto elu vytvra zelen a java3d objekty pohady, pltna a ViewBranch. Vetko uveden vytvra vo svojom kontruktore a v metde createAnaglyphUniverse. Scna (lt farba): Obsahuje objekty na tvorbu scny. Hlavnou triedou je SceneFactory, ktor vytvra viditen as grafu scny ( ContentBranch) objekty scny, svetl, sprvanie, transforman uzly. Pouva k tomu triedy balka scenebuilders. Trieda AnaglyphDemo implementuje sprvu udalosti nad UI rozhranm (tlatka, my), reprezentuje hlavn okno aplikcie.
class Logical View in terface com.sun.j 3d.utils.behav iors.mouse.MouseBehav iorCallback

j av ax.media.j 3d.Canv as3D + pai nt() : vo id

on screen AnaglyphCanv as3D + + + # se tIm ag e1 () : voi d se tIm ag e2 () : voi d pai nt() : vo id Crea teA na gl yph () : voi d

1 +de st. canvas

2 +so urce canvas +

offscreen OffScreenCanv as3D postS wa p() : vo id 1 l eft eye vi ew 1 righ t eye vi e w

Legend
A na glyp h co ncern S cen e co ncern Ja va(3D) co ncern

AnaglyphFactory + + + + redBl ueA na glyps() : vo id redGreen Anagl yp s() : voi d colo rA nag lyps() : vo id op tim i zedAn agl yps() : voi d

AnaglyphFacade + + createA nag lyphUni verse()() : voi d tran sfo rm Cha nged() : vo id

Canv asConfig

j av a.applet.Applet + +

AnaglyphDemo i ni t() : voi d m a i n() : voi d +

SceneFactory cre ateS cen eGraph () : voi d

use

Ob sahuje tri ed y, ktor p ou va trieda Sce neFa ctory n a tvo rbu g rafu scny.

scenebuilders

Obr. 5 Diagram tried

5.1 Oddelenie a spojenie zleitost


V diagrame na obrzku Obr. 5 vidno logick rozdelenie systmu na dve oddelen zleitosti / zodpovednosti: 1. Anaglyph vnmanie scny (zelen farba) 2. Tvorba obsahu scny (lt farba) V nasledujcej ukke kdu vidno ako uveden zleitosti spolupracuj a ako s spojen.
// this = awt kontajner CanvasConfig cc = new CanvasConfig(); AnaglyphFacade af = new AnaglyphFacade(cc); SceneFactory sf = new SceneFactory(this, af); // 1. view branch vnmanie scny SimpleUniverse u = af.createAnaglyphUniverse(); // 2. content branch obsah scny BranchGroup scene = sf.CreateScene(sf.GetDefaultSID()); // 3. tu dochdza k spojeniu obsahu a vnmania scny u.addBranchGraph(scene); // 4. pridanie pltna do awt kontajneru, obnovenie pltna this.add(af.GetOnScreenCanvas()); af.refreshScreen();

Ukka kdu vychdza z relneho kdu v triede AnaglyphDemo metdy Init. V uvedenej ukke vidno, ako jednoducho mono (znovu) poui anaglyph vnmanie scny v inom programe. Staia nato prkazy oznaen slom 1 a 4 a konfigurcia v triede CanvasConfig. O vetko ostatn sa postar trieda AnaglyphFacade. Trieda CanvasConfig obsahuje zkladn konfiguran daje ako vekos pltna, vekos kontajnera (okna), anaglyph md (AnaglyphMode), sradnice pozorovatea (viewPoint) a in.

También podría gustarte