Interactive Preview & Customizer
3D preview with browser-based OpenSCAD rendering on parameter changes.
Loading preview...
Level of detail
step 1
step 0.5
step 0.5
step 0.1
Number of stepped rings on the dome base
step 1
Prominent radial structural seams
step 1
How much the ribs stick out from the dome
step 0.1
step 0.1
step 0.5
step 0.1
step 0.1
step 0.1
Reduced width of the column base
step 0.1
step 0.1
step 0.1
WASM compiler loads on first parameter change.
Prompt Assets
Prompt image
Prompt
see two ref images and build .scad file with openscad implementation of pantheon. use openscad CLI (available) to preview your work (by rendering openscad model to .png) and iterate until you are happy with the result.
OpenSCAD Code
/* [Global] */
// Level of detail
$fn = 64; // [32:1:128]
/* [Rotunda & Dome] */
rotunda_radius = 21.5;
rotunda_height = 21.7;
oculus_radius = 4.5;
// Number of stepped rings on the dome base
dome_steps = 5; // [3:1:7]
// Prominent radial structural seams
rib_count = 32; // [16:2:64]
// How much the ribs stick out from the dome
rib_height = 0.8; // [0.2:0.1:2.0]
rib_width = 0.7;
/* [Portico Columns] */
column_span = 34;
column_height = 14.5;
column_radius = 0.95;
capital_flare = 1.55;
// Reduced width of the column base
base_radius = 1.6;
/* [Entablature & Roof] */
entablature_h = 4.5;
pediment_h = 6.5;
/* [Hidden] */
eps = 0.05;
// Main Assembly
union() {
color("LightGray") rotunda();
color("DarkGray") intermediate_block();
color("Ivory") portico();
}
module rotunda() {
// The main cylindrical wall
difference() {
cylinder(h = rotunda_height, r = rotunda_radius);
translate([0, 0, -eps])
cylinder(h = rotunda_height + eps*2, r = rotunda_radius - 2.5);
}
// The Dome with prononuced Radial Ribs
translate([0, 0, rotunda_height]) {
difference() {
union() {
// Base Hemisphere
intersection() {
sphere(r = rotunda_radius);
cylinder(h = rotunda_radius, r = rotunda_radius);
}
// 1. Pronounced Radial Ribs (The requested structure)
intersection() {
// Larger sphere defining the rib profile
sphere(r = rotunda_radius + rib_height);
union() {
for(r = [0 : rib_count - 1]) {
rotate([0, 0, r * (360 / rib_count)])
translate([-rib_width/2, 0, 0])
// Ribs extending from center to beyond radius
cube([rib_width, rotunda_radius + 2, rotunda_radius + 2]);
}
}
}
// 2. Horizontal Stepped Rings
for(i = [0 : dome_steps - 1]) {
translate([0, 0, i * 1.35])
cylinder(h = 1.4,
r1 = rotunda_radius - (i * 0.95),
r2 = rotunda_radius - (i * 0.95 + 1.2));
}
}
// Hollow interior
sphere(r = rotunda_radius - 2.5);
// Oculus (the hole at the top)
translate([0, 0, rotunda_radius - 4])
cylinder(h = 10, r = oculus_radius);
}
}
}
module intermediate_block() {
w = column_span + 6;
h = rotunda_height;
d = 12;
translate([-w/2, rotunda_radius - 4, 0]) {
cube([w, d, h]);
// Secondary pediment
translate([w/2, 0, h - eps])
draw_pediment(w, d, 5.5, framed=false);
}
}
module portico() {
y_start = rotunda_radius + 6;
p_depth = 19;
total_w = column_span + (base_radius * 2) + 0.5;
translate([0, y_start, 0]) {
// Floor
translate([-total_w/2, 0, 0])
cube([total_w, p_depth, 1.5]);
// Columns
spacing = column_span / 7;
for(x = [0:7]) {
xp = (-column_span/2) + (x * spacing);
translate([xp, p_depth - 3.5, 1.5]) column_corinthian();
if (x == 0 || x == 7 || x == 2 || x == 5) {
translate([xp, p_depth - 9.5, 1.5]) column_corinthian();
translate([xp, p_depth - 15.5, 1.5]) column_corinthian();
}
}
// Entablature
translate([-total_w/2, 0, column_height + 1.5]) {
cube([total_w, p_depth, entablature_h * 0.3]);
translate([0.5, 0.2, entablature_h * 0.3])
cube([total_w - 1, p_depth - 0.4, entablature_h * 0.4]);
translate([-0.8, -0.8, entablature_h * 0.7])
cube([total_w + 1.6, p_depth + 1.6, entablature_h * 0.3]);
}
// Main Pediment
translate([0, 0, column_height + 1.5 + entablature_h - eps])
draw_pediment(total_w + 1.6, p_depth + 1.6, pediment_h, framed=true);
}
}
module column_corinthian() {
cylinder(h = 0.5, r = base_radius);
translate([0, 0, 0.5])
cylinder(h = 0.4, r1 = base_radius - 0.1, r2 = column_radius);
cylinder(h = column_height, r = column_radius);
translate([0, 0, column_height - 1.2])
cylinder(h = 1.3, r1 = column_radius, r2 = capital_flare);
translate([0, 0, column_height])
cube([capital_flare * 2, capital_flare * 2, 0.5], center=true);
}
module draw_pediment(w, d, h, framed=true) {
rotate([90, 0, 0])
translate([0, 0, -d])
linear_extrude(height = d)
polygon(points = [[-w/2, 0], [w/2, 0], [0, h]]);
if (framed) {
frame_t = 1.2;
color("Ivory")
translate([0, d, 0])
rotate([90, 0, 0])
linear_extrude(height = 1.8)
difference() {
polygon(points = [[-w/2 - 0.5, -0.2], [w/2 + 0.5, -0.2], [0, h + 0.5]]);
polygon(points = [[-w/2 + frame_t, 0.8], [w/2 - frame_t, 0.8], [0, h - frame_t]]);
}
}
}