art_blocks · Penne80sVector
Penne 80s Vector (Aaron Penne — outrun perspective wireframe)
The 80s-synthwave outrun grid, the visual aesthetic Aaron Penne references in his generative-art practice (notably in *Apparitions* and his broader body of work). A flat 2D grid on the ground plane (y = 0 in 3D world space) is perspective-projected onto the canvas via a pinhole camera placed above the horizon. Lines closer to the camera appear larger; lines near the horizon compress to a single vanishing point. A linear depth fog fades distant lines into the background colour, giving the characteristic atmospheric perspective. A neon sun disc sits on the horizon with optional sunburst rays and the iconic 80s-sun horizontal black stripes. The look is exactly the 80s-sci-fi computer-graphics aesthetic — TRON's light cycles, the outrun grid, Michael Jackson's 'Thriller' titles — except rendered through Penne's curated palette (the canonical 80s magenta/cyan/orange rather than Zephyr's earth tones).
Original: https://www.artxcode.io/journal/aaron-penne-apparitions-on-art-blocks
▶ Try the live demo (JS port) ▶ Run reference.py via Pyodide 10 formulas have instant JS ports. The Pyodide path runs the actual Python in your browser — first load is ~6 MB, then instant.
Math essence
Pinhole projection: screen_x = dim/2 + focal*x/(z + offset) * dim/8; screen_y = horizon_y + focal/(z + offset) * dim/4. Linear depth-fog alpha: alpha(z) = clip((fog_end - z)/(fog_end - fog_start), 0, 1) for z in [fog_start, fog_end]. Grid lines are (x, 0, 0)-(x, 0, grid_depth) and (-grid_extent, 0, z)-(grid_extent, 0, z). The neon sun is a half-disc at (dim/2, horizon_y) with horizontal stripes at 0.65, 0.78, 0.90 of the sun radius. Sunburst rays radiate at angles -pi + (i+1) * pi / (n_rays+1).
Parameters
| Name | Type | Default | Range | Description |
|---|---|---|---|---|
dim | int | 600 | 200–1500 | Square canvas side length (px). |
grid_extent | float | 12 | 2–50 | Half-width of the ground-plane grid (world units). |
grid_depth | float | 40 | 5–200 | Depth of the grid (world units). |
grid_step | float | 1 | 0.2–5 | Grid cell size (world units). |
horizon_y | float | 0.55 | 0.2–0.9 | Y-coordinate of the horizon line (fraction of dim). |
focal | float | 1.4 | 0.3–5 | Camera focal length (perspective strength). |
camera_offset | float | 1.5 | 0.5–10 | Camera offset to avoid z=0 singularity. |
fog_color | tuple | 10,5,30 | null–null | Background / fog RGB (80s: dark navy or magenta). |
fog_start | float | 12 | 0–100 | World z at which fog starts fading in. |
fog_end | float | 36 | 1–200 | World z at which lines are fully faded to fog. |
line_color | tuple | 255,50,130 | null–null | RGB colour of the grid lines (80s: magenta/cyan). |
neon_sun | bool | true | null–null | If True, draw a neon sun on the horizon. |
sun_color | tuple | 255,120,80 | null–null | RGB colour of the neon sun. |
sun_radius | float | 80 | 10–200 | Sun radius in px. |
sunburst_rays | int | 12 | 0–36 | Number of radiating rays from the sun. |
palette_mode | str | depth | null–null | single|depth — line colour mode. |
seed | int | 7 | 0–2147483647 | RNG seed. |
Reference
First 60 lines of reference.py. Full source:
library_external/art_blocks/Penne80sVector/reference.py
"""Penne80sVector — Aaron Penne-inspired 80s perspective wireframe.
Inspired by the early-1980s synthwave/vaporwave aesthetic of
Aaron Penne's 80s-vector influences (referenced in *Apparitions* and
his broader body of work) and the iconic "outrun grid" landscape
that has been a staple of generative-art experiments since the
demoscene era.
The "80s Vector" look is built from three primitives:
1. **A perspective-projected grid** — a flat 2D grid on the
"ground plane" (y = 0 in 3D) is perspective-projected onto
the canvas using a pinhole camera with the camera placed
above the horizon, looking forward and slightly down. Each
grid line is drawn from (x, 0, z) in 3D to its 2D screen
coordinate via the projection:
screen_x = cx + (focal * world_x) / (world_z + offset)
screen_y = horizon_y + (focal * world_y) / (world_z + offset)
Lines closer to the camera (small z) appear larger; lines
near the horizon compress to a single vanishing point.
2. **Depth fog** — lines further from the camera fade toward
the background colour via a linear alpha falloff, giving
the characteristic 80s-synthwave atmospheric perspective.
3. **A neon sun** — a horizontal "sun" disc (a glowing radial
gradient circle) on the horizon. Optionally a sunburst
pattern of radiating lines.
The aesthetic is exactly the 80s-sci-fi computer-graphics look —
think TRON's light cycles, the outrun grid, Michael Jackson's
"Thriller" titles, or any of the 80s-synthwave album covers —
except rendered through Penne's curated palette (Zephyr-style)
rather than the canonical pink/cyan.
Reference:
- Aaron Penne on Apparitions (mentions 80s-vector aesthetic):
https://www.artxcode.io/journal/aaron-penne-apparitions-on-art-blocks
- The canonical outrun grid pattern has been a generative-art
staple since at least the early-2000s demoscene; Aaron Penne
references this aesthetic in his work.
"""
from __future__ import annotations
from typing import ClassVar
import numpy as np
def _draw_filled_rect(
canvas: np.ndarray, x0: float, y0: float, x1: float, y1: float,
color: np.ndarray, alpha: float = 1.0,
) -> None:
H, W, _ = canvas.shape
xi0, xi1 = max(0, int(round(x0))), min(W, int(round(x1)) + 1)
yi0, yi1 = max(0, int(round(y0))), min(H, int(round(y1)) + 1)
if xi1 <= xi0 or yi1 <= yi0:
return
cur = canvas[yi0:yi1, xi0:xi1].astype(np.float32)
canvas[yi0:yi1, xi0:xi1] = (cur * (1.0 - alpha) + color * alpha).astype(np.uint8) Try running it locally
The reference implementation is self-contained Python with numpy. Install the package and run:
python library_external/art_blocks/Penne80sVector/reference.py Need help? See Learn for the standard environment setup, or Playground for an in-browser sketchbook.
More from art blocks
Cherniak Ringers (Dmitri Cherniak — Ringers)
art_blocks · CherniakRingers
An implementation of Dmitri Cherniak's *Ringers* algorithm (Art Blocks Curated, January 2021, 1,000 NFTs) — one of the most-cited generative-art projects of the NFT era, and the source of *Ringers #879* ('The Goose') and *Ringers #962* (acquired by LACMA).
Chromie Squiggle (Snowfro / Cherniak — Squiggles)
art_blocks · CherniakSquiggles
An implementation of the squiggle-generation kernel used in Snowfro's *Chromie Squiggle* (Art Blocks #0, November 2020) — the on-chain generative-art project that launched the Art Blocks platform itself and was the work Dmitri Cherniak cited (alongside *Genesis*) as his inspiration for Ringers.
Genesis (DCA — Day-Zero Art Blocks)
art_blocks · DcaGenesis
An interpretation of DCA's *Genesis* (Art Blocks #1, November 2020) — one of three Day-Zero collections (alongside Snowfro's Chromie Squiggle and Jeff Davis's Construction Token) that minted in the first 24 hours of the Art Blocks platform.
Hobbs Flow Field (Tyler Hobbs — Incomplete Control / Fidenza)
art_blocks · HobbsFlowField
The canonical perlin-noise flow-field algorithm described by Tyler Hobbs in his 2020 essay 'Flow Fields', and the algorithmic backbone of his Art Blocks Curated works *Incomplete Control* (Bright Moments, 2021) and *Fidenza* (Art Blocks, 2021).
Hobbs Watercolor Blob
art_blocks · HobbsWatercolorBlob
Layered translucent Gaussian blobs with watercolor-style alpha falloff.
Hobbs Watercolor Edge (Tyler Hobbs — Soft Textures / Watercolor)
art_blocks · HobbsWatercolorEdge
An implementation of Tyler Hobbs' 2017 'watercolor' technique: a recursive polygon-deformation algorithm whose midpoints are jittered by Gaussian noise across many passes, then stacked with low alpha (4% per layer, 30–100 layers total) to produce the soft, ink-bleed look of wet pigment on paper.