# 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: the hull top at the clamp axis (image y 672) at z 1.00, so the claws (lowest z 1.24) pass 0.16 m or more # over the collar and the holder clips stand on a short saddle (disc top z 1.15, the Spearfish's interface). # # 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: TOP and SIDE show glass right to the collar at the top, but the user put the holder clips there: the canopy's # top-rear is an orange hood (it continues the hood the FRONT view draws over the dome) that carries the clamp saddle, # and the hatch is inside the clips, as on the Kazah's hatch collar; # * the orange top shell's lower edge follows the SIDE view; TOP draws it narrower than any convex hull allows. 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 def Zi(v): return (Z0 - v) * S 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, 116), (360, 114), (380, 112), (400, 110), (420, 107), (440, 104), (460, 100), (480, 96), (500, 92), (520, 88), (540, 84), (560, 79), (580, 74), (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)] # 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 and hood (SIDE outline of the glass's lower edge; hood edge as the angle above the widest line, deg) CHIN = [(140, 852), (150, 847), (175, 840), (200, 831), (225, 821), (250, 812), (275, 807), (300, 805)] X_JAW = 140.0 # the jaw's front: ahead of it the glass wraps the whole nose X_HOOD = 210.0 # the hood's front edge across the top HOOD_EDGE = [(210, 54.0), (230, 49.0), (250, 42.0), (270, 32.0), (290, 20.0), (300, 13.0)] X_COL0, X_COL1 = 300.0, 345.0 # the collar ring round the canopy's back # 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, 790), (671, 779), (684, 773), (765, 774), (777, 779), (780, 791), (776, 804), (762, 810), (684, 810), (671, 805)] # ---- 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)]] PRONGS = [((236, 930), (294, 990), 0.31), ((262, 934), (311, 976), 0.31)] # root, tip (SIDE), lateral m (FRONT: the outer slats) # ---- fins # big fins: root along the lower flank (SIDE), tip from TOP (lateral) and SIDE (height) FIN_LE_ROOT = (345.0, 833.0) FIN_TE_ROOT = (545.0, 870.0) FIN_TIP = (640.0, 229.0, 1043.0) # image x, 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 (water-jet nacelles: TOP outer edge, front view at mid-upper height), the belly pack, the stern POD = dict(x0=318.0, x1=566.0, lat=116.0, y=748.0, hw=24.0, hh=33.0) # lat 4 px out of the drawn 112: the intake clears the hull 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 = (345, 470, 600, 730) # transverse panel seams on the shell