Airship.sceneModule
The hero exterior of *Red String Over the Atlantic*: the rigid airship herself, 240 metres of doped linen over duralumin, standing above a cumulus deck with the grey Atlantic showing through the breaks in it.
Airship — LZ-114 Weltmeer
The hero exterior of Red String Over the Atlantic: the rigid airship herself, 240 metres of doped linen over duralumin, standing above a cumulus deck with the grey Atlantic showing through the breaks in it.
The scene places this module at Core.EXTERIOR_ORIGIN (0, 2000, 0), two
kilometres above the interior set, so the crossing and the ship's rooms never
share a pixel.
What she is made of
| Entity | Mesh | Wears |
|---|---|---|
Weltmeer | AirHull | rs_air_hull — the doped-linen envelope, faceted into 32 longitudinal panels |
ring_frames | AirRings | rs_air_ring — seventeen transverse frames standing proud under the fabric |
battens | AirBattens | rs_air_ring — a longitudinal girder on every panel seam |
bow_cap | AirCaps | rs_air_alu — the mooring cap and cone forward, the tail fairing aft |
promenade_frames / promenade_glass | AirWinFrames / AirWinGlass | rs_air_brass / rs_air_glass — eighteen lit windows a side |
name | AirName | rs_air_paint — WELTMEER on both flanks, LZ-114 at the bow |
fins / control_surfaces | AirFins / AirRudders | rs_air_cream — the cruciform tail, rudders deflected |
fin_band_black / fin_band_red | AirFinBandA / AirFinBandB | the national bands across every movable surface |
fin_registry | AirFinText | the registry on the upper fin, both faces |
gondola + its two glass bands | AirGondola, AirGondolaGlass, AirGondolaCabin | the control car under the bow |
engine_cars / outriggers / airscrew_1…5 | AirPods, AirOutriggers, AirProp | five cars on struts, each with its airscrew |
nav_stbd / nav_port / nav_tail | AirBead | green, red and white |
Crossing + cloud_banks + atlantic | AirCloudDeck, AirCloudPuffs, AirSea | the weather she flies in |
The coordinate system everything on her uses
She lies along X — stem at x = +100, tail tip at x = -140. Two numbers place
anything on her skin:
t— metres aft of the stem,0 … 240.theta— the angle round her:0at the crown,+90°to starboard,180°at the keel.
surf(t, theta, k) is the point on (or k times off) the envelope and
hullN(t, theta) its normal, so a ring frame, a window pane and a painted
letter all sit on the same surface without any of them knowing about the others.
hullText paints a word in the module's own condensed deco alphabet by mapping
each glyph's bars through that same pair.
Inputs
| Input | Default | Effect |
|---|---|---|
seed | 11927 | Shifts the cloud field. |
weather | true | The cloud deck, the banks and the sea. Off leaves her against bare sky. |
lamps | true | Warm practicals behind the promenade bands and the bridge. |
Two things this module will not do, and why
No bare group entities. Every entity it spawns carries a component of its own — the ship's root is her envelope, the weather's root is the cloud deck. An entity with nothing on it does not come back from a scene save, and its children are promoted to roots, which drops the placement's transform and lands the whole ship at the world origin.
No shadow received. She flies two kilometres above the set with nothing over
her but sky. receivesShadows is off across the stage, because at that distance
from the origin the directional cascade resolves the envelope as one flat black
shape rather than a modelled one. She still casts.
Rebuilding her
The meshes are build.asset products and are re-authored only when init.luau
changes. That first build is heavier than the 1000 ms a component's awake is
allowed, so produce them off that path before the placement runs:
asset.resolve("Airship", "sceneModule"):build({}) -- caches every mesh
entity.find("AirshipStage").component.get("SceneModule"):rebuild()
Looking at her
rs_airship carries eight named framings — establish, beam, windows,
gondola, engines, stern, bow, distant — in world coordinates:
local air = Core.need("airship")
air.toShot("beam", 4.0) -- glide to the broadside over four seconds
local s = air.shot("establish") -- or take { eye, look, fov } and drive it
Scoped to this part · feeds back into the world's score.