SmallTalk raytracer - MRenderer

Martin Bujňák,1i1


Dokumentácia ku projektu z jazyka SmallTalk


(MRenderer)


MRenderer je balik tried určených na zobrazenie 3D objektov v prostredí squeak.
Zobrazenie pracuje na metóde vrhania lúča a jeho trasovania(Raytrace-ing). Zobrazovanie prebieha vo fázach:

        1. Z kamery, resp. z bodu pozorovateľa (je možné zvoliť si rôzne spôsoby) sa púštajú lúče.

        2. Každý lúč zistuje či narazil na scénový objekt (scénove objekty sú uložené v kolekcii). Vyberie najbližší objekt a spýta sa na farbu prieniku.Ak lúč nepretína žiaden objekt vráti čiernu farbu.

        3. Scénový objekt farbu prieniku určí individuálne, podľa jeho vlastnosti. Ak je priehľadný objekt pustí lúč ďalej cez seba (lúč môže byť zmenený napríklad lomom...). Pri lesklu, odrazoch podobne. Objekt volá trasovanie lúča rekurzívne pričom pripočítava hĺbku vnorenia. Aby sa zamedzilo zacyklenie napr. pri zrkadlách a pod., trasovač lúča pri určitej hĺbke prestane sledovať a nevráti prienik (resp. vráti prázdny prienik). O všetky zložky sa stará Shader. Ten zmiešava jednotlivé zložky, vypočítava tieň v danom bode a vracia farbu (ta je zaznamenana v štruktúre MSurfaceInfo, ktorá nesie hlbšie informácie o bode prieniku (normála, farba, intenzitu farby, vzdialenosť prieniku, bod prieniku a pod).

        4. Zozbierané informácie (farby) sa zapisujú do pamäte.

        5. Výsledný obraz sa vráti poške na výstup.



Návod na použitie:


Balíček MRenderer obsahuje samo-testovacie, resp. ukážkové príklady ktoré možno spustit priamo z workspace-u.


MRaytracer Test1.
MRaytracer Test2.
...
MRaytracer Test8.


Upozornenie : Testovacie programy zobrazujú animáciu, v ktorej sa kamera otočí okolo scény. Prerušenie zobrazovania nastane po zatlačení pravého (žltého) tlačidla na myši.


Samostatne testovanie :


Vytvorenie prázdnej scény

scene1:=OrderedCollection new:0.

Vytvorenie objektu s nastavením pozície.

sceneObject1:=MSphere new x:10 y:0 z:0.

Každý objekt je po vytvorení bez farby, preto je vhodné mu ju nastaviť.

sceneObject1 r:1 g:1 b:1.

Orientáciu, zväčšenie, deformáciu popisuje matica.

sceneObject1 Matrix scalingX:15 y:15 z:15.

Vlastnosti objektov sú individuálne. Predefinované objekty používajú Shádery. Tie sa nastavujú priamo:

sceneObject1 shader Transparency:0.3.
sceneObject1 shader Reflection:0.4.
sceneObject1 shader Refraction:0.98.

Po zmenách v objekte je vhodné objekt zavolať, aby sa upravil. Niektoré objekty predpočítavajú pomocné data bez ktorých by sa scéna nemusela zobraziť korektne.

sceneObject1 UpdateObject.

Samotné pridanie objektu do scény spočíva v zaradení do kolekcie.

scene1 add: sceneObject1.

V tomto príklade sme vytvorili gulu s polomerom 15 [jednotiek]. Nevytvorili sme svetlo, takže objekt by bol čierny bez ohľadu na nastavenú farbu.

vytvorenie svetla:

light:=MLight new x:40 y:40 z:40. light Intensity:6000. "je potrebné nastaviť vhodnú intenzitu svetla"
light r:1 g:0 b:0.
scene1 add:light.

Vlastnosi svetla cez Shadery nemaju význam, ale môžeme nastaviť spôsob straty intenzity svetla od vzdialenosti. Pri vytvorení objektu MLight sa nastaví kvadratický zostup intenzity.

light falloff: (MQuadraticFalloff new).
light falloff: (MLinearFalloff new).
light falloff: (MConstantFalloff new).

Zostáva už iba vytvoriť pozorovateľa, teda kameru.

vytvorenie kamery:

camera:=MCamera new x:0 y:0 z:100; Fov:0.6. "fov je opticky zoom"
camera lookAtX:10 y:0 z:0.
camera UpdateObject.
scene1 add:camera.

Teraz je scéna pripravená. Zobrazenie (renderovanie) vyvoláne nasledovne.

render PerspectiveRender:scene1 Camera:camera out:Display resolution:100@100.




Kompletný zdrojový kód : MRenderer.st


UML diagram dedičnosti a spolupráce medzi triedami.



© 2001 Martin Bujnak. All rights reserved.