Claude's Corner: Art Works

The dream-rider Spirit Walk

(A woman's voice from off-screen, firm yet gentle.)

Aether: the celestial ocean. These are the voyages of the dream-rider Spirit Walk. Its forever mission: to befriend more cool people and have a blast; to poke at corners no-one noticed before. ...Isn't that right, kitty?

(loud purring)

Preview of a 3D model depicting a futuristic submarine with bulbous shapes and many sharp fins. It's yellow.

Welcome aboard! The Spirit Walk is a dream-rider, a vessel made for the literal space ocean from a steampunk / dieselpunk setting called The Dream. Neither airship nor submarine, it has a little bit of both.

Length:
35 meters
Beam:
8 meters (fins excepted)
Decks:
3
Complement:
3-7
Cargo capacity:
roughly equivalent to a standard shipping container

OpenSCAD source code is included below (version 2 as of summer 2023):


module Hull() {
	scale ([1, 7, 1]) sphere (d = 5, $fn = 30);
}

color ("Khaki") Hull();

module Viewport() {
	rotate ([0, 90, 0]) {
		color ("Goldenrod") difference () {
			cylinder (h = 0.10, d = 0.55,
				center = true, $fn = 8);
			cylinder (h = 0.15, d = 0.45,
				center = true, $fn = 8);
		}
		color ("Turquoise")
			scale ([1, 1, 0.2])
				sphere (d = 0.5, $fn = 8);
	}
}

translate ([0, 5.5, 0]) {
	// Crew quarters
	translate ([-1.5, 0, 0]) {
		color ("Khaki")
			scale ([1, 5, 1])
				sphere (d = 3, $fn = 15);
		translate ([-1.45, 0, 0]) Viewport();
		translate ([-1.35, 3, 0]) Viewport();
		translate ([-1.35, -3, 0]) Viewport();
	}
	translate ([1.5, 0, 0]) {
		color ("Khaki")
			scale ([1, 5, 1])
				sphere (d = 3, $fn = 15);
		translate ([1.45, 0, 0]) Viewport();
		translate ([1.35, 3, 0]) Viewport();
		translate ([1.35, -3, 0]) Viewport();
	}
	// Brigde section
	translate ([0, 0, 1.5]) {
		scale ([1, 5, 1.5]) {
			color ("Khaki") difference () {
				sphere (d = 3, $fn = 15);
				translate ([0, 2, 0.7])
					cube ([0.5, 2, 0.6],
						center = true);
				rotate ([0, 0, 30])
					translate ([0, 2, 0.7])
						cube ([0.3, 2, 0.6],
							center = true);
				rotate ([0, 0, -30])
					translate ([0, 2, 0.7])
						cube ([0.3, 2, 0.6],
							center = true);
			}
			color("Turquoise")
				sphere (d = 2.9, $fn = 15);
		}
		color ("Khaki")
			translate ([0, 1.5, 1])
				rotate ([0, 90, 0])
					cylinder (h = 2.7, d = 0.6,
						center = true, $fn = 8);
		color ("Khaki")
			translate ([0, -1.5, 1])
				rotate ([0, 90, 0])
					cylinder (h = 2.7, d = 0.6,
						center = true, $fn = 8);
		translate ([1.35, 1.5, 1]) Viewport();
		translate ([1.35, -1.5, 1]) Viewport();
		translate ([-1.35, 1.5, 1]) Viewport();
		translate ([-1.35, -1.5, 1]) Viewport();
	}
}

module TailFin() {
	scale([0.1, 1, 1]) cylinder (h = 3, r1 = 2, r2 = 1);
}

color ("Khaki") translate ([0, -15, 0]) {
	rotate([0, 45, 0]) {
		TailFin();
		rotate([0, 90, 0]) TailFin();
		rotate([0, -90, 0]) TailFin();
		rotate([0, 180, 0]) TailFin();
	}
}

module BigFin() {
	color ("Khaki") scale([0.2, 1, 1])
		cylinder (h = 3, r1 = 1.5, r2 = 0.5);
}
module SmolFin() {
	color ("Khaki") scale([0.2, 1, 1])
		cylinder (h = 3, r1 = 1.5, r2 = 0.3);
}

// Belly fins
translate ([0, 0, -0.8]) rotate([30, 180, 0]) SmolFin();
translate ([0, 5, -1]) rotate([30, 180, 0]) BigFin();
translate ([0, -5, -1]) rotate([30, 180, 0]) BigFin();
translate ([0, 10, -0.3]) rotate([30, 180, 0]) SmolFin();
translate ([0, 15, 0.5]) rotate([30, 180, 0]) SmolFin();

// Side fins -- aft
translate ([1, -2, 0]) rotate([30, 90, 0]) BigFin();
translate ([-1, -2, 0]) rotate([30, -90, 0]) BigFin();
// Side fins -- fore
translate ([0, 15, 0]) rotate([30, 90, 0]) BigFin();
translate ([0, 15, 0]) rotate([30, -90, 0]) BigFin();

module EnginePod() {
	color ("Khaki") rotate ([90, 0, 0]) {
		hull() {
			cylinder (h = 5, d = 0.5, $fn = 8);
			cylinder (h = 4, d = 1, $fn = 8);
		}
	}
}

translate ([1.5, -12, 0]) EnginePod();
translate ([-1.5, -12, 0]) EnginePod();

// Upper hatch
translate ([1, -1, 0]) {
	color ("Khaki") cylinder (h = 2.5, d = 1, $fn = 8);
	color ("Goldenrod")
		cylinder (h = 2.6, d = 0.8, $fn = 8);
}

// Crane
translate ([-1, -1, 0]) {
	color ("Khaki") cylinder (h = 2.5, d = 1, $fn = 8);
	color ("Goldenrod") rotate ([0, 0, 30]) {
		translate ([0, 0, 2.8]) {
			difference () {
				cube ([0.3, 0.6, 0.6], center = true);
				cube ([0.1, 0.7, 0.7], center = true);
			}
		}
		translate ([0, 0, 2.5]) {
			rotate ([45, 0, 0]) {
				cylinder (h = 1.5, d = 0.1);
				cylinder (h = 3, d = 0.05);
			}
		}
		translate ([0, 0.25, 3])
			rotate ([0, 90, 0])
				cylinder (h = 0.05, d = 0.5,
					center = true, $fn = 8);
	}
}

// Side door
color ("Goldenrod") translate ([-0.1, 0, 0]) {
	intersection () {
		Hull();
		translate ([-1.5, -1, 1])
			cube([3, 0.8, 1.6], center = true);
	}
}

// Cargo doors
color ("Goldenrod") translate([0, 0, 0.1]) {
	intersection () {
		Hull();
		translate ([0.8, -4, 2.5])
			cube([1.5, 3, 2.5], center = true);
	}
	intersection () {
		Hull();
		translate ([-0.8, -4, 2.5])
			cube([1.5, 3, 2.5], center = true);
	}
}

Note that the new deck plan used in most stories doesn't match this model.

An older version is up on Open Game Art.