Einfache Schaltkreise, komplexes Sehen: Was HN heute mit AmblyoPunch zu tun hat
Hacker News Top‑Post: „Simple circuits can create complex behaviors“ – 171 Punkte, 57 Kommentare. Die Diskussion dreht sich darum, wie minimalistische neuronale Verdrahtung reiches, komplexes Verhalten hervorbringt.
Unser Transfer: AmblyoPunch nutzt genau dieses Prinzip für Vision Training bei Amblyopie (Schielauge) und binokularen Sehstörungen.
Einfache Spielregeln
- Gabor‑Pattern‑Münzen boxen (weiche Streifen, optimiert für kontrastempfindliche Zellen)
- Roten Spikes ausweichen (3 Leben, Neustart bei Verlust)
- 6 Welten mit steigender Schwierigkeit (Dorf → Stadt → Weltraum → Mond → Mars → Venus)
Komplexes neuronales Ergebnis
4‑stufiges dichoptisches Training, das beide Augen zusammen arbeiten lässt:
- Monokulares Warm‑up (nur schwaches Auge)
- Suppression brechen (dominantes Auge gedimmt)
- Rebalancing (Klarheit zurück)
- Fusion (leichte Disparität → 3D‑Perzept via Panums Fusionsbereich)
Performance‑gated: ≥70 % in rollenden 10 Versuchen, ≥80 % bei Schiel‑Profilen. Unter 40 % → Demotion.
Personalisierung
- Schwaches Auge: Links/Rechts (falsch = Effekt umgekehrt)
- Schweregrad: Mild/Moderate/Severe (Target‑Größe, Speed, Stufenlänge)
- Strabismus: Esotropie/Exotropie (Stage‑4 Disparität/Vergence)
- Automatic Mode (empfohlen) vs. Custom (Experten)
Technische Architektur (für Builder)
Dichoptic Rendering
Zwei virtuelle Kameras rendern dieselbe Szene, aber jeder Kamera ist ein eigenes Post‑Process‑Material zugeordnet. Auf Quest 2/3/Pro läuft das bei 72 Hz (Stand‑alone) bzw. 90 Hz (PC‑Link). Das Material dimmt das dominante Auge (Alpha‑Blend ≈ 0.3), hebt Kontrast für das schwache Auge an (Gain ≈ 1.4) und fügt in Stage 4 eine horizontale Disparität von 2–6 arcmin hinzu – genau im Panums‑Bereich.
// Fragment‑Shader Ausschnitt (vereinigt für beide Augen)
uniform float uEye; // 0 = links, 1 = rechts
uniform float uDimFactor; // 0.3 für dominantes Auge
uniform float uContrastGain; // 1.4 für schwaches Auge
uniform float uDisparity; // Stage‑4 nur
vec4 base = texture(tex, uv);
if (uEye == 1.0) base.rgb *= uDimFactor;
base.rgb = (base.rgb - 0.5) * uContrastGain + 0.5;
uv.x += uEye * uDisparity;
gl_FragColor = base;
Gabor‑Stimuli
Prozeduraler Shader generiert Gabor‑Funktionen:
float gabor(vec2 p, float freq, float ori, float bw) {
float x = p.x * cos(ori) + p.y * sin(ori);
float y = -p.x * sin(ori) + p.y * cos(ori);
float envelope = exp(-0.5 * (x*x + y*y) / (bw*bw));
return envelope * cos(2.0 * PI * freq * x);
}
Frequenz, Orientierung und Bandbreite werden zur Laufzeit aus dem Severity‑Profil (Mild = 2 c/deg, Moderate = 4 c/deg, Severe = 6 c/deg) und der aktuellen Stage abgeleitet.
Input Layer
Controller‑ und Hand‑Tracking‑Events werden über ein gemeinsames Interface IInputProvider normalisiert. Der AutomaticModeFSM reagiert nur auf OnTargetHit / OnMiss, sodass die gleiche Logik für beide Eingabemodi gilt.
State Machine – Automatic Mode
Ein deterministischer Finite‑State‑Machine (FSM) steuert die vier Stages. Transition‑Guard:
bool CanPromote(Stage s) => s switch {
Stage.Warmup => RollingSuccessRate(10) >= 0.70f,
Stage.BreakSup => RollingSuccessRate(10) >= 0.70f,
Stage.Rebal => RollingSuccessRate(10) >= 0.70f,
Stage.Fusion => RollingSuccessRate(10) >= 0.80f,
_ => false
};
Bei < 40 % Success‑Rate über die letzten 10 Trials erfolgt Demotion zur vorherigen Stage.
Lokal‑First Persistenz
Alle Fortschritte, Kalibrierungen und Einstellungen liegen im Application.persistentDataPath (JSON). Kein Cloud‑Sync, keine Telemetrie – Datenschutz by Design.
Persönliche Notiz
Ich kenne jemanden, der als Kind gepflastert wurde – und es hasste. Heute, 30 Jahre später, setzt er die Quest auf, boxt Gabor‑Coins, will Venus freischalten. Und merkt nebenbei: Der Ball fliegt nicht mehr an ihm vorbei. Die Treppe fühlt sich sicher an.
Kein Medizinprodukt. Keine Heilung. Trainingsspiel, das augenärztliche Betreuung ergänzt. Aber: Compliance durch Wollen, nicht Sollen.
https://www.meta.com/en-gb/experiences/amblyopunch/1239507485902689/
Top comments (0)