# Grouper: a Tender ("sub tub") after the user's blueprint and concept render Built on 2026-10-22 after the user's blueprint `reference/user_blueprint.jpg` ("DEEP SEA EXPLORER - SUBTUB CLASS, ORTHOGRAPHIC BLUEPRINT DS-ST-001": TOP, SIDE, BOTTOM, FRONT ELEVATION, BACK ELEVATION, two SECTION A-A cockpit views), with the user's words *"create me 3d model of this tender from this blueprint exactly"*, and the user's concept render of the same sub underwater, `reference/user_concept.jpg` (*"Check this picture as a referance"*). "Grouper" is a working name; the user has not named it. **The blueprint rules the shape** (SIDE first; TOP gives widths, FRONT/BACK what SIDE cannot show). **The concept rules the look**: materials, colours, lights, light strips, the markings' style, and how parts look and attach where the sheet is unclear. The Designer's readings and every number: `design/DESIGN.md`, `build/gr_measure.py`. Built headless (Blender 5.2.2). **Critique round 1 applied** (`critique/round1.md`; the state before it is in `versions/v01_before_critique_r1/`): the hull re-lofted at 72 columns (was a dense 144 x 161 grid), the pods straight nacelles with ringed tail cones, a solid bracket under the drum, bucket seats, screen banks, thin light strips, vector circuit traces, satin gunmetal, LODs. What changed and why: "Round 1" below. ## Files | | | |---|---| | `Tender_Grouper.blend` | the model, rigged and textured | | `fbx/SM_Grouper_*.fbx` | one FBX per part; moving parts at the world origin, unturned (vertices relative to their pivot); the hull carries its 29 `UCX_` hulls | | `fbx/SM_Grouper_*_LOD1.fbx`, `_LOD2.fbx` | LODs of the hull, glass, doors, hatch and rotor (about 50 % and 20 %), same pivots (Unreal: LOD Settings > Import LOD) | | `fbx/Grouper_Assembled.fbx` | every mesh in place, at rest | | `Grouper_layout.json` | pivots, motion axes and ranges, sockets, the clamp interface, the lights rule, every check's result, textures, decals, LODs, UV densities, the concept camera (Unreal cm: `ue = (-y, -x, z) * 100`) | | `textures/` | `T_Grouper_Exterior_Masks` / `_BevelNormal` / `_Emissive` (4096, the hull), `T_Grouper_Parts_Masks` / `_BevelNormal` / `_Emissive` (2048: doors, hatch, glass, rotor, antenna), `T_Grouper_Cabin_Masks` / `_BevelNormal` (2048), `T_Grouper_Decals_BaseColor` (RGBA) / `_Emissive` (2048 x 2048), `T_Grouper_Screens`; `_src/` the trace mask and a decal preview | | `previews/r1_studio_*.png` | Cycles, bright studio light, Standard view transform: side, top, front, back, three-quarter fore and aft, the cabin through the open hatch and the open door | | `previews/r1_water_nose.png`, `r1_water_stern.png` | underwater, lights on | | `previews/r1_topo_*.png` | wireframes over the shading (Workbench) | | `previews/lods_hull.png` | the hull's LOD0, LOD1, LOD2 from the exported FBX files | | `previews/compare/concept_pair.png` | **the concept's crop beside the model from the concept's fitted camera** (dark water, lights on) | | `previews/compare/lookalike.png` | each sheet view beside the model rendered orthographically in the same framing; SECTION A-A beside the cut at the A plane | | `previews/compare/cmp_.png` | the model's outline (red) and the Designer's silhouette (yellow) over the sheet; IoU in the title | | `previews/compare/side_inkover.png` | the sheet's drawn lines (magenta) over the model's SIDE render | | `previews/v01_*`, `wb_*`, `topo_*` | the first delivery's pictures (stale: before round 1) | | `reference/` | the sheet, the concept, zooms, the Designer's masks, line images and trace pictures | | `design/DESIGN.md` | the Designer's design (parts, how they attach, the disagreements table) | | `critique/round1.md` | the Critique's round 1 | | `build/` | the scripts (below); `checks/` every check's result | ## What it is, part by part (SIDE first) - **Hull**: one quad grid, 72 columns round and 103 stations (round 1; it was 144 x 161), lofted from SIDE's top and keel lines and TOP's widths with superellipse sections; the stern eases to a circle round the duct, the nose's underside is flat. The columns are pinned to the drawn lines (grooves, the window frame's edge, the door, the windows, the collar's square); the free columns between the pins are smoothed along the hull. An hourglass **waist band** along each flank, recessed 30 mm, between two **grooves** (the sheet's double rim lines, walls 8 mm chamfers) whose floors carry a thin cyan **light line**; the upper groove runs on over the side window's frame and across the nose top, the lower one curves down over the pod to the belly. The raised window frame band ends in 30 mm chamfers. A chine on the upper aft body, a belly seam (baked). - **Stern duct** (SIDE x 516-543): a **stepped** shroud (round 1): its forward two thirds 14 mm under the drawn r 0.697, a 45 deg step at two thirds of its length, the lip ring at the drawn radius; the slot at x 530 on the forward part, following the shroud; its inner wall glowing cyan (fading to the lip), six stator spokes (BACK), a five-bladed rotor behind them (mine; moving). A slim skeg blade under the keel (its root no longer reads as a plate from behind), a dorsal ridge, stubby stern fins on mount plates, the two small slanted bilge plates BACK draws. - **Docking collar** (the sheet's top ring, SIDE x 753.4): it *is* the Kazah collar. The clamp axis at (0, -0.09); in the four claw pockets (45/135/225/315 deg, full depth +-13.5 deg) the wall is the Kazah profile (wall r 0.535, hook lip r 0.552, lip top z 1.375); an 8 deg chamfer each side down into each pocket, the pockets dark (FrameDark), the cyan ring ending at each; between them the drawn wall and rim (rim r 0.553). The **hatch** (r 0.500, domed) inside it, a seat ring under its rim. - **Deck**: two lamp heads on short pylons, a boxy sensor on a stalk between them, the antenna aft of the collar (raked 23 deg, folds for docking). - **Nose**: the side windows and the big front window in thick dark frames (swept trims) with the heavy mullion, clear thick acrylic, the chin step; under it the **scanner drum** with four grooves round its body (SIDE's ribs), its face a faceted lens glowing blue, on the **mount** (round 1): a **solid bracket block** 0.30 m wide from the nose's underside to the drum flange's top, its aft face sloped, bolted to the flange; in each side plane (FRONT's side plates, +-0.577 m) the **bent tube** as SIDE draws it (8x zoom: one arm from the top bar down to the bend at y 460-466, the other up to the clevis at the flange's lower rear), **sled rails** from a plate on the cheek forward to the bend, hangers, the top bar, the cross tube, clamps; a small **lamp beside the drum's face** on its lower rim each side (the concept's lamp at picture (703, 358)). Cheek fins. - **Pods** (round 1): straight **nacelles** on their axis (+-1.017 m, z -1.382), r 0.333 at their fullest, the drawn taper aft. The middle is part of the hull grid (joined by two rolling-ball fillets); the **nose** (SIDE's rounded bottom outline, a dark bezel and a warm-white lamp) and the **tail cone** are revolves of their own, each starting with a dark lip ring. The tail cone steps in at BACK's rings (r 15, 11, 8 px) and ends in a cap r 5 px: from behind, four concentric circles on the pod's axis as BACK draws them; aft of x 747 it hangs clear of the hull. TOP's two vents and the raised capsule on each pod's upper outer side (on the nacelle's body between the tail cone and the nose). - **Side doors** (both flanks, in the band): rounded rectangles 0.99 x 1.20 m with a deep **smoked** porthole and two **oval** latches, hinged at the aft edge on **flush** knuckles (r 11 mm, axis 4 mm outside the leaf, inside the band's recess); behind each leaf a door stop ring. - **Flank details**: a fill port, three slots and dots aft of the door, a flat trace panel in front of it (the hull's finish). - **Cabin** (SECTION A-A top right): two **bucket seats** side by side at X +-0.45 (pan and back lofted with raised side bolsters, a winged headrest on two posts, armrests, the outboard one with a control pad and a side stick), the **console column** between them with the **two-pad control box** (a pad angled to each seat), **screen banks** along the bottom of the front glass (three per pilot and one in the middle) and of each side window, **overhead screens** twice the area they had (status displays on their forward faces too), the centre overhead screen on the column, wall panels, **cyan ceiling glow strips**, a ladder under the hatch, the deck at z -1.198 inside a lining 113 mm under the skin. No figures. ## Markings (the concept's style, the sheet's places and sizes) Mesh decals, `SM_Grouper_Decals`: copies of the hull's outer skin faces under each marking, lifted 1.5 mm, with the hull's shading normals and UV0 into the decal sheet (Unreal: Masked, opacity = alpha; cast no shadow; no collision). On both flanks, each reading from its own side, projected the way SIDE sees them (along X): **"Subtub 1"** (title case italic sans, light grey paint, the sheet's box x 725-790), a **generic striped insignia** (no national flag), a **generic round seal** with a cyan circuit emblem (no text, no official mark), a small **UI panel** forward of each stern fin, and the small insignia on the upper stern where BACK points. **Circuit traces** (round 1): drawn as vector polylines (`build/gr_decals_draw.py` TRACES: 10 mm lines, right-angle and 45 deg bends, 20 mm end dots) in the concept's zones: in front of the door (on the trace panel and the band under it, down toward the pod), round the vents and the panel aft of the door, down the cheek under the side window's aft corner; baked into the exterior emissive map by side projection. The first delivery projected the sheet's own strokes. ## Size, scale and axes - **7.45 m long** (duct lip to scanner face), **2.72 m wide** over the pods (hull 2.44 m), **3.11 m** from the keel (z -1.73) to the collar's lip (z 1.375); 3.56 m to the antenna tip raised, 3.15 m with it folded. - Scale 0.0171 m per sheet pixel: the sheet's top ring is the Kazah collar at this scale. **The sheet's largest dimension label says 15,500 mm**; its labels disagree with each other (10.4 to 36.5 mm/px) and with the drawing's own proportions (length to width 3.0 as drawn, 5.5 as labelled); the concept's pilots agree with 17 mm/px. The moon pool passes at this scale. - As the Kazah: 1 unit = 1 m, nose to -Y, port +X, Z up; origin on the centre line 9 cm behind the clamp axis. - Unreal: FBX forward -Y, up Z, import with Force Front X Axis, Convert Scene, scale 1; `ue_cm = (-y, -x, z) * 100` (nose +X). ## How it follows the sheet and the concept - Every number read from the sheet in pixels (`build/gr_measure.py`, the Designer's zooms, line runs, circle fits, masks). - `previews/compare/cmp_.png`: the model's silhouette against the Designer's sheet silhouettes, overlap (IoU); the numbers are in `build/checks/compare.json` and in "Round 1" below. `side_inkover.png`: the sheet's own lines over the side render. - `concept_pair.png`: the concept's camera fitted to 13 of the sub's landmarks (`build/gr_concept_fit.py`); the lamp beside the drum is now a landmark of its own (it was mistaken for the far pod's lamp). ## Where the views disagree, and what was chosen The Designer's table (`design/DESIGN.md` section 4) holds, among others: SIDE's collar place over TOP's; six stator spokes as BACK draws them; the seats at +-0.45 m so each pilot sees straight out of the front window; the concept's dark gunmetal over "titanium-ceramic"; the waist rims as grooves with light lines; the deck square as a sensor box; lamps in the pods' fronts; the drum face a glowing faceted lens; the collar 3 cm taller than drawn so the claws clear the hull by 5.3 cm. Also: BOTTOM's two "SUBTUB 1" rows are the flank lettering of both sides; the flag and the seal are generic. Round 1 added: the drum mount's two arms follow SIDE's 8x zoom (21 and 35 deg, not quite parallel, as drawn); TOP's pod vents start forward of the tail cone's lip ring (TOP draws the long one from x 737, where the drawn taper is only 0.11 m) and the short one ends at the nose's lip ring. ## Added for the game (not on the sheet) The rotor, the hatch's and the doors' hinges, the antenna's fold, the cabin's interior detail (the screens' forward-facing status displays, the glow strips), the door stops and the hatch seat (no line of sight through the gaps), the lamps beside the drum (the concept's), 14 sockets (`SOCKET_DrumLamp_L/R` new). ## Checks (scripts in `build/`, results in `build/checks/`; `sh build/run_checks.sh`) | check | result | limit or comparison | |---|---|---| | moon pool at BOARD (launch arm, the interior fork's deck well) | **1.457 m** from the well's lip | the user's 1 m (Kazah 1.206 m) | | carousel sweep, three stowed Tenders, 2 deg steps (margins table) | side **0.836 m**, roof 1.21 m (antenna raised: roof 0.789 m) | no contact (Kazah: side 0.366, roof 1.114) | | carousel sweep with triangles, 360 placements, 63 ship meshes | 0 crossings; no ship face within 0.6 m (both antenna poses) | | | docking clamp, `DockArm_Carousel.blend`, 86 poses (lowered 0..5.3 m, claws shut, open and part-way, reach_in to POOL, both headings) | **0 intersections**, least 5 mm (claws to the collar's lip, gaps both ways); antenna raised: hose 73 mm | | | docking clamp, ship file, the three `_Tender` places | 0 intersections, least 5 mm | | | BOARD to POOL descent, 9 steps | 0 crossings, least 1.301 m to the ship; arm 7.2 mm (claws) | | | hatch 0..100 deg, 2.5 deg steps | 0 intersections, least 4.1 mm | | | doors 0..95 deg, 2.5 deg steps | 0 intersections, least 3.0 / 3.0 mm | | | antenna 0..70 deg | 0 intersections, least 6 mm | | | rotor through one blade pitch | 0 intersections, least 4.9 mm | | | cabin inside the skin | 0 crossings, least 9.1 mm; **0 cabin vertices seen from outside** | | | seats' view | both eyes straight ahead through the front glass; 52.3 % of the view cone (yaw +-40, pitch -25..+15) through glass | half | | drivers | every driver a simple expression, valid (5 movers, light drivers on the glowing materials) | the user's Blender runs no Python | | clash audit | 160 pieces in the hull mesh; 147 part-to-part contacts, all intended seatings (lens ribs, clamps, hinge parts, vent rims, the pods' pieces on the lobe) | | | fold audit (`checks/folds.json`) | **0 quads folded > 90 deg** (was 26); over 25 deg 254 (was 432), over 20 deg 349 of 23,661; on the skin grid alone 176 / 242 of 8,714 | the critique asked for under 20 deg: not met, see Open | ## Moving parts (own objects, origin on the axis, rotation 0, scale 1; drivers on `Grouper_Root`) | object | moves | handle | |---|---|---| | `SM_Grouper_Hatch` | about Blender X (Unreal Y) at its forward edge (0, -0.59, 1.392), 0..100 deg, lifting its aft edge | `hatch_open_deg` | | `SM_Grouper_Door_L` / `_R` | about a vertical axis at the aft edge 4 mm outside the leaf (+-1.191, 0.157, -0.151), 0..95 deg, outward | `door_l_deg`, `door_r_deg` | | `SM_Grouper_Rotor` | spins about Blender Y (Unreal X) at (0, 3.696, -0.076) | `rotor_turns` | | `SM_Grouper_Antenna` | folds aft about Blender X at its foot (0, 0.712, 1.260), 0 (as drawn) .. 70 deg; **fold it (70) for docking** | `antenna_fold_deg` | | emission | every glowing material's strength = map x strength x lights | `lights` (0 off .. 1 on) | Drivers are simple expressions (`p*0.0174533`, `lights * 3.00`, ...). The exact pivots are in `Grouper_layout.json`. ## Meshes and materials - Triangles (LOD0): `SM_Grouper_Hull` 47,322 (quads only, no triangles: the skin grid with the duct's rings and the chin's cap 17.4k, the collar, trims, sleeves, stops, every static fitting; hidden faces pruned), `SM_Grouper_Glass` 816, `SM_Grouper_Cabin` 9,590, `SM_Grouper_Decals` 498, `SM_Grouper_Hatch` 1,900, `SM_Grouper_Door_L` / `_R` 1,736 each, `SM_Grouper_Rotor` 940, `SM_Grouper_Antenna` 172; the exterior about 55k. LOD1 / LOD2: hull 23,661 / 9,450, glass 408 / 163, doors 868 / 346, hatch 950 / 380, rotor 470 / 188 (`previews/lods_hull.png`). No n-gons, no booleans, no sliver faces (the nose's flat front and the cabin's end walls are Coons grids). Custom normals on the skin from the analytic surface. 29 convex `UCX_SM_Grouper_Hull_NN` (2,704 triangles), collection hidden. - UV0 `UVMap`: the hull alone on the 4096 Exterior atlas, **304 px/m** (was 239; its skin one arc-length island the build writes, `UV_Grid`, kept in the .blend for reruns of the surfaces pass and left out of the FBX); doors 510, hatch 586, glass 244, rotor 426, antenna 767 px/m on the 2048 Parts atlas; the cabin 246 px/m on its 2048 atlas; the screens map onto `T_Grouper_Screens`, the decals onto the decal sheet. UV1 `UV_Tile`: metres, for the tiling sets. - Baked (Cycles, HIP GPU): Masks (R occlusion, G edges, B crevices and the seam lines), BevelNormal (edges rounded 12 mm, seams as grooves), and Emissive for the Exterior and Parts atlases: the **light lines** (a 28 mm line along the middle of each groove floor, the collar's ring and the duct's ring, from the build's `strip_v` / `strip_w` vertex fields), the circuit traces, the duct's inner glow, the lamps and the scanner's crystal cells. - Materials (the concept's look; the user's Season 2 pack sets read in place from `models/vessel-interior/textures`, nothing downloaded): `M_Grouper_Gunmetal` (dark **satin** gunmetal over ScratchedMetal: clear coat 0.06 at roughness 0.32, base roughness 0.38-0.46, tint about 0.08; worn bare edges, dark crevices), `_Band` (darker, BrushedMetal), `_FrameDark` (near-black titanium, StainedSteel tiled 0.30 m with its contrast flattened), `_Steel`, `_Recess`, `_Acrylic` (clear thick acrylic, IOR 1.49), `_AcrylicDark` (the porthole, smoked), `_Strip` (dark satin floor), `_DuctGlow`, `_LampWhite`, `_ScannerLens`, `_Marking` (decals), cabin `_Cabin`, `_CabinFloor`, `_CabinDark`, `_Seat` (CC0 leather, dark), `_Screen` (cyan instruments on a lit cyan ground, drawn as a texture), `_CabinGlow` (dim cyan); `M_Grouper_Part*` and `M_Grouper_Cabin*` copies where a material is used on two atlases. Emission strengths x lights: traces 2.5, strips 3, duct 1.5, lamps 8, lens 3, screens 5, cabin glow 3, decals 2.5. ## Build Headless, one Blender at a time: `sh build/run_all.sh r1 128` (a new file every time, every check, the drawn decal sheet and trace mask, the surfaces pass, landmarks and the concept camera, export with LODs, Cycles pictures, wireframes, comparison sheets). Steps: `build/run_build_headless.py` (`build_grouper.py`: `gr_shape`, `gr_hull`, `gr_parts`, `gr_clamp`, `gr_fittings`, `gr_doors`, `gr_cabin`, `gr_finish` with `gr_collision`), `run_checks.sh`, `gr_decals_draw.py` (Python + Pillow), `gr_surfaces.py`, `gr_landmarks.py` + `gr_concept_fit.py`, `gr_export.py`, `gr_render.py -- TAG SAMPLES studio water concept lookalike`, `gr_preview.py -- wire tag=TAG`, `gr_pairs.py`, `gr_lods_preview.py`. While working on the geometry: `sh build/gr_quick.sh TAG` (build, fold audit, wireframes). The ship and docking-arm files are opened read-only by the checks and never saved. ## Round 1 (2026-10-22): what changed | item | what was done | |---|---| | M1 drum mount | a solid bracket block (0.30 m wide, SIDE x 876-923, y 397-416.5, aft face sloped, four bolts a side) instead of the thin upper arms; the bent tubes re-read from an 8x zoom of SIDE; sled rails on a cheek plate; hangers | | M2 topology | 72 columns x 103 stations (was 144 x 161); free columns smoothed along the hull, station pairs kept consistent, the relaxing pins faded at the nose's front; groove walls 8 mm, frame band chamfers 30 mm; the lower groove rides the nacelle's own circle; the chin's front and the cabin's end walls Coons grids (no slivers); the collar 6 deg steps with 8 deg pocket chamfers; folds 0 (was 26); hull 47.3k triangles, quads only (was 86.1k); LOD1 and LOD2 | | M3 pods | straight nacelles; nose and ringed tail cone as revolves; the grid's lobe sinks only inside them | | M4 traces | vector polylines in the concept's zones (no sheet pixels); the trace panel in the hull's finish | | M5 strips | only a 28 mm line glows in each groove floor and on the duct's and collar's rings; strength 3 (was 4 on the whole floor) | | M6 windows | screen banks at the bottom of the front and side glass, overhead screens twice the area with status displays on their fronts, a console front screen, cyan UI (no amber) on a lit ground, ceiling glow strips; screens strength 5 | | M7 seats | bucket seats with bolsters, winged headrests, armrests with a control pad and side stick; the console's two-pad control box; the centre overhead screen on the column | | m1 | satin gunmetal (coat 0.06 at 0.32, roughness 0.38-0.46, tint 0.08) | | m2 | StainedSteel on the frames tiled 0.30 m, contrast 0.97-1.03 | | m3 | the porthole smoked (`M_Grouper_AcrylicDark`) | | m4 | a lamp beside the drum's face on its lower rim each side (r 0.505, 26 deg below the side), placed with the fitted camera: its ray through the concept's lamp crosses the face plane inside the rim, so a lamp further aft would be hidden by the drum | | m5 | four grooves round the drum body | | m6 | the stepped duct | | m7 | dark chamfered claw pockets, the ring ending at each | | m8 | the skeg's root slimmed (6 px half width, was 17) | | m9 | oval latches; flush hinges | | m10 | hidden faces pruned: fittings deeper than 15 mm under the actual skin, the grid under the pods' pieces and the collar | | m11 | the hull's own 4096 atlas, its skin an arc-length island: 304 px/m | | m12 | the scale note above (and in the report) | Also: TOP's pod vents and raised capsule built (the first README listed them, the model had none); the decal sheet square (2048 x 2048, pad 0.26 m: the coarser hull faces under the decals reach further). ## Open - **Twists**: no folds, but 254 quads twist more than 25 deg (349 more than 20, of 23,661): the window frame band's chamfered corners, the pod where the lower groove plunges across it, the pods' tail fairing where the lobe sinks into the hull (x 745-762), the grooves' corners where the upper groove turns over the nose, the duct ring's join; 176 of them on the skin grid. The critique asked for under 20 deg. - **Triangles**: the hull is 47.3k at LOD0 (the critique's target was about 35k for the whole exterior; the exterior is about 55k): the skin grid with the duct rings is 17.4k, the rest is the drawn fittings (collar 3.1k, drum 2.2k, window and door trims, pod pieces, cradle, vents). LOD1 23.7k and LOD2 9.5k exist. - **The front window from the concept's camera** reads darker than the side window: every screen faces the pilots, i.e. away from a camera ahead of the Tender; the side window shows lit screens. - Not in Unreal; no import script or actor. The Kazah's axes, so the Kazah's path can be used. - My additions (rotor, hinges, antenna fold, door stops, hatch seat, cabin detail, the lamps beside the drum, UI panel decals) wait for the user's word. "Grouper" is a working name; "Subtub 1" is the sheet's own lettering.