From 105691815d1dcaa4c3e47401980ec310775670be Mon Sep 17 00:00:00 2001 From: Arnaud_Cayrol Date: Sun, 15 Feb 2026 18:06:46 +0100 Subject: [PATCH] Add a silouhette png instead of hand drawn face --- frontend/src/lib/assets/silhouette.png | Bin 0 -> 28718 bytes .../visual/AlignmentIndicator.svelte | 118 +++--------------- 2 files changed, 16 insertions(+), 102 deletions(-) create mode 100644 frontend/src/lib/assets/silhouette.png diff --git a/frontend/src/lib/assets/silhouette.png b/frontend/src/lib/assets/silhouette.png new file mode 100644 index 0000000000000000000000000000000000000000..0c232bc20fb691c458af2cd967a0b4cf80d91f70 GIT binary patch literal 28718 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 - /** - * Visual indicator for alignment settings showing head position and scale. - * Displays an anatomically proportioned face with eyes positioned according to eye_distance. - * - * The eye_distance parameter controls zoom level: - * - Smaller values (0.1): zoomed out, head appears smaller, shows more neck - * - Larger values (0.5): zoomed in, head appears larger, tighter crop - * - * Proportions match the processing pipeline (alignment.rs): - * - Eye positions calculated with FACE_CENTER_BELOW_EYES = 0.5 - * - Face center (hairline-to-chin midpoint + neck) positioned at frame center - * - This creates a vertical offset showing more neck than forehead - * - Inter-pupillary distance (IPD) is ~37% of face width - */ + import silhouetteUrl from '../../assets/silhouette.png'; + let { eyeDistance = 0.3 } = $props(); - // Frame dimensions (square output image) const frameSize = 120; - // Calculate eye positions using the same formulas as alignment.rs - const FACE_CENTER_BELOW_EYES = 0.5; - - const leftEyeX = $derived((1.0 - eyeDistance) / 2.0); - const rightEyeX = $derived(1.0 - leftEyeX); - const eyeY = $derived(0.5 - eyeDistance * FACE_CENTER_BELOW_EYES); - - // Convert to pixel coordinates - const leftEyePos = $derived({ x: leftEyeX * frameSize, y: eyeY * frameSize }); - const rightEyePos = $derived({ x: rightEyeX * frameSize, y: eyeY * frameSize }); - - // Calculate eye distance in pixels - const eyeDistancePx = $derived(eyeDistance * frameSize); - - // Calculate eye center point - const eyeCenterX = $derived((leftEyePos.x + rightEyePos.x) / 2); - const eyeCenterY = $derived(eyeY * frameSize); - - // Face proportions based on inter-pupillary distance (IPD) - // Per crop_utils.rs, IPD is ~0.37 of face width - // Face center (hairline-to-chin midpoint + neck) is 0.5 * IPD below eyes - - // Anatomical proportions relative to IPD: - // - Eyes to top of head (forehead): ~0.5 IPD - // - Eyes to face center: 0.5 IPD (by definition) - // - Face center to bottom (lower face + neck): ~0.5 IPD - // Total head height: ~1.5 IPD - const foreheadHeight = $derived(eyeDistancePx * 0.5); - const lowerFaceHeight = $derived(eyeDistancePx * 1.0); - - // Head ellipse dimensions (head is taller than wide) - const headCenter = $derived({ - x: eyeCenterX, - y: eyeCenterY + (lowerFaceHeight - foreheadHeight) / 2 - }); - const headWidth = $derived(eyeDistancePx * 1.35); // Width relative to IPD - const headHeight = $derived(eyeDistancePx * 1.85); // Height > width (ratio ~1.37) - - // Eye rendering parameters (scale with IPD) - const eyeRadius = $derived(Math.max(2.5, eyeDistancePx * 0.12)); + // Scale the silouhette so it fills the frame proportionally to eyeDistance + const imgSize = $derived(eyeDistance * frameSize * (1 / 0.12)); // Eye distance approximated to around 12% of the width. + const imgX = $derived((frameSize - imgSize) / 2); + const imgY = $derived(((frameSize * 1.4) - imgSize) / 2); // slight offset to show more neck - - - - - - - - - - - + @@ -129,9 +44,8 @@ height: 80px; } - .head, - .eye, - .mouth { + .silhouette { + filter: invert(1); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); }