CH NEO-ZÜRICH EDITION
WEATHER · OVERCAST 7°C
BLEND OF THE DAY · 07/ROGUE
EST. 2027
THE AEC CYBER MORNING NEWS

PAZ Kaffi

DESIGN · DEMOLITION · CAFFEINE · DISPATCH
EDITION 1030 · 30 October 2026
BROADCAST 04:42 CET
2,400 BROADSHEETS PRINTED
READ TIME · 47 MIN
Throw a Thousand Rays at a Section and Watch the Daylight Argue Back
ACTION
FRAME · 06:55
30-10-2026

Throw a Thousand Rays at a Section and Watch the Daylight Argue Back

Drag the sun, watch the section light up: raycasting from Wolfenstein 3D to SN EN 17037, with a GhPython snippet that scores how much floor the sun reaches.

Here is the toy, built on the same trick id Software used in 1992 to draw the corridors of Wolfenstein 3D: one ray, one question. You see a room in section: a floor, two side walls, a roof with gaps in it and one overhang. Drag the sun across the sky and a fan of parallel rays rakes the section from that angle. Rays that slip through a roof opening land on the floor and light it up; the rest die on the roof, the overhang or a wall. Drag again and the lit patch on the floor grows and shrinks, like a scoreboard updating live.

The idea is older than any console. According to Arthur Appel’s 1968 IBM paper on shading machine renderings of solids, you fire a ray from the eye through each point of the picture and ask what it hits first. Turner Whitted extended that into recursive ray tracing in 1980. Wolfenstein 3D cast one ray per screen column across a grid map so an early-1990s PC could fake depth. Appel’s name rarely comes up, yet every daylight plugin, every clash check and every game shadow descends from his one question.

The rules, exposed

  • The sun is far away, so every ray is parallel: one fan, raked from the sun’s angle.
  • Each ray keeps only its nearest hit; one that dies on the roof, the overhang or a wall is blocked.
  • A ray that slips through a roof opening and reaches the floor marks that strip of floor as lit.
  • Lit floor divided by total floor is the score, shown live.

That is the whole game: four rules, one loop, one number.

Now break it

Steepen the sun toward noon and light drops straight through the skylight. Drop it toward the horizon and the low rays rake deep under the overhang: the summer-versus-winter case an overhang is sized for. Then switch the section from skylight to clerestory, ribbon, monitor or atrium, and watch the same sun land somewhere else entirely.

←TODAY: SN EN 17037 sets minimum sunlight exposure at 1.5 hours on a reference day between 1 February and 21 March. →3012: Zurich plans are argued as live light fields, not frozen renders. Fulcrum: a ray you can drag shows what the norm’s hours mean in section.

Sightlines run on the same loop. Swap the sun for a pair of eyes, and the lit points become what someone can actually see from a seat, a courtyard or a square. In The Nature of Code, Daniel Shiffman builds his whole simulation vocabulary on vectors, and a ray is the simplest vector there is.

PAZ has used this thread before. The PAZ concept panel on subterranean development ray-casts a floor grid against a winter-solstice sun vector and grows a light well until at least 50% of the habitable floor sees direct sun. Its design number is the well-area-to-floor-area ratio. The toy above is that study, made into something you can poke with a mouse.

The trade-off, plainly: a binary ray tells you whether the sun reaches a point, not how much diffuse sky light arrives. A raycast score supports a daylight factor calculation; it does not replace one.

Atelier: For a small studio in Zürich or Basel, the gain is speed at the massing stage, while a deep plan is still cheap to change. Teams adopting AI-assisted massing need a fast check they can read line by line, not another black box. Monday move: before the next design review, run a solstice ray grid on each massing option in Grasshopper and pin the lit percentage beside each option on the wall.

Hack: Score how much of a floor the winter sun reaches with Rhino’s built-in ray shooter. Feed in a list of floor points and the obstacle Breps; each ray returns either a hit point or nothing, and nothing means daylight. Run it in a GhPython component inside Rhino + Grasshopper, then pass the chosen option on through the PAZ Grasshopper↔Archicad Library.

import Rhino.Geometry as rg
sun = rg.Vector3d(0.3, -0.8, 0.25); sun.Unitize()
hits = [rg.Intersect.Intersection.RayShoot(rg.Ray3d(p, sun), obstacles, 1) for p in floorPts]
lit = sum(1 for h in hits if not h) / float(len(floorPts))

Shiffman’s Coding Train tutorials rebuild the 2D raycaster in p5.js from scratch if you want the next level. Open the sketch, drag the sun down to the winter low, and delete one wall you are not sure you need.

FILED FROM
CO-SIGNERS
PAZ Academy
CONFIDENCE
HIGH
REPRINTS
© PAZ - PARAMETRIC ACADEMY ZURICH · ALL RIGHTS RESERVED

PAZ Kaffi · multidisciplinary editorial, led by PAZ Academy

⚑ REPORT AN ERROR · SUBMIT A CORRECTION
◂ BACK TO FRONT PAGE · PAZ KAFFI

© 2026 PAZ Academy.