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:
Z kamery, resp. z
bodu pozorovateľa (je možné zvoliť si rôzne spôsoby)
sa púštajú lúče.
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.
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).
Zozbierané
informácie (farby) sa zapisujú do pamäte.
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.
|