Photoelastic

plane polariscope · bright field · N ≈ 0.0 at the centre

Photoelastic

What it is

Photoelastic is an interactive photoelasticity experiment: a clear plastic model sitting between the polarising filters of a polariscope, drawn by a raw WebGL fragment shader on a single full-screen triangle with no 3D library. Press the model's edge and stress fringes bloom out of the point you press; drag along the edge and the whole fringe field follows; add more fingers and the loads superpose, up to six at once. Let go and the load eases off over a short spring, or snaps away when reduce-motion is on.

The stress is closed-form linear elasticity, mirrored in a unit-tested TypeScript module. Every finger is a Flamant point load on a half-plane edge, whose field is purely radial, sigma_rr = -2P cos(theta) / (pi r). The Disc preset is Timoshenko's disc under diametral compression between two platens, which reads about 4.4 fringe orders at its centre at the default load; the Hole preset is Kirsch's plate with a circular hole under tension, with the 3x stress concentration at the hole's flank, where the readout samples it; Slab is an empty plate for you to load. Because elasticity superposes, the shader sums the tensors per pixel and takes the principal stress difference and the isoclinic angle from the summed tensor.

No colour is picked. The retardation from the principal stress difference is looked up in a Michel-Levy chart built on the CPU when the page mounts: white light from 380 to 780 nm is passed through the retardation per wavelength, integrated with the Wyman-Sloan-Shirley fit of the CIE 1931 colour-matching functions, converted to linear sRGB and uploaded as a 1024-entry one-dimensional texture. The light and sunset themes show a bright-field polariscope (parallel filters, a ground the colour of the page, complementary colours); the dark theme shows dark-field (crossed filters, black ground, the saturated rainbow). Both are real polariscope configurations, so switching theme changes the optics rather than a palette.

The Analyser dial rotates the crossed filter pair from 0 to 90 degrees and sweeps the dark isoclinic cross around the figure while the colours stay put; Circular inserts quarter-wave plates and removes the isoclinics; Load scales every force on the model from 0.05x to 2.5x. Where fringes pack tighter than a pixel near the platens, a screen-space derivative fades them to the chart's high-order grey instead of aliasing. Without WebGL the same chart is sampled in JavaScript at half resolution. The first frame is the fully loaded disc: the platens start at full load rather than easing in.

How to use it

  • Press the model's edge and drag along it; push in deeper to load harder.
  • Add more fingers - up to six loads superpose.
  • Slide Analyser to sweep the dark cross; Circular removes it.
  • Turn Load up or down; switch to the Slab or the Hole preset.
WebGLGLSLPhysicsOpticsInteractive

More experiments

See every experiment