Dispersion par Prisme
Ouvrir l'expérience du prisme. Faites pivoter le prisme triangulaire équilatéral à la souris ou avec les touches fléchées. Le tiroir de paramètres permet d'ajuster l'angle de rotation et la dispersion de Cauchy.
Modèle d'Optique Géométrique
Le calcul applique les lois de Snell-Descartes sous forme vectorielle pour chaque rayon incident, détectant la réfraction et la réflexion totale interne (TIR) :
Si le discriminant sous la racine est négatif, le rayon subit une réflexion totale. L'indice de réfraction dépend de la longueur d'onde selon la formule empirique de Cauchy sur 101 longueurs d'onde échantillonnées entre 400 et 700 nm.
export function refract(direction, outwardNormal, fromIndex, toIndex) {
const normal = dot(direction, outwardNormal) > 0 ? outwardNormal.map(x => -x) : outwardNormal;
const cosine = -dot(direction, normal);
const ratio = fromIndex / toIndex;
const discriminant = 1 - ratio * ratio * Math.max(0, 1 - cosine * cosine);
if (discriminant < 0) return null;
return unit(direction.map((x, i) => ratio * x + (ratio * cosine - Math.sqrt(discriminant)) * normal[i]));
}
Optimisation GPU avec p5.js WebGL
La version Canvas 2D nécessitait 2 121 appels stroke(). Le moteur actuel convertit toutes les coordonnées de faisceaux dans un tampon Float32Array unique (BeamMesh) :
gl.bufferSubData(gl.ARRAY_BUFFER, 0, mesh.data.subarray(0, mesh.count * VERTEX_SIZE));
gl.drawArrays(gl.TRIANGLES, 0, beamVertexCount);
L'ensemble des faisceaux est tracé en un seul appel de rendu GPU avec mélange additif et anticrénelage dans le fragment shader.