Raytracing 03 - Schaakborden en meer objecten

Dit bericht is onderdeel van een langere serie over raytracing. Voor de hele serie, zie hier.

De wereld ziet er nu prachtig uit, maar kan alleen bestaan uit oneindige vlakken en bollen. Beiden zijn niet heel handig bij het ontwerpen van nieuwe omgevingen. Daarom voeg ik in deze versie twee nieuwe elementen toe, de cylinder en de doos. Die laatste gaat in volgende versies veel nut hebben, maar dat komt later. Daarnaast hebben alle dingen in de ruimte nog een specifieke kleur. Dat hoeft natuurlijk niet, dus heb ik ook een schaakbordpatroon als kleur-optie toegevoegd.

Nieuwe objecten

De cylinder was het makkelijkst om toe te voegen. Immers, ddie heeft net zoals de bol een directe formule waaraan ieder punt op de cylinder aan voldoet en voor de normaal, te zijnde:
(p_x - c_x)^2 + (p_z - c_z)^2 = r^2
n = {p_x - c_x, 0 , p_z - c_z}

De bovenste formule is uit te werken tot een kwadratische vergelijking en dan op te lossen, de onderste geeft natuurlijk direct al een antwoord.

De doos was daarentegen lastiger. Deze heeft namelijk 6 oppervlakken, die allemaal een snijpunt kunnen hebben. Om het makkelijker te maken definieer ik de doos evenwijdig aan alle assen. Hierdoor kan je eenvoudig de snijpunten met alle zijden berekenen. Daarna moet je alleen nog kijken of ieder van die snijpunten wel op de doos ligt en welke het dichtstbijzijnd is.

Schaakborden

Schaakborden zijn vrij simpel, je moet zorgen dat je afwisselend 1 en 0 hebt over je coördinatensysteem laten lopen. Dit kan je vrij simpel doen met
(x XOR z)&1 maar hierbij bleek dat JavaScript zijn float/integer conversie ietwat ongewoon doet. Zie onder.
Verwacht:
1.5  | 0 -> 1
-1.5 | 0 -> -2
Werkelijkheid
1.5  | 0 -> 1
-1.5 | 0 -> -1

Dit leverde wat extra uitzonderingen op die helaas iets langzamer waren, maar het resultaat is nog steeds vrij efficiënt.

En verder

Verder heb ik ook nog progressive raytracing geïmplementeerd. Ik zou dit verder kunnen uitleggen maar als men de link volgt komt men bij een artikel van iemand die dat een stuk beter doet.

Daarnaast heb ik nog een extreem klein begin gemaakt aan een "scene" editor, die uiteindelijk scènes voor de raytracer met klik en sleep moet kunnen gaan maken. Deze is gebaseerd op WebGL en Three.js, omdat je daarmee heel simpel basis vormen kunt maken. Het enige nadeel is dat oneindige vormen, zoals cylinders en vlakken, niet gemaakt kunnen worden. Ik verzin hier nog wel wat op. Voor de rest, bekijk zoals altijd de changelog en geniet van het programma.

Nieuwe scene in de raytracer

Verder in deze serie

Raytracing 02 - Reflectie en supersampling
Raytracing 01 - De basisstappen
Bert Peters | 19:08:50 01/02/2012 | Link | 0 reactie(s) | Tags: Serie ray tracing 


Reacties


Laat zelf een bericht achter

Naam (verplicht)
E-mail (verplicht, nooit publiek)
Typ deze tekst over: captcha
Link
Opmerking