[PHP] Caustics

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Topicstarter
Introductie:
Ik liep een paar maanden geleden rond met het idee om caustics (is geen Nederlands woord voor) te gaan simuleren, zoals hier, dit naar aanleiding van een wiskunde leraar die ik had die ook gefascineerd was door de 'dubbele curve in zijn koffie beker', mijn passie voor 3D en aanverwante render programma's (zoals Brazil en FR) die ook caustics kunnen produceren, en mijn voorkeur voor PHP als beste programmeertaal ever (just kidding, ik ben alleen een fan en te onwetend wat C betreft).

Na een aantal keren wat schetsjes te hebben gemaakt en wat algemene aanpak ideeen op papier te hebben gemaakt, vond ik het twee weken geleden wel eens tijd om het ook in de praktijk te brengen.
Na veel typen, zweten, nadenken en zwoegen is er uiteindelijk een redelijk resultaat uitgekomen, maar hij is zeker nog steeds niet af en moet nog geoptimaliseerd worden.

Plaatje:
Afbeeldingslocatie: http://home.uva.nl/onno.vanbraam/tweakers/caustics-explain-01.gif

CL, OL en PL zijn niet echt interessant, het is een oud schetsje, maar zo krijg je een idee van hoe ik het heb willen aanpakken. Beta boeide uiteindelijk ook niet echt, want ik was overgestapt over vector berekeningen.
A.d.h.v OP en PL wordt dus de reflectierichting uitgerekend.

Als er belangstelling voor is kan ik wel een uitgebreide beschrijving geven van hoe ik het heb gedaan.

Plan'o'work:
In short:
- Neem Positie van lamp (puntbron) + Positie op 'ring'
- Bereken Reflectie richting vanaf ring adhv Pring
- Bereken aan de hand van hoogteverschil tussen Plamp en Pring het aantal nog af te leggen units in de reflectierichting
- Met pythagoras is dan de positie te bepalen waar de 'ray' de grond gekruist wordt.
- Het uiteindelijke showen gebeurt op een hardcore methode: een tabel met 250x5000 td's waarvan de achtergrond grijswaarde de (genormaliseerde) intensiteit weergeeft. Lelijk? Dom? Uberkill? Tsja, maybe, maar het werkt wel, en who cares about 20Mb HTML files? :) Ik weet het, het is lomp, maar ik heb nog geen andere oplossing gevonden (GD zuigt!).

Dit alles heb ik zo veel mogelijk met 'vectoren' (arrays) uitgerekend. Vooral de reflectierichting berekening was even nadenken, maar uiteindelijk na heel wat denkwerk had ik toch een algoritme / methode verzonnen die het naar behoren uitvoerde. Voor de wiskundigen onder ons: het is een soort Gram-Schmidt methode (bepaling loodrechte vector), gepruts met inproducten dus.

Resultaat:
Anyways:
Resultaten willen jullie natuurlijk zien...

Hier een (dit resultaat is niet helemaal correct dus), ik was al redelijk tevreden dat ik dit eruit heb gekregen omdat het sterk overeenkomt met de werkelijkheid en resultaten van anderen. Hier stond de puntbron op een x-positie van 0:
Afbeeldingslocatie: http://home.uva.nl/onno.vanbraam/tweakers/caustics-01.gif

En hier het resultaat met de puntbron niet in een 0 positie, het resultaat is deels veel beter, maar zoals je ziet lijkt het alsof maar een deel van de cirkel reflecteert. Ik weet waar dit aan ligt, ik moet het alleen nog oplossen! :)
Afbeeldingslocatie: http://home.uva.nl/onno.vanbraam/tweakers/caustics-02.gif

En een composit van twee verschillende oplossingen die ik geprogrammeerd dus nog niet helemaal voor elkaar heb:
Afbeeldingslocatie: http://home.uva.nl/onno.vanbraam/tweakers/caustics-03.gif


Nog te doen:
- Het belangrijkste probleem wat ik nog heb is dat het berekenen van het crosspoint met de grond nog niet helemaal naar behoren verloopt, aangezien de berekende richting twee betekenissen heeft (de richting is een vector en dan met de positie vector van het reflectie punt heb je een lijn, alleen deze kan je dus op twee manieren aflopen...). Als ik deze te pakken krijg is hij eigenlijk af en heb ik mijn doel bereikt, alleen dat vereist nog even wat denkwerk.
- Optimaliseren van vector functies: ik ga nog wat benches uitvoeren om te kijken of mijn functies bepaalde acties sneller uitvoeren dan ingebouwde array functies.

Het 'programma' is tot nu toe 220 regels lang. Misschien zal ik binnenkort de source nog posten, als hij helemaal naar behoren werkt.
Ik kan hem niet online laten werken, aangezien hij ~300000 rays berekent, wat op mijn computer al zo'n 30 seconden duurt.

Dat was het, als er nog vragen en/of op|aanmerkingen zijn: post.

--------------------------------------------------------------------------------------

PS: Je kan zien wat ik wil bereiken door een beker te pakken en dan bij een felle lamp deze erin te laten schijnen, beweeg de beker een beetje totdat je een dergelijk patroon ziet verschijnen.

PS 2: Ik hoop dat er hier niet alleen 'problemen' mogen worden gepost in P&W, was niet geheel duidelijk in de FAQ, maar ach een beetje 'showen' mag toch wel? ;)

PS 3: Het is inderdaad een totaal nutteloos project als iemand dat zich afvraagt, maar een beetje hersen gymnastiek is wel een nuttig bezigheid IMHO + ik train mezelf weer meer in effectief PHP programmeren.

[ Voor 26% gewijzigd door Cavorka op 29-08-2003 21:08 ]

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Topicstarter
Update:

Ja, na enig geratel (van mij dan, niet van mijn computer) ben ik eruit gekomen hoe altijd het juiste punt uit te rekenen waar het is dat de ray / het photon de grond kruist. Ik was vergeten rekening te houden met een afgeleide waardoor ik nogal ingewikkeld zat te doen en domme if statements aan het maken was.

721721 photons zijn gebruikt, 71s render tijd.

Zie hier het uber-1337 resultaat :p :
Afbeeldingslocatie: http://home.uva.nl/onno.vanbraam/tweakers/caustics-04.gif

Plannen / To do:
- De functies zijn redelijk geoptimaliseerd dus deze hoef ik niet te gaan vervangen (dingen als array_multipy en array_add bestaan niet, en zouden hoogstwaarschijnlijk ook niet sneller werken dan de functies nu.
- Wat ik zeker nog wil maken is dat de photons een grote invloed krijgen, of een beetje leaken: nu wordt de intensiteit van een 'hokje' 1 opgehoogd: dit is een 2-dim. array met intensity[x_coord][y_coord]. Daarom is het resultaat nogal pixelig en moet ik ook zoveel photon's gebruiken. Wait ik wil: bereken het resultaat en laat de intensiteit exponentieel afvallen t.o.v. het originele crosspoint met de grond en de hokjes eromheen zullen dus ook een beetje licht krijgen, alleen dus veel minder dan het 'hoofd' hokje.
Dit zal volgens mij heel weinig werk zijn en zal de rendertijd aanzienlijk verminderen en het resultaat verbeteren.

- Diffuse / soft reflection: een beetje hetzelfde als hierboven alleen dan al vanaf het reflectie punt (P) zelf.

- Andere reflectie objecten (driehoekig, en (co)sinus over de cirlkel (wobbly circle) en andere ondergronden (hobbelend, puntig etc.).

- Refractie! :)

Updates volgen.

Nu is mijn vraag: hoe makkelijk is het om met C/C++ een grafiek te tekenen, of een plaatje waar je van elke x/y coordinaat de RGB-waarde van kan aangeven. Is er iemand die iets dergelijks kan? Info wordt zeer gewardeerd, want PHP is volgens mij niet echt het perfecte programma's om simulaties in te gaan schrijven.

offtopic:
*Edit: typo's... ik ben aan het ver-engelsen, schrijf the i.p.v. de :?

[ Voor 28% gewijzigd door Cavorka op 29-08-2003 21:10 ]

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

Verwijderd

wow, dit is interessant, ik wil wel weten hoe je dat gedaan hebt B)

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Topicstarter
Hehe, thanks, misschien dat ik nog ff een websitje opzet met daarin alles wat ik heb gedaan (schetsjes, theorie en uitwerking).

For the time being:
ik heb even snel wat getest om het geheel wat smoother te krijgen en dat is aardig gelukt:
Oud / 1ste orde smoothing / 2e orde smoothing:
Afbeeldingslocatie: http://home.uva.nl/onno.vanbraam/tweakers/caustics-05.gif

Alleen hier zie je wel weer dat er wat dingetjes niet kloppen:
- Wat is precies die linker lijn? Waar komt deze vandaan?
- Photons gaan door het reflectievlak heen, misschien dat ik nog een second bounce kan maken... Hm, gaat lastig worden, maar is zeker te doen.

Laatste voor vandaag:
Afbeeldingslocatie: http://home.uva.nl/onno.vanbraam/tweakers/caustics-06.gif

>1 Miljoen photon's, 2nd order smoothing. :p

*Cavorka droomt al van zijn eerste PHP global illumination render! ;)

[ Voor 14% gewijzigd door Cavorka op 29-08-2003 23:08 ]

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.