--- id: wiki-20260508-vergence-accommodation-conflicts-redir title: Vergence-Accommodation Conflicts category: 10_Wiki/Topics status: verified canonical_id: self aliases: [VAC, vergence accommodation conflict, focal mismatch] duplicate_of: none source_trust_level: A confidence_score: 0.91 verification_status: applied tags: [vr, perception, optics, ux] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: TypeScript framework: Three.js / WebXR --- # Vergence-Accommodation Conflicts ## 매 한 줄 > **"매 eye 의 vergence (cross-eye angle) 와 accommodation (lens focus) 의 mismatch 의 eye strain / sickness"**. 매 stereoscopic VR / AR 의 fundamental 한계 — 매 fixed focal plane 의 cause. 2026 의 Vision Pro 의 여전히 mitigation 만 가능 — 매 light field display 의 future. ## 매 핵심 ### 매 원인 - **Real world**: 매 vergence (eye 가 object 로 cross) 와 accommodation (lens focus 의 거리) 의 동기. - **VR/AR**: 매 vergence 의 virtual depth 의 따라 변화 — 매 accommodation 의 fixed display focal plane (~2m) 에 lock. - **Conflict**: 매 brain 의 두 cue 의 mismatch 의 fatigue / blur / nausea 의 trigger. ### 매 mitigation - **Dolly comfort zone**: 매 0.5-2m 의 main interaction — focal mismatch minimum. - **Reduce small text**: 매 close-up text 의 conflict 의 amplify. - **Vary focus only with intent**: 매 sudden depth change 의 avoid. - **Pupil-aware DOF**: 매 eye-tracking 의 dynamic blur (Vision Pro). - **Light field display** (future): 매 multi-focal — true accommodation cue. ### 매 응용 1. UI design — 매 menu 의 1.5m 거리 의 default. 2. AR overlay 의 real-world depth match — 매 ARKit / ARCore 의 plane anchor. 3. eye-tracked foveated rendering 의 결합. ## 💻 패턴 ### 매 Three.js + WebXR 의 comfort zone 의 UI 배치 ```typescript const COMFORT_DISTANCE = 1.5; // m const menu = new THREE.Group(); menu.position.set(0, 1.5, -COMFORT_DISTANCE); // 매 1.5m 의 fixed focal camera.parent.add(menu); // 매 head-locked // 매 menu 의 readable 의 maintain ``` ### 매 거리 별 text size 의 scaling ```typescript function readableTextSize(distance: number): number { // 매 angular size = arctan(size / distance) — 매 적정 1-2° return distance * 0.025; // 매 1.5m 의 ~3.75cm height } ``` ### 매 Eye-tracking 의 dynamic DOF (Vision Pro / Quest Pro) ```typescript const xrSession = renderer.xr.getSession(); const gazeRay = await xrSession?.requestReferenceSpace('viewer'); // 매 gaze 의 depth 의 추정 function applyDOF(focusDistance: number) { postProcessing.bokehPass.uniforms.focus.value = focusDistance; postProcessing.bokehPass.uniforms.aperture.value = 0.025; } ``` ### 매 Sudden depth change 의 mitigation ```typescript // 매 fade transition 의 사용 async function transitionScene(newDepth: number) { await fadeToBlack(200); scene.position.z = -newDepth; await fadeFromBlack(200); } ``` ### 매 AR plane anchor 의 align ```typescript // 매 WebXR hit-test const hitTestSource = await xrSession.requestHitTestSource({ space: viewerSpace }); xrSession.requestAnimationFrame((time, frame) => { const results = frame.getHitTestResults(hitTestSource); if (results.length > 0) { const pose = results[0].getPose(refSpace); object.position.setFromMatrixPosition(new THREE.Matrix4().fromArray(pose.transform.matrix)); // 매 real surface 의 attach — 매 vergence/accommodation 의 align } }); ``` ### 매 Comfort range 의 enforce ```typescript function clampInteractionDistance(target: THREE.Object3D) { const dist = camera.position.distanceTo(target.position); if (dist < 0.3) target.scale.setScalar(0.3 / dist); // 매 too-close 시 shrink if (dist > 3) target.scale.setScalar(dist / 3); // 매 too-far 시 enlarge } ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | UI / menu | 1.5-2m fixed (comfort zone) | | Reading | 0.7-1m, large font | | AR overlay | real surface anchor | | Cinematic | distant scene (>3m) | | Sudden depth jump | fade transition | **기본값**: 0.5-2m comfort zone 의 default, 매 UI 의 1.5m 의 fixed. ## 🔗 Graph - 응용: [[VR Sickness]] · [[깊이 지각(Depth perception)]] - Adjacent: [[Edge Bleeding]] · [[가상현실(VR) 자전거 시뮬레이터]] ## 🤖 LLM 활용 **언제**: VR/AR UX 의 comfort design, UI 거리 의 권장, eye strain 의 explain. **언제 X**: 매 specific HMD 의 hardware 의 specific recommendation 의 over-confidence — 매 device 의 명시. ## ❌ 안티패턴 - **Tiny text 의 close**: 매 0.3m 의 small font — 매 conflict 의 max. - **Sudden zoom**: 매 fade 없는 depth jump — 매 nausea. - **Floating UI 의 무한 거리**: 매 readable 거리 의 무시. ## 🧪 검증 / 중복 - Verified (Oculus VR Best Practices, Apple Vision Pro Human Interface Guidelines). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — VAC FULL 작성 |