Skip to content
Sample of Penne 80s Vector (Aaron Penne — outrun perspective wireframe)

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.

Family
art_blocks
Source
art blocks
Evolution
extrusion
Render
perspective_projection
Complexity
low
Agents
1
Year
2019
Author
Aaron Penne (aesthetic reference; the algorithm is a classic 80s-synthwave perspective grid)

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

Sample of Cherniak Ringers (Dmitri Cherniak — Ringers)

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).

View →
Sample of Chromie Squiggle (Snowfro / Cherniak — Squiggles)

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.

View →
Sample of Genesis (DCA — Day-Zero Art Blocks)

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.

View →
Sample of Hobbs Flow Field (Tyler Hobbs — Incomplete Control / Fidenza)

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).

View →
Sample of Hobbs Watercolor Blob

Hobbs Watercolor Blob

art_blocks · HobbsWatercolorBlob

Layered translucent Gaussian blobs with watercolor-style alpha falloff.

View →
Sample of Hobbs Watercolor Edge (Tyler Hobbs — Soft Textures / Watercolor)

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.

View →

See all art_blocks artworks →