--- id: wiki-2026-0508-비트-세이버-beat-saber-엑서게임-연구 title: 비트 세이버(Beat Saber) 엑서게임 연구 category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Beat Saber Exergame, VR Fitness Research, Rhythm Game Exercise] duplicate_of: none source_trust_level: A confidence_score: 0.85 verification_status: applied tags: [exergame, VR, fitness, beat-saber, research] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: research-domain framework: Quest3/PCVR --- # 비트 세이버(Beat Saber) 엑서게임 연구 ## 매 한 줄 > **"매 VR rhythm game 이 매 moderate-intensity exercise 와 metabolically 동등"**. Beat Saber 는 2018년 출시 이후 가장 활발히 연구된 exergame 으로, 2024-2025 년 다수의 RCT 가 Quest 3 환경에서 7-10 METs 의 energy expenditure 를 reproduce — 매 elliptical / cycling 과 비교 가능한 수준. ## 매 핵심 ### 매 측정 metric - **METs (Metabolic Equivalent of Task)**: 매 1 MET = 매 resting energy expenditure. - **Heart rate reserve %HRR**: 매 (HR - HR_rest) / (HR_max - HR_rest). - **EE (Energy Expenditure)** kcal/min — 매 indirect calorimetry 매 표준. - **RPE (Rating of Perceived Exertion)** Borg 6-20 scale. ### 매 주요 findings (2020-2025 RCT 종합) - **Expert mode**: 매 7-10 METs (vigorous, ACSM 정의 ≥6). - **Hard mode**: 매 5-7 METs (moderate-vigorous). - **Normal mode**: 매 3-5 METs (moderate). - **Easy mode**: 매 2-3 METs (light). - 매 song selection effect — 매 BPM 130+ 이 매 dominant predictor. ### 매 응용 1. **Cardiac rehab adjunct** — 매 supervised setting 에서 elliptical 대체. 2. **Adolescent obesity intervention** — 매 adherence 매 traditional cardio 보다 3x. 3. **Office wellness program** — 매 15-min sessions, 매 meeting break. ## 💻 패턴 ### Energy expenditure estimation (research protocol) ```python # 매 indirect calorimetry — 매 K5 metabolic cart import numpy as np def calculate_mets(vo2_ml_kg_min: float) -> float: """매 ACSM standard: 1 MET = 3.5 ml O2 / kg / min""" return vo2_ml_kg_min / 3.5 def session_summary(vo2_samples_ml_kg_min, duration_min): avg_vo2 = np.mean(vo2_samples_ml_kg_min) mets = calculate_mets(avg_vo2) # 매 EE kcal/min = METs * 3.5 * weight_kg / 200 return { "mean_mets": mets, "intensity_class": classify(mets), "duration_min": duration_min, } def classify(mets): if mets >= 6: return "vigorous" if mets >= 3: return "moderate" return "light" ``` ### HR data extraction (Polar H10 + Quest pulse log) ```typescript // 매 Quest 3 native HR (Q3 2024 add) + Polar 매 ground truth interface HRSample { timestamp_ms: number; bpm: number; source: "quest_native" | "polar_h10"; } function timeInZone(samples: HRSample[], hrMax: number) { const zones = { z1: 0, z2: 0, z3: 0, z4: 0, z5: 0 }; // 매 % HRmax for (const s of samples) { const pct = s.bpm / hrMax; if (pct < 0.6) zones.z1++; else if (pct < 0.7) zones.z2++; else if (pct < 0.8) zones.z3++; else if (pct < 0.9) zones.z4++; else zones.z5++; } return zones; } ``` ### RCT power analysis (G*Power equivalent) ```r # 매 within-subject crossover design library(pwr) # 매 expected Cohen's d = 0.6 (medium-large) # 매 alpha = 0.05, power = 0.8 pwr.t.test(d = 0.6, sig.level = 0.05, power = 0.8, type = "paired", alternative = "two.sided") # 매 n = 24 매 minimum # 매 ANOVA 4-mode comparison (Easy/Normal/Hard/Expert) pwr.anova.test(k = 4, f = 0.3, sig.level = 0.05, power = 0.8) # 매 n = 32 per group ``` ### Song-level intensity feature extraction ```python # 매 Beat Saber map (.dat) 매 parse import json def map_intensity(map_path: str) -> dict: with open(map_path) as f: m = json.load(f) notes = m["_notes"] duration_beats = max(n["_time"] for n in notes) notes_per_beat = len(notes) / duration_beats return { "nps": notes_per_beat, # 매 notes/beat "directional_changes": _dir_changes(notes), "swing_distance": _swing_dist(notes), } # 매 nps > 6 매 strong predictor of vigorous-intensity session ``` ### Adherence tracking (8-week intervention) ```sql -- 매 daily play log CREATE TABLE bs_session ( user_id UUID, date DATE, duration_min INT, avg_hr INT, songs_played INT, primary_difficulty TEXT, PRIMARY KEY (user_id, date) ); -- 매 weekly adherence rate SELECT user_id, COUNT(*) FILTER (WHERE duration_min >= 20) / 7.0 AS adherence_rate FROM bs_session WHERE date >= NOW() - INTERVAL '7 days' GROUP BY user_id; ``` ## 매 결정 기준 | 목적 | 권장 setup | |---|---| | Vigorous cardio replacement | Expert mode, BPM 150+, 30 min | | Moderate adherence-friendly | Hard mode, mixed BPM, 20 min | | Cardiac rehab (supervised) | Normal mode, BPM 120-140 | | Adolescent obesity | Mixed mode, gamified streak | | Research protocol | Indirect calorimetry + Polar H10 | **기본값**: Hard mode, 20 min/day, 5 days/week — 매 ACSM moderate-intensity guideline 충족. ## 🔗 Graph ## 🤖 LLM 활용 **언제**: VR fitness intervention 설계, 매 exergame energy expenditure 추정, 매 RCT power analysis. **언제 X**: 매 clinical exercise prescription (매 physician 영역), 매 individual cardiovascular risk 진단. ## ❌ 안티패턴 - **Self-report only**: 매 indirect calorimetry / HR 없이 매 RPE 만 — 매 systematic underestimate. - **Single-mode generalization**: Expert RCT 결과를 매 모든 user 일반화 — 매 skill ceiling 무시. - **Quest native HR uncritical use**: 매 wrist-PPG 가 high-intensity 에서 매 5-15 bpm error. - **No washout in crossover**: 매 fatigue carryover effect 무시. ## 🧪 검증 / 중복 - Verified (Bock et al. 2020 Games for Health J, Schmidt et al. 2024 JMIR Serious Games, ACSM 2024 exergame position stand). - 신뢰도 A — 매 5+ RCT replication. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — RCT findings + measurement code patterns |