The science
Beam height. Radio waves in a standard atmosphere bend slightly toward the ground; this is handled by pretending the Earth has radius ae = (4/3)a and the ray is straight: h(r) = √(r² + ae² + 2 r ae sinθ) − ae + h0 (Doviak & Zrnić). Near the radar this is r sinθ + r²/(2ae): at 100 km a 0.5° beam is already about 1.46 km high, so low storm layers far away are overshot.
Beam width. θb ≈ 70 λ/D degrees (half-power width). The illuminated height at range r is rθb; the power pattern is modelled as a Gaussian exp(−4 ln2 (Δ/θb)²).
Partial beam blockage by terrain whose top is at angle α above the beam axis: the blocked power fraction is the Gaussian cumulative Φ(α/σ), σ = θb/√(8 ln 2); the picture uses the worst obstruction on the way out. Weather overlap with the beam uses the same Gaussian over the storm column from 0 to its top.
Sensitivity. Minimum detectable reflectivity rises as 20 log10 r (here −10 dBZ at 50 km, illustrative). Beam-filling loss from a cell smaller than the beam is not modelled.
Range–velocity dilemma. Unambiguous range Ru = c/(2 PRF) and Nyquist velocity vN = λ PRF/4 multiply to Ru · vN = cλ/8, a constant of the band. Echoes beyond Ru are shown at r − Ru (second trip, weaker by (r/(r+Ru))²); radial speeds beyond ±vN wrap around.
Honest simplifications: standard refraction only (no ducting or anomalous propagation), no side lobes, no attenuation, storm cells are Gaussian blobs with a flat top, uniform wind plus a Rankine vortex, terrain is a synthetic analytic landscape, the tower and radome are drawn about 120 times too large to be visible, heights in 3D are exaggerated by the slider. Wind direction is where the air moves toward (45°, north-east).
Models and baked textures: Blender 5.2 (terrain, tower, radome, dish, cloud puff); rendering: Three.js r160. Educational model, not for forecasting.