import type { MachineDefinition } from '../types'; import { groupNode, hierarchy, makeMachine, makePart, primitive, standardCameraPresets, thumbnail, tourStep, } from './catalogueHelpers'; const ballBearingParts = [ makePart({ id: 'outer-race', name: 'Outer race', group: 'Races', description: 'Stationary or housing-mounted ring with a precision groove for rolling ball contact.', primitive: primitive('torus', { majorRadius: 0.64, tubeRadius: 0.08, groove: true, axis: 'z' }), position: [0, 0, 0], material: 'bearing-steel', explodedDirection: [0, 0, -0.85], }), makePart({ id: 'inner-race', name: 'Inner race', group: 'Races', description: 'Shaft-mounted ring with matching groove; rotates relative to the outer race.', primitive: primitive('torus', { majorRadius: 0.34, tubeRadius: 0.07, groove: true, axis: 'z' }), position: [0, 0, 0], material: 'machined-steel', explodedDirection: [0, 0, 0.85], }), makePart({ id: 'ball-set', name: 'Ball set', group: 'Rolling elements', description: 'Hardened balls roll between race grooves, reducing sliding friction to rolling contact.', primitive: primitive('sphere', { radius: 0.085, count: 10, orbitRadius: 0.49 }), position: [0, 0, 0], material: 'bearing-steel', explodedDirection: [0, 0.65, 0], }), makePart({ id: 'cage', name: 'Cage', group: 'Rolling elements', description: 'Separator maintains ball spacing and prevents contact between adjacent rolling elements.', primitive: primitive('torus', { majorRadius: 0.49, tubeRadius: 0.025, pockets: 10, axis: 'z' }), position: [0, 0, 0], material: 'brass', explodedDirection: [0, -0.65, 0], }), makePart({ id: 'grease', name: 'Grease film', group: 'Lubrication', description: 'Lubricant film reduces wear, carries heat, and protects against corrosion.', primitive: primitive('flow-path', { path: 'bearing-grease-film', fill: 'raceway', opacityGradient: true }), position: [0, 0, 0], material: 'oil-green', explodedDirection: [0.55, 0.35, 0.45], crossSectionBehavior: 'fluid', }), makePart({ id: 'seal-left', name: 'Left seal', group: 'Sealing', description: 'Rubber or metal shield retains lubricant and excludes contamination.', primitive: primitive('seal', { radius: 0.56, thickness: 0.035, axis: 'z' }), position: [0, 0, -0.08], material: 'rubber', explodedDirection: [0, 0, -1.15], }), makePart({ id: 'seal-right', name: 'Right seal', group: 'Sealing', description: 'Opposite-side seal, shown separately for exploded inspection.', primitive: primitive('seal', { radius: 0.56, thickness: 0.035, axis: 'z' }), position: [0, 0, 0.08], material: 'rubber', explodedDirection: [0, 0, 1.15], }), makePart({ id: 'load-vector', name: 'Load vector', group: 'Learning overlays', description: 'Arrow overlay showing radial load direction and distribution around the raceway.', primitive: primitive('annotation-plane', { width: 0.62, height: 0.18, text: 'radial load' }), position: [0, 0.88, 0], material: 'warm-highlight', explodedDirection: [0, 1.1, 0], crossSectionBehavior: 'hidden-when-clipped', }), makePart({ id: 'contact-patches', name: 'Contact patches', group: 'Learning overlays', description: 'Small highlights on loaded balls show Hertzian contact regions under load.', primitive: primitive('custom', { profile: 'bearing-contact-patches', count: 4 }), position: [0, 0.25, 0.06], material: 'blue-accent', explodedDirection: [0.45, 0.75, 0.25], crossSectionBehavior: 'hidden-when-clipped', }), ]; const rollerBearingParts = [ makePart({ id: 'outer-race', name: 'Outer race / cup', group: 'Races', description: 'Conical outer raceway that accepts combined radial and axial loads from tapered rollers.', primitive: primitive('torus', { majorRadius: 0.7, tubeRadius: 0.08, conicalGroove: true, axis: 'z' }), position: [0, 0, 0], material: 'bearing-steel', explodedDirection: [0, 0, -0.85], }), makePart({ id: 'inner-race', name: 'Inner race', group: 'Races', description: 'Shaft-mounted tapered inner race defining roller cone geometry.', primitive: primitive('torus', { majorRadius: 0.38, tubeRadius: 0.075, conicalGroove: true, axis: 'z' }), position: [0, 0, 0], material: 'machined-steel', explodedDirection: [0, 0, 0.85], }), makePart({ id: 'tapered-rollers', name: 'Tapered rollers', group: 'Rolling elements', description: 'Conical rollers whose apexes meet at a common point, allowing rolling contact under thrust load.', primitive: primitive('cylinder', { radiusTop: 0.065, radiusBottom: 0.095, depth: 0.34, count: 12, orbitRadius: 0.54, axis: 'tangent' }), position: [0, 0, 0], material: 'bearing-steel', explodedDirection: [0, 0.75, 0], }), makePart({ id: 'cage', name: 'Roller cage', group: 'Rolling elements', description: 'Separator keeps tapered rollers evenly spaced and aligned.', primitive: primitive('torus', { majorRadius: 0.54, tubeRadius: 0.025, pockets: 12, tapered: true, axis: 'z' }), position: [0, 0, 0], material: 'brass', explodedDirection: [0, -0.75, 0], }), makePart({ id: 'cone', name: 'Cone assembly', group: 'Races', description: 'Inner race and roller assembly often installed as the cone unit.', primitive: primitive('housing', { profile: 'bearing-cone-outline', radius: 0.52, taperDegrees: 12 }), position: [0, 0, 0.08], material: 'transparent-shell', explodedDirection: [0.45, 0, 0.65], crossSectionBehavior: 'shell', }), makePart({ id: 'cup', name: 'Cup assembly', group: 'Races', description: 'Outer race component installed in the housing bore.', primitive: primitive('housing', { profile: 'bearing-cup-outline', radius: 0.76, taperDegrees: 12 }), position: [0, 0, -0.08], material: 'transparent-shell', explodedDirection: [-0.45, 0, -0.65], crossSectionBehavior: 'shell', }), makePart({ id: 'load-vector', name: 'Combined load vector', group: 'Learning overlays', description: 'Arrow overlay decomposes applied load into radial and axial components.', primitive: primitive('annotation-plane', { width: 0.72, height: 0.2, text: 'radial + axial load' }), position: [0.2, 0.95, 0], material: 'warm-highlight', explodedDirection: [0.2, 1.1, 0], crossSectionBehavior: 'hidden-when-clipped', }), makePart({ id: 'lubrication-film', name: 'Lubrication film', group: 'Lubrication', description: 'Oil film separates rollers and raceways, especially important under high load.', primitive: primitive('flow-path', { path: 'roller-bearing-oil-film', spiral: true }), position: [0, 0, 0], material: 'oil-green', explodedDirection: [0.55, 0.35, 0.45], crossSectionBehavior: 'fluid', }), makePart({ id: 'preload-adjuster', name: 'Preload adjuster', group: 'Adjustment', description: 'Threaded nut marker showing how tapered bearings are adjusted for preload or end play.', primitive: primitive('custom', { profile: 'bearing-preload-nut', radius: 0.46, flats: 6 }), position: [0, 0, 0.38], material: 'brass', explodedDirection: [0, 0, 1.15], }), ]; const discBrakeParts = [ makePart({ id: 'brake-rotor', name: 'Brake rotor', group: 'Rotating assembly', description: 'Cast iron disc attached to the wheel hub; friction converts kinetic energy into heat.', primitive: primitive('torus', { majorRadius: 0.62, tubeRadius: 0.11, disc: true, vents: 18, axis: 'z' }), position: [0, 0, 0], material: 'cast-iron', explodedDirection: [0, 0, -0.7], }), makePart({ id: 'caliper-body', name: 'Caliper body', group: 'Caliper', description: 'Rigid bridge carrying hydraulic piston and reaction side pad across the rotor.', primitive: primitive('caliper', { rotorRadius: 0.62, bridgeWidth: 0.36, cutaway: true }), position: [0.42, 0.15, 0.08], material: 'paint-red', explodedDirection: [0.85, 0.35, 0.25], }), makePart({ id: 'piston', name: 'Hydraulic piston', group: 'Caliper', description: 'Pressure-driven piston pushes the inner pad against the rotor.', primitive: primitive('cylinder', { radius: 0.16, depth: 0.12, axis: 'z' }), position: [0.42, 0.15, 0.27], material: 'machined-steel', explodedDirection: [0.75, 0.35, 0.65], }), makePart({ id: 'inner-pad', name: 'Inner brake pad', group: 'Friction pair', description: 'Friction material pad pressed by the piston onto the rotor face.', primitive: primitive('pad', { width: 0.36, height: 0.48, thickness: 0.08, arc: true }), position: [0.42, 0.15, 0.15], material: 'graphite', explodedDirection: [0.75, 0.2, 0.45], }), makePart({ id: 'outer-pad', name: 'Outer brake pad', group: 'Friction pair', description: 'Opposite pad reacts through the sliding/floating caliper body.', primitive: primitive('pad', { width: 0.36, height: 0.48, thickness: 0.08, arc: true }), position: [0.42, 0.15, -0.15], material: 'graphite', explodedDirection: [0.75, 0.2, -0.45], }), makePart({ id: 'guide-pins', name: 'Guide pins', group: 'Caliper', description: 'Pins allow a floating caliper to centre clamping force over the rotor.', primitive: primitive('cylinder', { radius: 0.035, depth: 0.72, axis: 'z', count: 2, spacing: 0.38 }), position: [0.66, 0.15, 0], material: 'brushed-steel', explodedDirection: [0.95, 0.35, 0], }), makePart({ id: 'hydraulic-line', name: 'Hydraulic line', group: 'Hydraulics', description: 'Brake fluid line delivering pedal-generated pressure to the caliper piston.', primitive: primitive('pipe', { radius: 0.035, length: 0.82, axis: 'y', curved: true }), position: [0.62, 0.72, 0.28], material: 'fluid-amber', explodedDirection: [0.75, 0.95, 0.55], crossSectionBehavior: 'fluid', }), makePart({ id: 'bleeder-screw', name: 'Bleeder screw', group: 'Hydraulics', description: 'Small valve used to purge air from the hydraulic brake circuit.', primitive: primitive('valve', { profile: 'bleeder-screw', length: 0.22 }), position: [0.74, 0.42, 0.28], material: 'brass', explodedDirection: [1, 0.6, 0.6], }), makePart({ id: 'dust-boot', name: 'Dust boot', group: 'Sealing', description: 'Flexible boot protects the piston seal area from grit and corrosion.', primitive: primitive('seal', { radius: 0.18, thickness: 0.045, corrugated: true, axis: 'z' }), position: [0.42, 0.15, 0.34], material: 'rubber', explodedDirection: [0.65, 0.2, 0.85], }), makePart({ id: 'heat-band', name: 'Heat band', group: 'Learning overlays', description: 'Thermal colour band appears on the rotor track to show friction heat generation.', primitive: primitive('torus', { majorRadius: 0.5, tubeRadius: 0.025, axis: 'z' }), position: [0, 0, 0.02], material: 'combustion-orange', explodedDirection: [0, 0.55, 0.35], crossSectionBehavior: 'hidden-when-clipped', }), makePart({ id: 'wheel-hub', name: 'Wheel hub', group: 'Rotating assembly', description: 'Hub flange fastening the rotor to the wheel-bearing assembly.', primitive: primitive('cylinder', { radius: 0.22, depth: 0.18, axis: 'z', lugs: 5 }), position: [0, 0, -0.12], material: 'machined-steel', explodedDirection: [0, 0, -0.95], }), ]; const turbochargerParts = [ makePart({ id: 'turbine-housing', name: 'Turbine housing', group: 'Hot side', description: 'Volute casing directs exhaust gas onto the turbine wheel.', primitive: primitive('housing', { profile: 'turbo-turbine-volute', radius: 0.55, cutaway: true }), position: [0.62, 0, 0], material: 'hot-metal', explodedDirection: [0.85, 0, 0], }), makePart({ id: 'compressor-housing', name: 'Compressor housing', group: 'Cold side', description: 'Centrifugal compressor volute collects and diffuses pressurised intake air.', primitive: primitive('housing', { profile: 'turbo-compressor-volute', radius: 0.58, cutaway: true }), position: [-0.62, 0, 0], material: 'dark-anodized', explodedDirection: [-0.85, 0, 0], }), makePart({ id: 'turbine-wheel', name: 'Turbine wheel', group: 'Hot side', description: 'Exhaust-driven radial turbine extracts energy from hot gas to spin the shaft.', primitive: primitive('blade-disk', { blades: 11, radius: 0.34, hubRadius: 0.08, bladeTwist: -42, axis: 'x' }), position: [0.62, 0, 0], rotation: [0, 0, 1.5708], material: 'titanium', explodedDirection: [0.75, 0.35, 0], }), makePart({ id: 'compressor-wheel', name: 'Compressor wheel', group: 'Cold side', description: 'Centrifugal impeller accelerates intake air before pressure recovery in the compressor housing.', primitive: primitive('blade-disk', { blades: 12, radius: 0.36, hubRadius: 0.08, bladeTwist: 38, axis: 'x' }), position: [-0.62, 0, 0], rotation: [0, 0, 1.5708], material: 'machined-steel', explodedDirection: [-0.75, 0.35, 0], }), makePart({ id: 'common-shaft', name: 'Common shaft', group: 'Center section', description: 'Small high-speed shaft directly couples turbine and compressor wheels.', primitive: primitive('cylinder', { radius: 0.055, depth: 1.25, axis: 'x' }), position: [0, 0, 0], rotation: [0, 0, 1.5708], material: 'brushed-steel', explodedDirection: [0, -0.55, 0], }), makePart({ id: 'center-bearing-housing', name: 'Center bearing housing', group: 'Center section', description: 'Contains journal/thrust bearings and oil passages for the high-speed shaft.', primitive: primitive('housing', { profile: 'turbo-center-housing', width: 0.52, height: 0.48, depth: 0.48, cutaway: true }), position: [0, 0, 0], material: 'cast-iron', explodedDirection: [0, 0.65, 0], }), makePart({ id: 'wastegate-flap', name: 'Wastegate flap', group: 'Boost control', description: 'Bypass valve diverts exhaust around the turbine to control boost pressure.', primitive: primitive('valve', { profile: 'swing-flap', radius: 0.13, axis: 'z' }), position: [0.98, -0.18, 0], material: 'brass', explodedDirection: [1.05, -0.35, 0], }), makePart({ id: 'actuator', name: 'Wastegate actuator', group: 'Boost control', description: 'Pressure or electronic actuator opens the wastegate at target boost.', primitive: primitive('cylinder', { radius: 0.12, depth: 0.48, axis: 'x' }), position: [0.95, 0.55, 0], rotation: [0, 0, 1.5708], material: 'blue-accent', explodedDirection: [1, 0.85, 0], }), makePart({ id: 'oil-feed', name: 'Oil feed and drain', group: 'Center section', description: 'Lubrication lines supply and drain oil from the high-speed bearing housing.', primitive: primitive('pipe', { radius: 0.035, length: 0.72, axis: 'y', pair: true }), position: [0, 0.45, 0], material: 'oil-green', explodedDirection: [0, 0.95, 0.35], crossSectionBehavior: 'fluid', }), makePart({ id: 'exhaust-flow', name: 'Exhaust flow', group: 'Flow', description: 'Hot gas stream powers the turbine and exits through the downpipe path.', primitive: primitive('flow-path', { path: 'turbo-exhaust', arrowCount: 18, spiral: true }), position: [0.62, 0, 0], material: 'exhaust-gray', explodedDirection: [0.85, 0.45, 0.45], crossSectionBehavior: 'fluid', }), makePart({ id: 'intake-flow', name: 'Intake flow', group: 'Flow', description: 'Cool air enters axially, accelerates through the compressor wheel, and diffuses in the volute.', primitive: primitive('flow-path', { path: 'turbo-intake', arrowCount: 18, spiral: true }), position: [-0.62, 0, 0], material: 'cool-air', explodedDirection: [-0.85, 0.45, 0.45], crossSectionBehavior: 'fluid', }), makePart({ id: 'intercooler-outlet', name: 'Compressor outlet', group: 'Cold side', description: 'Outlet pipe sends compressed air toward an intercooler or intake manifold.', primitive: primitive('pipe', { radius: 0.12, length: 0.68, axis: 'y', elbow: true }), position: [-0.94, 0.45, 0], material: 'fluid-blue', explodedDirection: [-1, 0.75, 0], crossSectionBehavior: 'fluid', }), ]; export const STRUCTURAL_AND_OTHER_MACHINES: readonly MachineDefinition[] = [ makeMachine({ id: 'ball-bearing', slug: 'ball-bearing', title: 'Ball Bearing', category: 'structural-other', difficulty: 'Beginner', complexityScore: 34, sortOrder: 25, releasedAt: '2025-02-01', summary: 'Deep-groove ball bearing with races, balls, cage, seals, grease, and load distribution.', description: 'A cutaway deep-groove ball bearing showing inner and outer races, ball set, cage, seals, grease film, radial load vector, and contact patches. The animation rotates the inner race and ball set to demonstrate rolling contact and cage speed.', keywords: ['ball bearing', 'rolling element', 'race', 'cage', 'lubrication', 'Hertzian contact'], facts: [ { label: 'Load type', value: 'Radial load with moderate axial capacity', kind: 'load' }, { label: 'Typical efficiency', value: 'Very high; friction coefficient often 0.001-0.005', kind: 'efficiency' }, { label: 'Typical speed', value: 'Thousands to tens of thousands', unit: 'rpm depending on size', kind: 'rpm' }, { label: 'Invention milestone', value: 'Modern ball bearings matured in the late 19th century', kind: 'date' }, { label: 'Common applications', value: 'Motors, wheels, gearboxes, fans, instruments', kind: 'application' }, ], relatedMachineIds: ['roller-bearing', 'disc-brake-caliper', 'worm-gear-drive'], thumbnail: thumbnail('Ball Bearing', ['outer-race', 'inner-race', 'ball-set'], 'load-vector'), parts: ballBearingParts, hierarchy: hierarchy([ groupNode('races', 'Races', ['outer-race', 'inner-race']), groupNode('rolling', 'Rolling elements', ['ball-set', 'cage']), groupNode('lubrication-sealing', 'Lubrication and sealing', ['grease', 'seal-left', 'seal-right']), groupNode('learning', 'Learning overlays', ['load-vector', 'contact-patches']), ]), cameraPresets: standardCameraPresets(4.0), guidedTour: [ tourStep('overview', 'Rolling instead of sliding', 'Balls separate the races and turn sliding shaft support into rolling contact.', 'isometric', ['outer-race', 'inner-race', 'ball-set']), tourStep('cage', 'Cage spacing', 'The cage keeps balls evenly spaced and prevents ball-to-ball rubbing.', 'front', ['cage', 'ball-set'], { playback: 'play', rpm: 400 }), tourStep('load', 'Load distribution', 'Only a subset of balls carries the highest load at any instant.', 'top', ['load-vector', 'contact-patches'], { explodeDistance: 0.2 }), tourStep('seals', 'Grease and seals', 'Seals retain lubricant and protect precision raceways from contamination.', 'isometric', ['seal-left', 'seal-right', 'grease'], { explodeDistance: 0.32 }), ], animationModuleId: 'anim-ball-bearing', labelsEnabledByDefault: true, }), makeMachine({ id: 'roller-bearing', slug: 'roller-bearing', title: 'Roller Bearing', shortTitle: 'Tapered Roller Bearing', category: 'structural-other', difficulty: 'Intermediate', complexityScore: 46, sortOrder: 26, releasedAt: '2025-02-01', summary: 'Tapered roller bearing showing combined radial/thrust load and preload adjustment.', description: 'A tapered roller bearing training assembly with cup, cone, tapered rollers, cage, lubrication film, combined load vector, and preload adjuster. The model highlights why conical geometry can support axial load and why preload/end play adjustment matters.', keywords: ['roller bearing', 'tapered roller', 'cup', 'cone', 'preload', 'axial load'], facts: [ { label: 'Load type', value: 'Combined radial and axial load', kind: 'load' }, { label: 'Typical efficiency', value: 'High but more friction than ball bearings under preload', kind: 'efficiency' }, { label: 'Typical speed', value: 'Hundreds to thousands', unit: 'rpm depending on size and lubrication', kind: 'rpm' }, { label: 'Invention milestone', value: 'Tapered roller bearing patents and adoption around late 19th century', kind: 'date' }, { label: 'Common applications', value: 'Vehicle hubs, gearboxes, machine spindles, heavy equipment', kind: 'application' }, ], relatedMachineIds: ['ball-bearing', 'differential-gear', 'disc-brake-caliper'], thumbnail: thumbnail('Roller Bearing', ['tapered-rollers', 'outer-race', 'preload-adjuster'], 'load-vector'), parts: rollerBearingParts, hierarchy: hierarchy([ groupNode('races', 'Cup and cone races', ['outer-race', 'inner-race', 'cup', 'cone']), groupNode('rolling', 'Rolling elements', ['tapered-rollers', 'cage']), groupNode('lubrication-adjustment', 'Lubrication and adjustment', ['lubrication-film', 'preload-adjuster']), groupNode('learning', 'Learning overlays', ['load-vector']), ]), cameraPresets: standardCameraPresets(4.2), guidedTour: [ tourStep('overview', 'Conical rolling elements', 'Tapered rollers meet raceways along lines instead of points, improving load capacity.', 'isometric', ['outer-race', 'inner-race', 'tapered-rollers']), tourStep('load', 'Radial and axial load', 'The cone geometry resolves combined load through angled contact lines.', 'front', ['load-vector', 'tapered-rollers'], { playback: 'play', rpm: 250 }), tourStep('preload', 'Preload adjustment', 'A nut or shim sets end play; too loose or too tight reduces bearing life.', 'top', ['preload-adjuster', 'cone', 'cup'], { explodeDistance: 0.28 }), ], animationModuleId: 'anim-roller-bearing', labelsEnabledByDefault: true, }), makeMachine({ id: 'disc-brake-caliper', slug: 'disc-brake-caliper', title: 'Disc Brake Caliper', category: 'structural-other', difficulty: 'Intermediate', complexityScore: 55, sortOrder: 27, releasedAt: '2025-02-01', summary: 'Hydraulic disc brake with caliper, pads, rotor, piston actuation, heat, and guide pins.', description: 'A floating disc brake caliper cutaway showing rotor, caliper body, hydraulic piston, inner and outer pads, guide pins, line, bleeder, dust boot, heat band, and wheel hub. The animation brings the piston and pads into contact while the rotor spins and heat overlay rises.', keywords: ['disc brake', 'caliper', 'brake pad', 'rotor', 'hydraulics', 'friction heat'], facts: [ { label: 'Energy conversion', value: 'Vehicle kinetic energy to rotor/pad heat', kind: 'temperature' }, { label: 'Typical hydraulic pressure', value: '30-120', unit: 'bar during braking', kind: 'pressure' }, { label: 'Typical rotor temperature', value: '100-600+', unit: '°C depending on duty', kind: 'temperature' }, { label: 'Invention milestone', value: 'Automotive disc brakes adopted widely in mid-20th century', kind: 'date' }, { label: 'Common applications', value: 'Cars, motorcycles, bicycles, aircraft wheels, machinery brakes', kind: 'application' }, ], relatedMachineIds: ['hydraulic-cylinder', 'ball-bearing', 'roller-bearing'], thumbnail: thumbnail('Disc Brake Caliper', ['brake-rotor', 'caliper-body', 'inner-pad'], 'heat-band'), parts: discBrakeParts, hierarchy: hierarchy([ groupNode('rotating', 'Rotating assembly', ['brake-rotor', 'wheel-hub', 'heat-band']), groupNode('caliper', 'Caliper assembly', ['caliper-body', 'piston', 'guide-pins', 'dust-boot']), groupNode('friction', 'Friction pair', ['inner-pad', 'outer-pad']), groupNode('hydraulics', 'Hydraulics', ['hydraulic-line', 'bleeder-screw']), ]), cameraPresets: standardCameraPresets(4.8), guidedTour: [ tourStep('overview', 'Friction brake', 'Pads squeeze a spinning rotor to convert motion into heat.', 'isometric', ['brake-rotor', 'caliper-body', 'inner-pad', 'outer-pad']), tourStep('hydraulic', 'Hydraulic piston actuation', 'Brake fluid pressure pushes the piston and inner pad toward the rotor.', 'right', ['hydraulic-line', 'piston', 'inner-pad'], { playback: 'play', rpm: 160 }), tourStep('floating', 'Floating caliper reaction', 'Guide pins let the caliper slide so the outer pad clamps the opposite face.', 'top', ['guide-pins', 'outer-pad', 'caliper-body'], { playback: 'play', rpm: 160 }), tourStep('heat', 'Heat generation', 'The heat band rises on the rotor track as friction work accumulates.', 'front', ['heat-band', 'brake-rotor'], { explodeDistance: 0.2 }), ], animationModuleId: 'anim-disc-brake-caliper', labelsEnabledByDefault: true, }), makeMachine({ id: 'turbocharger', slug: 'turbocharger', title: 'Turbocharger', category: 'structural-other', difficulty: 'Advanced', complexityScore: 70, sortOrder: 28, releasedAt: '2025-02-01', summary: 'Exhaust-driven turbine and compressor with wastegate, bearing housing, oil feed, and flow split.', description: 'A turbocharger cutaway showing turbine housing, compressor housing, wheels, common shaft, bearing housing, wastegate flap, actuator, oil feed, exhaust flow, intake flow, and compressor outlet. It connects engine exhaust energy recovery to forced induction and boost control.', keywords: ['turbocharger', 'turbine', 'compressor', 'wastegate', 'boost', 'oil feed', 'forced induction'], facts: [ { label: 'Principle', value: 'Exhaust turbine drives intake compressor on common shaft', kind: 'note' }, { label: 'Typical shaft speed', value: '80000-200000', unit: 'rpm small automotive turbos', kind: 'rpm' }, { label: 'Efficiency', value: 'Compressor/turbine islands often peak around 65-78%', kind: 'efficiency' }, { label: 'Invention milestone', value: 'Early 20th century Alfred Büchi turbo-supercharger patents', kind: 'date' }, { label: 'Common applications', value: 'Diesel engines, petrol performance engines, aircraft, generators', kind: 'application' }, ], relatedMachineIds: ['diesel-engine', 'turbojet-engine', 'centrifugal-pump', 'turbofan-engine'], thumbnail: thumbnail('Turbocharger', ['turbine-wheel', 'compressor-wheel', 'common-shaft'], 'wastegate-flap'), parts: turbochargerParts, hierarchy: hierarchy([ groupNode('hot-side', 'Hot side turbine', ['turbine-housing', 'turbine-wheel', 'exhaust-flow', 'wastegate-flap']), groupNode('cold-side', 'Cold side compressor', ['compressor-housing', 'compressor-wheel', 'intake-flow', 'intercooler-outlet']), groupNode('center', 'Center section', ['common-shaft', 'center-bearing-housing', 'oil-feed']), groupNode('boost-control', 'Boost control', ['actuator']), ]), cameraPresets: standardCameraPresets(5.1), guidedTour: [ tourStep('overview', 'Two machines on one shaft', 'Exhaust energy spins the turbine, which drives a centrifugal compressor for intake boost.', 'isometric', ['turbine-wheel', 'compressor-wheel', 'common-shaft']), tourStep('hot-side', 'Turbine energy recovery', 'Hot exhaust flow spirals through the turbine volute and drives the wheel.', 'right', ['turbine-housing', 'turbine-wheel', 'exhaust-flow'], { playback: 'play', rpm: 40000 }), tourStep('cold-side', 'Compressor boost', 'The compressor wheel accelerates intake air and the volute diffuses it toward the outlet.', 'left', ['compressor-housing', 'compressor-wheel', 'intake-flow', 'intercooler-outlet'], { playback: 'play', rpm: 40000 }), tourStep('wastegate', 'Boost control', 'The wastegate bypasses part of the exhaust flow when target boost is reached.', 'top', ['wastegate-flap', 'actuator'], { explodeDistance: 0.24 }), ], animationModuleId: 'anim-turbocharger', labelsEnabledByDefault: true, }), ];