Hola,
Para el cálculo de la emisión y/o reflexión de los fotones en superficies de reflexión difusa, en la clase de ayer dijimos que se usa la "regla del coseno", pero no dijimos cómo se hace.
El código Matlab correspondiente a una reflexión según la regla del coseno sería:
rho=sqrt(rand);
theta=rand*2*pi;
[x,y]=pol2cart(theta,rho); % pasa de coordenadas polares a cartesianas
z=sqrt(1-x^2-y^2);
En este código, la dirección de rebote es (x, y, z) que es un vector de modulo 1.
Aquí se supone que la normal es la dirección z. Si Uds tienen una superficie con la normal en otra dirección cualquiera, luego de calcular la dirección tendrán que aplicarle una rotación de forma que z esté alineada con la normal verdadera. Otra opción es adaptar este código para que ya genere la dirección contemplando la normal verdadera a la superficie.
***************************************
Si ustedes quieren generar una superficie emisora plana, con emisión difusa (como el 3er caso en el slide 9 de photon mapping, o la emisión que se ve en las imágenes del slide 34 de pm), entonces hay que emitir miles y miles de fotones siguiendo esa regla del coseno. El problema es que al generar muchos números aleatorios, puede haber problemas de "discrepancia", es decir, se pueden formar concentraciones de fotones y zonas menos iluminadas. Para solucionar esto, les mando un documento que hice el año pasado (abril), dirigido a unos colegas franceses, entre ellos Beckers, que es mencionado en varios de los métodos. En ese documento se analizan 7 códigos para generar rayos de forma aleatoria que salen de una superficie difusa, siguiendo la "regla del coseno".
Yo les sugiero probar el código 1 (es el de peor resultado, pero es el más sencillo de implementar), el código 3 (para esto deben conseguir un generador de secuencias de Halton), o alguno de los B&B.
Bueno, les paso el link al documento:
https://www.dropbox.com/s/w0ksg3a245o88l9/Secuencias%20de%20puntos%204.pdf?dl=0
Mírenlo y nos vemos el lunes. Cualquier duda nos mandan mensajes por aquí.
saludos,
Eduardo