(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)
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.
OpenSCAD source code is included below (version 3 as of May 2025):
module Hull() {
scale ([1, 7, 1]) sphere (d = 5, $fn = 36);
translate([0, -10, 0.6])
cylinder(h = 0.6, d = 5, center = true, $fn = 18);
translate([0, -10, -0.6])
cylinder(h = 0.6, d = 5, center = true, $fn = 18);
}
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 = 12);
}
color ("Turquoise")
scale ([1, 1, 0.2])
sphere (d = 0.5, $fn = 12);
}
}
translate ([0, 5.5, 0]) {
// Crew quarters
translate ([-1.5, 0, 0]) {
color ("Khaki")
scale ([1, 5, 1])
sphere (d = 3, $fn = 18);
translate ([-1.5, 0, 0]) Viewport();
translate ([-1.40, 3, 0]) Viewport();
translate ([-1.40, -3, 0]) Viewport();
}
translate ([1.5, 0, 0]) {
color ("Khaki")
scale ([1, 5, 1])
sphere (d = 3, $fn = 18);
translate ([1.5, 0, 0]) Viewport();
translate ([1.40, 3, 0]) Viewport();
translate ([1.40, -3, 0]) Viewport();
}
// Brigde section
translate ([0, 0, 1.5]) {
scale ([1, 5, 1.5]) {
color ("Khaki") difference () {
sphere (d = 3, $fn = 18);
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 = 18);
// Forward deck
color("Khaki") scale([1, 1.1, 1])
cylinder(h = 0.5, d1 = 3.5, d2 = 3,
center = true, $fn = 18);
color("Khaki")
translate([0, -0.25, 0.8])
scale([0.9, 0.6, 1])
cylinder(h = 0.1, d = 3,
center = true, $fn = 18);
}
translate([-1.2, 1.5, 1.1]) HatchDoor(-70);
translate([1.2, 1.5, 1.1]) HatchDoor(70);
translate([0, -6, 1.3])
rotate([-60, 0, 0]) rotate([0, 0, 90])
Viewport();
}
}
module HatchDoor(rotx) {
color("goldenrod") rotate([rotx, 0, 90]) intersection() {
cube([0.7, 1.5, 0.1], center = true);
cylinder(h = 0.15, d = 1.6, $fn = 8, center = true);
}
}
module TailFin() {
scale([0.1, 1, 1])
cylinder (h = 3, r1 = 2, r2 = 1, $fn = 9);
}
color ("Khaki") translate ([0, -15, 0]) {
for (i=[45:90:360]) rotate([0, i, 0]) TailFin();
}
module BigFin() {
color ("Khaki") scale([0.2, 1, 1])
cylinder (h = 3, r1 = 1.5, r2 = 0.5, $fn = 9);
}
module SmolFin() {
color ("Khaki") scale([0.2, 1, 1])
cylinder (h = 3, r1 = 1.5, r2 = 0.3, $fn = 9);
}
// 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();
// Top fins
translate ([0, 2, 1.5]) rotate([30, 0, 0]) SmolFin();
translate ([0, 3.6, 1.8]) rotate([30, 0, 0]) SmolFin();
translate ([0, 5.3, 1.6]) rotate([30, 0, 0]) SmolFin();
// Diving planes
translate ([1.5, -2, 0]) rotate([0, 90, 0]) BigFin();
translate ([-1.5, -2, 0]) rotate([0, -90, 0]) BigFin();
module Thruster() {
rotate([90, 0, 0]) {
difference() {
hull() {
cylinder(h = 5, d = 0.6, center = true, $fn = 12);
cylinder(h = 3, d = 1, center = true, $fn = 12);
}
cylinder(h = 5, d = 0.5, center = true, $fn = 12);
}
scale([1, 1, 8]) sphere(d = 0.6, $fn = 12);
}
}
color("Khaki") {
translate ([2.5, -15, 0]) Thruster();
translate ([-2.5, -15, 0]) Thruster();
translate([0, -15, 0])
rotate([0, 90, 0])
scale([0.1, 1, 1])
cylinder(h = 5, d = 3, center = true, $fn = 9);
}
// Crane
translate([-1, -1.5, 0]) {
color("Khaki") cylinder(h = 2.5, d = 1, $fn = 12);
color("Goldenrod") difference() {
cylinder(h = 3.1, d = 0.6, $fn = 12);
translate([0, 0, 3.1])
cube([0.3, 1, 1], center = true);
}
color("Khaki") translate([0, 0, 3]) rotate([60, 45, 0]) {
// cylinder(h = 1, d = 0.4, center = true, $fn = 12);
cylinder(h = 1.5, d = 0.2, center = true, $fn = 12);
cylinder(h = 3, d = 0.1, $fn = 12);
}
}
// Cargo doors
translate([0, -4, 0]) {
color("Khaki")
cylinder(h = 2.5, d1 = 4, d2 = 3, $fn = 24);
color("Goldenrod")
translate([0, 0, 2.5])
scale([1, 1, 0.1])
sphere(d = 2, $fn = 24);
}
This version is closer to the deck plan used in most stories, but still quite different.
An older version is up on Open Game Art.