← Back to Models
Pantheon Benchmark: Claude Code 2.1 / Opus 4.7

Pantheon Benchmark: Claude Code 2.1 / Opus 4.7

by Mach3 ·

Client: Claude Code 2.1.146
LLM: Opus 4.7

Interactive Preview & Customizer

3D preview with browser-based OpenSCAD rendering on parameter changes.

Loading previewLoading preview...
step 0.5

Rotunda (drum)

step 0.5
step 0.5

Dome

step 0.5
step 0.5
step 0.1
step 0.1

Portico (in front of rotunda, on -Y side)

step 0.5
step 0.1
step 0.1
step 0.1
step 0.1
step 0.1

Connecting block ("intermediate block" cella front between portico and rotunda)

step 0.5
step 0.1
step 0.1

Columns

step 0.1
step 0.1
step 0.1
step 0.1
step 0.1
step 0.1

Front steps

step 0.1
step 0.1
step 0.1
WASM compiler loads on first parameter change.
Download current STL

Prompt

Create a cube with a hole on every face.

OpenSCAD Code

// Pantheon of Rome - OpenSCAD model
// Approximate proportions based on the real building (units ~ meters).
//
//   +Y  ........ back (apse end of rotunda)
//   -Y  ........ front (portico faces -Y)
//   +Z  ........ up

$fn = 96;

// ============================================================
// Master dimensions
// ============================================================
// Rotunda (drum)
rotunda_r       = 26;          // outer radius
rotunda_h       = 22;          // drum height

// Dome
dome_outer_r    = 26;
dome_inner_r    = 21.5;
oculus_r        = 4.2;
dome_step_count = 7;           // number of horizontal step rings on lower part

// Portico (in front of rotunda, on -Y side)
portico_w       = 34;          // width along X
portico_d       = 15.5;        // depth along Y
portico_floor_h = 1.7;
entab_h         = 3.2;         // entablature
pediment_h      = 6.2;
pediment_thk    = 2.4;         // pediment depth (Y)

// Connecting block ("intermediate block" cella front between portico and rotunda)
inter_w         = 26;
inter_d         = 6;
inter_h_extra   = 4;           // height above pediment apex base (down to drum top region)

// Columns
col_h           = 12.5;
col_r           = 0.9;
col_base_h      = 0.45;
col_cap_h       = 1.0;
n_front_cols    = 8;
front_col_xinset = 1.6;        // inset of outer columns from portico edge

// Front steps
step_count      = 3;
step_h          = 0.25;
step_run        = 0.7;

// Where does the front face of the rotunda sit?
rotunda_front_y = -rotunda_r;                       // = -26
portico_back_y  = rotunda_front_y + 0.6;            // overlap slightly into rotunda
portico_front_y = rotunda_front_y - portico_d;      // = -41.5

// ============================================================
// Modules
// ============================================================

// Corinthian-ish column: base + tapered shaft (entasis) + flared capital + abacus
module column(h = col_h, r = col_r) {
    // Plinth (square base)
    translate([-r * 1.5, -r * 1.5, 0])
        cube([r * 3, r * 3, col_base_h * 0.35]);
    // Torus-like base ring
    translate([0, 0, col_base_h * 0.35])
        cylinder(h = col_base_h * 0.65, r1 = r * 1.35, r2 = r * 1.10);
    // Shaft with slight entasis (slight taper)
    translate([0, 0, col_base_h])
        cylinder(h = h, r1 = r * 1.02, r2 = r * 0.88);
    // Capital - lower bell, upper flare, square abacus
    translate([0, 0, col_base_h + h]) {
        // bell (the acanthus area, approximated)
        cylinder(h = col_cap_h * 0.50, r1 = r * 0.88, r2 = r * 1.15);
        // upper flare
        translate([0, 0, col_cap_h * 0.50])
            cylinder(h = col_cap_h * 0.25, r1 = r * 1.15, r2 = r * 1.30);
        // abacus (square block on top)
        translate([-r * 1.40, -r * 1.40, col_cap_h * 0.75])
            cube([r * 2.80, r * 2.80, col_cap_h * 0.25]);
    }
}

// Front steps - climb up to the stylobate (portico floor)
module front_steps() {
    // Number of climbing steps & layout
    n = 5;
    riser = portico_floor_h / n;     // each step's height
    tread = 0.55;
    sw = portico_w + 5;
    // Bottom step is the widest and extends furthest out
    for (i = [0 : n - 1]) {
        depth = (n - i) * tread + 0.5;  // outermost is largest
        width = sw - i * 0.6;           // slight inset each step up
        translate([-width/2,
                   portico_front_y - depth,
                   i * riser])
            cube([width, depth, riser + 0.01]);
    }
}

// Cylindrical drum (rotunda body)
module rotunda_drum() {
    // Main drum
    cylinder(h = rotunda_h, r = rotunda_r);

    // Two horizontal cornice bands (the real Pantheon has two)
    band(rotunda_h * 0.45, 0.4, 0.18);
    band(rotunda_h - 0.5, 0.55, 0.25);
}
module band(z, h, overhang) {
    translate([0, 0, z])
        cylinder(h = h, r = rotunda_r + overhang);
}

// Stepped exterior dome with oculus
module dome() {
    translate([0, 0, rotunda_h]) {
        difference() {
            union() {
                // Lower stepped section (about 55% of dome height)
                stepped_h_frac = 0.55;
                stepped_top_z  = stepped_h_frac * dome_outer_r;
                for (i = [0 : dome_step_count - 1]) {
                    f0 = i / dome_step_count * stepped_h_frac;
                    f1 = (i + 1) / dome_step_count * stepped_h_frac;
                    r0 = sqrt(max(0, 1 - f0 * f0)) * dome_outer_r;
                    r1 = sqrt(max(0, 1 - f1 * f1)) * dome_outer_r;
                    z0 = f0 * dome_outer_r;
                    z1 = f1 * dome_outer_r;
                    // Flat lip (horizontal step) + sloped riser between rings
                    lip_h = (z1 - z0) * 0.55;
                    rise_h = (z1 - z0) * 0.45;
                    translate([0, 0, z0]) {
                        // Horizontal lip - flat cylinder at radius r0
                        cylinder(h = lip_h, r = r0);
                        // Sloped riser bringing it up to next ring's radius
                        translate([0, 0, lip_h])
                            cylinder(h = rise_h, r1 = r0, r2 = r1);
                    }
                }
                // Smooth upper cap above the stepped section
                intersection() {
                    sphere(r = dome_outer_r);
                    translate([0, 0, stepped_top_z])
                        cylinder(h = dome_outer_r, r = dome_outer_r);
                }
            }
            // Oculus
            translate([0, 0, dome_outer_r - 1.5])
                cylinder(h = 5, r = oculus_r);
            // Hollow the dome (interior sphere)
            sphere(r = dome_inner_r);
        }
    }
}

// Portico: floor (stylobate), columns, entablature, pediment, back cella wall
module portico() {
    floor_top_z = portico_floor_h;
    col_total_h = col_base_h + col_h + col_cap_h;
    col_top_z   = floor_top_z + col_total_h;

    // Stylobate (raised floor)
    translate([-portico_w/2, portico_front_y, 0])
        cube([portico_w, portico_d, portico_floor_h]);

    // Column X positions (8 across front)
    inset = front_col_xinset;
    x_step = (portico_w - 2 * inset) / (n_front_cols - 1);

    // Y positions for three rows of columns
    y_front = portico_front_y + 1.6;
    y_mid   = portico_front_y + 6.0;
    y_back  = portico_front_y + 10.5;

    // Front row: all 8 columns
    for (i = [0 : n_front_cols - 1]) {
        x = -portico_w/2 + inset + i * x_step;
        translate([x, y_front, floor_top_z]) column();
    }
    // Middle row: 4 columns at outer positions (creates 3 aisles)
    mid_idx = [0, 2, 5, 7];
    for (i = mid_idx) {
        x = -portico_w/2 + inset + i * x_step;
        translate([x, y_mid, floor_top_z]) column();
    }
    // Back row: same positions as middle row
    for (i = mid_idx) {
        x = -portico_w/2 + inset + i * x_step;
        translate([x, y_back, floor_top_z]) column();
    }

    // Entablature - three horizontal bands (architrave, frieze, cornice)
    ent_y0 = portico_front_y - 0.3;
    ent_y1 = y_back + 1.6;
    ew = portico_w + 0.8;
    ed = ent_y1 - ent_y0;
    // Architrave (bottom band)
    translate([-ew/2, ent_y0, col_top_z])
        cube([ew, ed, entab_h * 0.35]);
    // Frieze (middle, slightly recessed)
    translate([-ew/2 + 0.15, ent_y0 + 0.15, col_top_z + entab_h * 0.35])
        cube([ew - 0.3, ed - 0.3, entab_h * 0.35]);
    // Cornice (top, slightly overhanging)
    translate([-ew/2 - 0.3, ent_y0 - 0.3, col_top_z + entab_h * 0.7])
        cube([ew + 0.6, ed + 0.3, entab_h * 0.3]);

    // Triangular pediment - on the front face only
    pediment_z0 = col_top_z + entab_h;
    translate([0, ent_y0, pediment_z0])
        rotate([90, 0, 0])
            linear_extrude(height = pediment_thk)
                polygon(points = [
                    [-portico_w/2 - 0.6, 0],
                    [ portico_w/2 + 0.6, 0],
                    [ 0,                pediment_h]
                ]);

    // Cella wall (back of portico, against rotunda) with door opening
    cella_w = portico_w - 6;
    cella_h = col_total_h + entab_h - 0.4;
    cella_y = y_back + 1.2;
    cella_thk = 1.6;
    door_w = 4.0;
    door_h = 9.0;
    difference() {
        translate([-cella_w/2, cella_y, floor_top_z])
            cube([cella_w, cella_thk, cella_h]);
        // Door opening
        translate([-door_w/2, cella_y - 0.1, floor_top_z + 0.0])
            cube([door_w, cella_thk + 0.2, door_h]);
    }
    // Door lintel inset
    translate([-door_w/2 - 0.3, cella_y + 0.2, floor_top_z + door_h])
        cube([door_w + 0.6, cella_thk - 0.4, 0.4]);
}

// Intermediate block (taller cella section between pediment and rotunda)
module intermediate_block() {
    // Top of pediment apex z:
    apex_z = portico_floor_h + col_base_h + col_h + col_cap_h + entab_h + pediment_h;
    // The intermediate block should rise to about apex level, slightly behind pediment
    h = apex_z - 0.5;          // sits on ground
    translate([-inter_w/2,
               portico_back_y - inter_d * 0.4,
               0])
        cube([inter_w, inter_d, h]);
}

// ============================================================
// Assembly
// ============================================================
module pantheon() {
    union() {
        rotunda_drum();
        dome();
        intermediate_block();
        portico();
        front_steps();
    }
}

pantheon();