# Mako Tender: the user's reference sheet measured (exec'd by build_mako.py; plain Python, no bpy). # # Source: reference/user_reference.webp (1448 x 1086 px: TOP, FRONT, SIDE, REAR), sent 2026-10-20 with "can you create me a 3d # tender model that can be usable as an real asset in the descent vessel. try to create similiar from that referance picture. # red line indicates where the the arm holder clips place so arms can hold the sub tub." Every number below is a pixel read # off the original picture: colour runs per column (build/mk_runs.py, classes in reference/classes.png) and zooms with rulers # (reference/z_*.png). TOP and SIDE share their image x (nose tip x 42, orange tail end x 888, tool cluster to x 952); SIDE # heights are image y (down = larger), TOP lateral offsets are px from its centre line (image y 267). # # Scale and axes (the Kazah's: nose to -Y, port +X, Z up, origin 9 cm behind the docking clamp's axis): # * the clamp axis is the centre of the user's red loop in the TOP view, image x 292 (over the canopy's rear and the collar); # the origin 9 cm behind it is image x 304; # * S = 0.0075 m per pixel: the largest scale at which the whole Tender, fins and stern tools included, stays 1 m inside # the deck well at BOARD (the user's limit since the Manta). The well is an oval 6.3 x 12.3 m centred on the origin # (checks/well_tender_frame.json); at 7.6 mm/px the fin tips and the tool cluster come within 1 m. 6.8 m long overall; # * height (v03): the hull top at the clamp axis (image y 672) at z 1.10, 10 cm higher on the arm than v02, so the holder # clips can be short: the aft pair sits on the collar, the fore pair on short posts on the canopy's two top frame bars. # The docking head's claws never come below z 1.213 (shut: r 0.558-0.693, about 10 deg either side of each diagonal; # open: r 0.61-0.79) and its landing feet stay at z 1.405 (r 0.41-0.53): build/probe_head.py, checks/head_parts.json. # # The FRONT and REAR views are drawn about 1.4x larger than TOP/SIDE for the body but not for the fins (an AI-drawn sheet): # they give section shapes and the fins' droop (about 60 deg below level), not sizes. Where views disagree, the choice: # * big fins: TOP puts the tips at image x 711, SIDE at x 600: built at x 640, lateral and height from TOP and SIDE; # * canopy (v03, the user: "fix the glass"): glass from the nose right to the collar, as all four views draw it, with the # frames TOP and SIDE show (an arc across the front, two bars over the top, a belt along each side, a nose seam). v02's # orange hood over the top-rear is gone; the clips stand on the collar and on the two top bars instead; # * behind the collar (v03): TOP draws a narrow orange roof, a black intake slot either side and the grey pods outboard; # REAR draws the pods as big round nozzles under the roof's shoulders. So the hull narrows behind the collar and the pods # are big side bodies standing off it, the slot between them; # * the hatch (v03) is on the back behind the dorsal fin (the glass is under the clips now). S = 0.0075 X0 = 304.0 # image x of the origin (clamp axis at 292) Z0 = 805.333 # image y of z = 0 (672 -> 1.00) CL_IMG = 292.0 # clamp axis TOP_CY = 267.0 # TOP view centre line (image y) def Yi(x): return (x - X0) * S DZ = 0.10 # v03: the whole Tender 10 cm higher on the arm (see the header) def Zi(v): return (Z0 - v) * S + DZ def Lp(px): return px * S X_TIP, X_STERN = 42.0, 884.0 # nose point; the hull grid ends here (the stern housing and tools go on to x 952) # ---- hull silhouette: SIDE top line, SIDE keel line (image y), TOP half width (px), fins and fittings left out TOPY = [(42, 790), (50, 784), (60, 780), (70, 775), (80, 768), (90, 761), (100, 754), (110, 747), (120, 741), (130, 736), (140, 731), (150, 727), (160, 722), (170, 718), (180, 714), (190, 709), (200, 705), (210, 700), (220, 696), (230, 692), (240, 689), (250, 686), (260, 683), (270, 679), (280, 676), (290, 674), (300, 672), (320, 669), (340, 667), (360, 664), (380, 659), (400, 655), (420, 652), (440, 651), (460, 652), (480, 656), (500, 661), (520, 667), (540, 673), (560, 680), (580, 686), (600, 692), (620, 698), (640, 704), (660, 709), (680, 714), (700, 719), (720, 724), (740, 729), (760, 734), (780, 738), (800, 742), (820, 746), (840, 749), (860, 752), (884, 756)] BOTY = [(42, 790), (50, 798), (60, 806), (70, 813), (80, 820), (90, 827), (100, 834), (110, 841), (120, 848), (130, 856), (140, 865), (160, 880), (180, 895), (200, 909), (220, 924), (240, 938), (260, 948), (280, 954), (300, 957), (320, 958), (340, 957), (360, 956), (380, 954), (400, 950), (420, 940), (440, 918), (460, 898), (480, 883), (500, 872), (520, 863), (540, 856), (560, 851), (580, 847), (600, 845), (650, 844), (700, 845), (750, 848), (800, 852), (840, 854), (870, 853), (884, 851)] WPX = [(42, 0.0), (50, 9), (60, 17), (70, 26), (80, 35), (90, 44), (100, 52), (110, 59), (120, 65), (130, 71), (140, 76), (150, 80), (160, 85), (170, 89), (180, 93), (190, 98), (200, 103), (210, 107), (220, 111), (230, 114), (240, 116), (250, 118), (260, 120), (270, 121), (280, 122), (290, 121), (300, 120), (320, 118), (340, 115), (352, 104), (364, 90), (378, 80), (400, 76), (430, 75), (460, 76), (490, 78), (520, 79), (545, 78), (565, 76), (585, 72), (600, 68), (625, 62), (650, 58), (675, 55), (700, 52), (725, 49), (750, 46), (775, 42), (800, 38), (825, 34), (850, 31), (870, 28), (884, 26)] # v03: narrowed behind the collar (352-585) to the roof and lower body; the pods stand off it # widest line, as a fraction of the section's height from the top (canopy: the dome's centre; aft: the shell's lower edge) ZMFRAC = [(42, 0.50), (100, 0.47), (130, 0.42), (160, 0.36), (200, 0.32), (240, 0.28), (280, 0.25), (320, 0.25), (400, 0.29), (500, 0.31), (600, 0.31), (800, 0.35), (884, 0.40)] # ---- canopy (SIDE outline of the glass's lower edge), collar, frames on the glass CHIN = [(140, 853), (150, 851), (175, 843), (200, 836), (225, 830), (250, 827), (275, 826), (300, 826)] # v03: the sill, read # where the jaw's orange starts (x 150: 860, 200: 848, 250: 839, 300: 837) less its dark band; v02 had taken the dark cockpit # drawn inside the glass for the glass's edge and put the edge up to 15 cm too high X_JAW = 140.0 # the jaw's front: ahead of it the glass wraps the whole nose X_COL0, X_COL1 = 292.0, 350.0 # the collar ring round the canopy's back (TOP: 285-350 at the sides, 300-352 on top) COLLAR_H = 0.070 # it stands 7 cm proud, a thick ring, with 45 deg chamfers front and back HOOP = dict(cx=228.0, r=103.0) # TOP: the frame arc across the canopy is a circle in plan, centre image x 228, r 103 px MERIDIAN_LAT = 54.0 # TOP: two bars over the top, px either side of the centre line, from the arc to the collar BELT_X0 = 92.0 # SIDE: the belt along the widest line, from image x 92 to the collar NOSE_SEAM = (58.0, 126.0) # TOP: the seam along the centre line from near the point to the arc # the orange shell's lower edge aft of the collar (SIDE image y) SHELL = [(345, 708), (380, 709), (410, 714), (440, 727), (470, 740), (520, 743), (600, 741), (700, 745), (800, 755), (884, 763)] # rear bay's side window (SIDE outline) SIDEWIN = [(668, 793), (670, 778), (680, 769), (780, 769), (790, 778), (792, 793), (790, 809), (780, 818), (680, 818), (670, 809)] # v03: SIDE x 668-792, y 768-818, the long framed window in the rear side panel SIDE_PANEL = (498.0, 846.0, 762.0, 846.0, 18.0) # SIDE: the rear hull's recessed side panel: x0, x1, y0, y1, corner r (px) WIN_MULLIONS = (708.0, 750.0) # SIDE: the window's two frame posts # ---- jaw: the two curved grooves between its slats, and the slats' two prongs (SIDE) GROOVES = [[(209, 862), (204, 880), (212, 896), (236, 915), (262, 932)], [(263, 853), (256, 872), (259, 890), (276, 910), (292, 924)]] PRONG = ((249.0, 932.0), (302.0, 983.0), 0.165) # one fang a side: root, tip (SIDE, the two drawn lines averaged), lateral m (FRONT 1163/1210) KEEL_TOOTH = (250.0, 302.0, 0.10) # FRONT: a dark blade under the jaw's centre (1180-1195, 445-485): x from, to, depth m # ---- fins # big fins (v03): SIDE draws the root rising from front-low under the canopy (300-316, 830-835) to rear-high at the pod # (470-490, 737-748), a broad pale root panel, the trailing edge dropping almost straight (480-495, 780-905), then the spike # to the tip. TOP has the leading edge leave the pod at (435, 137 px) and the trailing edge root at (490, 99 px); FRONT has # the fins leave the pods' lower inner corners about 0.7 m out and droop about 60 deg. FIN_A = (316.0, 0.70, 834.0) # root, front: image x, lateral m, SIDE y FIN_B = (486.0, 0.82, 748.0) # root, rear FIN_K = (500.0, 905.0) # trailing edge kink: image x, SIDE y (on the fin's plane) FIN_TIP = (662.0, 229.0, 1043.0) # image x (TOP 711, SIDE 600: nearer TOP, the planform view), lateral px (TOP), SIDE image y # dorsal fin (SIDE): leading edge from its root to the tip, trailing edge from the tip down to its root DORSAL_LE = [(395, 654), (400, 646), (410, 635), (420, 627), (430, 617), (440, 607), (450, 597), (460, 589), (470, 580), (480, 573), (490, 565), (500, 559), (510, 555), (520, 551), (530, 548), (538, 547)] DORSAL_TE = [(538, 547), (540, 560), (541, 590), (542, 620), (544, 650), (546, 676)] TAIL_LE = [(822, 752), (825, 742), (830, 733), (835, 716), (840, 697), (845, 681), (850, 666), (855, 660), (860, 657)] TAIL_TE = [(860, 657), (865, 658), (870, 663), (875, 678), (880, 694), (885, 715), (890, 736), (895, 752)] VENTRAL = [(832, 852), (848, 880), (862, 915), (870, 943), (874, 925), (877, 880), (878, 852)] # LE root .. tip .. TE root # ---- side pods (v03): big water-jet bodies standing off the narrowed hull: SIDE 318-488 x 705-795 (front right behind the # collar, a dark intake on the front), TOP outer edge 140 px and a black slot along the top-inner side (x 330-435, 72-115 px), # REAR big round nozzles under the roof's shoulders, FRONT dark rounded fronts flanking the dome. POD = dict(x0=318.0, x1=488.0, lat=107.0, y=750.0, hw=33.0, hh=45.0) POD_SLOT = (332.0, 436.0) # the black slot along the pod's top-inner side (TOP), image x from, to BELLY = (510.0, 632.0, 40.0, 910.0) # x from, x to, half width px, bottom (SIDE image y) STERN_HOUSING = (880.0, 912.0) # x from, x to (the hull's last section continues into it) TOOL_TIPS = 950.0 # stowed manipulators reach image x 950 (moon pool limit 952) SEAMS_X = (352, 600, 730) # transverse panel seams (behind the collar, and two on the rear hull) # shell plates (TOP, v03): the dorsal spine strip from the collar to its point, and a transverse seam band between the front # and the rear plates (two curved lines), as polylines of (image x, lateral px) SPINE = [(352, 6.0), (400, 9.0), (450, 11.5), (490, 14.0), (515, 7.0), (560, 6.0), (600, 5.0), (614, 0.0)] PLATE_LINES = [[(412, 87.0), (432, 67.0), (437, 42.0), (441, 22.0), (445, 12.0)], [(468, 95.0), (480, 77.0), (483, 37.0), (487, 18.0), (492, 14.0)]] DORSAL_RIDGE = (352.0, 614.0, 0.070, 0.035) # the spine strip raised as a ridge: x from, to, half width m, height m HATCH_X = 642.0 # v03: the hatch on the back, behind the dorsal fin (image x of its centre)