# 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). ## 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/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, the concept camera (Unreal cm: `ue = (-y, -x, z) * 100`) | | `textures/` | `T_Grouper_Exterior_Masks` / `_BevelNormal` / `_Emissive` (4096), `T_Grouper_Cabin_Masks` / `_BevelNormal` (2048), `T_Grouper_Decals_BaseColor` (RGBA) / `_Emissive` (2048 x 1024), `T_Grouper_Screens`; `_src/` the trace mask and a decal preview | | `previews/v01_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/v01_water_nose.png`, `v01_water_stern.png` | underwater, lights on | | `previews/v01_topo_*.png` | wireframes over the shading (Workbench); `wb_*`, `topo_*` and `compare/sheet_*.png` are the build step's (before the surfaces) | | `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 | | `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) | | `build/` | the scripts (below); `checks/` every check's result | ## What it is, part by part (SIDE first) - **Hull**: one quad grid (161 stations x 144 columns) 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. An hourglass **waist band** along each flank, recessed 30 mm, between two **grooves** (the sheet's double rim lines) whose floors carry the concept's **cyan light strips**; the upper groove runs on over the side window's frame and across the nose top, the lower one curves down to the belly. A chine on the upper aft body, a belly seam (both baked as seam grooves). - **Stern duct** (SIDE x 516-543): a shroud r 0.697 m, its inner wall glowing cyan (fading to the lip), six stator spokes (BACK), a five-bladed rotor behind them (mine; moving). A skeg under the keel, a dorsal ridge, stubby stern fins on mount plates. - **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, +-16 deg) the wall is the Kazah profile (wall r 0.535, hook lip r 0.552, lip top z 1.375); between them the drawn wall and rim with the concept's cyan ring. The **hatch** (r 0.500, domed) inside it; under its rim a seat ring (below). - **Deck**: two lamp heads on short pylons (the sheet's "Battery Access Hatch" hump; the concept's bright lamps), 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** on its cradle (upper arms, bent U tubes, rails, cross tube), its face a faceted lens (a central hexagon, cells round it) glowing blue; cheek fins. - **Pods**: a teardrop nacelle on each lower corner, sunk into the hull with a fillet; a warm-white lamp in a dark bezel at each front end (the concept), vents and a capsule on top. - **Side doors** (both flanks, in the band): rounded rectangles 0.99 x 1.20 m with a deep porthole and two latches, hinged at the aft edge outside the skin; behind each leaf a door stop (below). - **Flank details**: a fill port, three slots and dots aft of the door, a flat trace panel in front of it. - **Cabin** (SECTION A-A top right): two seats side by side at X +-0.45 (so each eye looks straight out through the front window), a console column between them with a control box, overhead screens, wall panels, 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 as the concept writes it, light grey paint, in the sheet's box (x 725-790, 1.11 x 0.31 m). - a **generic striped insignia** in the flag's box (x 684-716): diagonal muted-red and light-grey bands, a navy canton with a white chevron (no national flag); - a **generic round seal** (x 697, y 347, r 10 px): a geared ring, a navy disc, a cyan circuit-tree emblem (glows; no text, no official mark); - one small **UI panel** (cyan outline, bars) on the band forward of each stern fin (the concept's panel decals near the stern); - the small insignia on the upper stern to starboard of the ridge where BACK's "Insignia (Flag)" points (projected along the surface's normal there). TOP draws the starboard lettering on the shoulder where these land (`lookalike.png`, TOP row). ## Size, scale and axes - **7.45 m long** (duct lip to scanner face), **2.70 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 (the hatch dome, z 1.417). - Scale 0.0171 m per sheet pixel: the sheet's top ring is the Kazah collar at this scale (the sheet's dimension labels disagree with each other, 10.4 to 36.5 mm/px; the concept's pilots agree with 17 mm/px). The moon pool passes at this scale (below), so the scale is unchanged. - 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): **SIDE 0.938, TOP 0.948, FRONT 0.959, BACK 0.951, BOTTOM 0.864** (BOTTOM is the sheet's near copy of TOP, drawn wider; the Designer used it only for centre-line parts). `side_inkover.png`: the sheet's own lines over the model's side render. - `concept_pair.png`: the concept's camera fitted to 13 of the sub's landmarks (lamps, drum face, porthole, windows, markings, duct, collar; `build/gr_concept_fit.py`, Levenberg-Marquardt with a pull toward a normal lens): 35.8 mm lens, **rms 9.0 px over the main landmarks**, 23.5 px over all (the far pod lamp and the duct's lip are where the AI picture's own proportions differ from the sheet's). The model rendered from it in dark water with the lights on, beside the concept's crop. ## 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 (a five-bladed rotor behind); the seats at +-0.45 m so each pilot sees straight out of the front window; the concept's dark gunmetal over "titanium-ceramic" read as light; the waist rims as grooves with strips; the lines before the door as circuit traces; the deck square as a sensor box; lamps in the pods' front faces; the drum face a glowing faceted lens; the collar built 3 cm taller than drawn so the claws clear the hull by 5.3 cm. Added in this step: - **BOTTOM's two "SUBTUB 1" rows** are read as the flank lettering of both sides (the Designer's reading): at BOTTOM's plan places the model's pods hang, so there is no belly lettering. - **The flag and the seal** are generic (no national flag, no official seal); the insignia's bands run diagonally so it reads as a patch, not a flag. ## Added for the game (not on the sheet) The rotor, the hatch's hinge and the doors' hinges, the antenna's fold, the cabin's interior detail, the **door stops** (a ring inside each doorway's sleeve 8 mm behind the leaf, so no line of sight runs through the 8 mm gap round the leaf into the cabin: the side render saw through both doors' gaps) and the **hatch seat** (a ring round the bore 8 mm under the lid, for the 6.7 mm gap round the hatch), 12 sockets. ## 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.455 m** from the well's lip (the duct's flank) | the user's 1 m (Kazah 1.206 m) | | carousel sweep, three stowed Tenders, 2 deg steps (margins table) | side **0.834 m**, roof 1.207 m (antenna raised: roof 0.786 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 2.34 to POOL 9.3 m, both headings) | **0 intersections**, least 5 mm (claws to the collar's lip, gaps both ways); antenna folded: hose 455 mm; raised: 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.337 m to the ship; arm 7.3 mm (claws) | | | hatch 0..100 deg, 2.5 deg steps | 0 intersections, least 4.7 mm | | | doors 0..95 deg, 2.5 deg steps | 0 intersections, least 3.1 / 3.2 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, 0 vertices within 5 mm (least 11.8 mm); **0 cabin vertices seen from outside** (was 8 before the door stops and the hatch seat) | | | seats' view | both eyes straight ahead through the front glass; 51 % of the view cone (yaw +-40, pitch -25..+15) through glass | half | | drivers | every driver a simple expression, valid (5 movers, 9 light drivers on materials) | the user's Blender runs no Python | | clash audit | 137 pieces; contacts all intended joints (pylons into lamp heads, parts seated in the skin, the stops in their sleeves) | | | fold audit | **26 quads folded > 90 deg** (pod nose tips, the front glass trim's lower corners, 2 at the stern); 432 twisted > 25 deg | 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 outside the skin (+-1.203, 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 * 4.00`, ...). ## Meshes and materials - Triangles: `SM_Grouper_Hull` 86,148 (43,073 quads + 2 triangles; skin, collar, trims, sleeves, stops, every static fitting), `SM_Grouper_Glass` 2,136, `SM_Grouper_Cabin` 11,887 (3 triangles), `SM_Grouper_Decals` 1,658, `SM_Grouper_Hatch` 2,316, `SM_Grouper_Door_L` / `_R` 2,376 each, `SM_Grouper_Rotor` 940, `SM_Grouper_Antenna` 172. No n-gons, no booleans. Custom normals on the skin from the analytic surface. 29 convex `UCX_SM_Grouper_Hull_NN` (2,762 triangles), collection hidden. No LODs. - Two UV layers on every mesh: `UVMap` (UV0: each part's square of its atlas; exterior 4096 px: hull 239 px/m, doors 284-294, glass 348, hatch 341, rotor 510, antenna 599; cabin 2048 px: 247 px/m; the screens map onto `T_Grouper_Screens`, the decals onto the decal sheet) and `UV_Tile` (UV1, 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 for the exterior an **Emissive** map: the strips (groove floors, collar ring, duct ring), the circuit traces (the sheet's own lines in the Designer's four zones, projected onto both flanks: in front of the door, round the vents aft of it, down the cheek), 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 gunmetal satin metal over ScratchedMetal, clear coat, worn bare edges, dark crevices), `_Band` (darker, BrushedMetal), `_FrameDark` (near-black titanium, StainedSteel), `_Steel`, `_Recess`, `_Acrylic` (clear thick acrylic, IOR 1.49, the Glass set's dirt), `_Strip`, `_DuctGlow`, `_LampWhite`, `_ScannerLens` (glowing), `_Marking` (decals), cabin `_Cabin`, `_CabinFloor` (FloorPanel_A), `_CabinDark`, `_Seat` (the CC0 leather of the captain's quarters, dark), `_Screen` (cyan instruments drawn as a texture). Emission strengths x lights: traces 2.5, strips 4, duct 1.5, lamps 8, lens 3, screens 2.2, decals 2.5. ## Build Headless, one Blender at a time: `sh build/run_all.sh v01 128` (build in place, every check, the drawn decal sheet and trace mask, the surfaces pass, landmarks and the concept camera, export, 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`. A geometry rebuild always needs the surfaces pass again (it replaces the meshes, their UVs and the decal mesh). The ship and docking-arm files are opened read-only by the checks and never saved. ## Open - **Topology**: 26 quads folded more than 90 deg (10 at the pods' nose tips, 14 inside the lower corners of the front glass's trim, 2 at the stern) and 432 twisted more than 25 deg; the column flow is wavy where the band's front, the frame's corner, the pod's nose and the cheek fin meet (SIDE x 836-850), with shading smears there and on the pod tops ahead of the door. - The pods' tail cones bend in toward the hull: BACK draws them concentric, free of the hull. - The hull is heavy for a game asset (86k triangles) and has no LODs. The hull's atlas fill is 38 % (many thin trim islands). - The stator has six spokes (BACK); the first reading said five. - 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, UI panel decals) wait for the user's word. - "Grouper" is a working name; "Subtub 1" is the sheet's own lettering.