"매 SSQ 는 VR/AR cybersickness 의 standard 측정 — 매 16 symptom × 4-point Likert → 3 subscale (Nausea, Oculomotor, Disorientation) + Total". 매 origin 은 1993 Kennedy et al. (Naval Air Warfare Center, military flight simulator); 매 modern state 는 VR HMD (Quest 4, Vision Pro 2) UX 평가 의 default, VRSQ/CSQ-VR 같은 매 최신 variant 도 등장.
매 핵심
매 SSQ (Kennedy 1993) 구조
매 16 항목 — 매 0 (None) ~ 3 (Severe) 의 4-point.
N (Nausea, 7 items): general discomfort, increased salivation, sweating, nausea, difficulty concentrating, stomach awareness, burping.
O (Oculomotor, 7 items): general discomfort, fatigue, headache, eyestrain, difficulty focusing, difficulty concentrating, blurred vision.
D (Disorientation, 7 items): difficulty focusing, nausea, fullness of head, blurred vision, dizzy(eyes open), dizzy(eyes closed), vertigo.
매 일부 항목 매 multiple subscale 에 share (overlap).
매 score 공식 (Kennedy 1993)
N = (Σ N items) × 9.54
O = (Σ O items) × 7.58
D = (Σ D items) × 13.92
TS (Total Score) = (Σ all 16 items) × 3.74
매 modern alternative
VRSQ (Kim 2018): 9 items, oculomotor + disorientation only (매 nausea 제거 — 매 modern HMD 가 nausea 적게).
CSQ-VR (Sevinc 2020): 6 items, very short, mobile VR friendly.
MSSQ (Motion Sickness Susceptibility): 매 baseline trait.
매 응용
VR app UX QA (pre/post comparison).
Locomotion 방식 비교 (teleport vs smooth).
Hardware iteration (refresh rate, FOV).
Medical (vestibular research, exposure therapy).
💻 패턴
매 SSQ 항목 (Likert 0-3)
SSQ_ITEMS=["General discomfort",# N, O"Fatigue",# O"Headache",# O"Eyestrain",# O"Difficulty focusing",# O, D"Increased salivation",# N"Sweating",# N"Nausea",# N, D"Difficulty concentrating",# N, O"Fullness of head",# D"Blurred vision",# O, D"Dizzy (eyes open)",# D"Dizzy (eyes closed)",# D"Vertigo",# D"Stomach awareness",# N"Burping",# N]LIKERT={0:"None",1:"Slight",2:"Moderate",3:"Severe"}
매 scoring (Kennedy 1993, 매 weights)
importnumpyasnp# 매 16 items × 3 subscales mask (1 = belongs to subscale)N_MASK=np.array([1,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1])# 7 itemsO_MASK=np.array([1,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0])# 7 itemsD_MASK=np.array([0,0,0,0,1,0,0,1,0,1,1,1,1,1,0,0])# 7 itemsdefssq_score(responses:np.ndarray)->dict:"""responses: shape (16,), values 0-3"""N_raw=(responses*N_MASK).sum()O_raw=(responses*O_MASK).sum()D_raw=(responses*D_MASK).sum()TS_raw=N_raw+O_raw+D_raw# 매 with overlapreturn{"Nausea":N_raw*9.54,"Oculomotor":O_raw*7.58,"Disorientation":D_raw*13.92,"Total":TS_raw*3.74,}# 매 exampleresp=np.array([1,2,1,2,1,0,0,1,1,0,1,2,1,1,0,0])print(ssq_score(resp))# {'Nausea': 19.08, 'Oculomotor': 60.64, 'Disorientation': 97.44, 'Total': 49.79}
매 study protocol (pre/post design)
importpandasaspdfromscipyimportstats# 매 typical study: pre-SSQ baseline → 20min VR → post-SSQdf=pd.read_csv("ssq_study.csv")# cols: pid, condition, timepoint, item_1..16scores=df.groupby(["pid","condition","timepoint"]).apply(lambdag:pd.Series(ssq_score(g.filter(regex="item_").values.flatten()))).reset_index()# 매 paired t-test: pre vs post 의 Totalpre=scores.query("timepoint=='pre' and condition=='smooth'")["Total"]post=scores.query("timepoint=='post' and condition=='smooth'")["Total"]t,p=stats.ttest_rel(post,pre)print(f"Δ Total = {(post.mean()-pre.mean()):.1f}, t={t:.2f}, p={p:.4f}")
매 severity benchmark (Kennedy 매 referenced)
definterpret_total(ts:float)->str:ifts<5:return"Negligible (typical baseline)"ifts<10:return"Minimal"ifts<15:return"Significant"ifts<20:return"Concerning"return"Bad simulator (redesign needed)"# 매 modern HMD goal: post-session Total < 15.# 매 Total > 20 → 매 build problem (locomotion, frame drop).
매 collection UI (Unity / Unreal — 매 in-VR survey)
// Unity, 매 in-VR Likert with XR ToolkitpublicclassSSQItem:MonoBehaviour{publicstringsymptomText;publicintresponse=-1;// -1 = not answeredpublicAction<int>onSelect;publicvoidSelect(intv){response=v;onSelect?.Invoke(v);}}// 매 16 items 순회, 매 0/1/2/3 button
매 VRSQ (매 2018, 9 items, modern HMD recommended)
VRSQ_ITEMS=["General discomfort","Fatigue","Eyestrain","Difficulty focusing","Headache","Fullness of head","Blurred vision","Dizzy (eyes closed)","Vertigo",]# 매 Oculomotor + Disorientation 만 — 매 nausea 제외defvrsq_score(resp):O=sum(resp[:4])/(4*3)*100D=sum(resp[4:])/(5*3)*100return{"Oculomotor":O,"Disorientation":D,"Total":(O+D)/2}
매 Claude Opus 4.7 — 매 open-ended comment 코딩
importanthropicclient=anthropic.Anthropic()defcode_comments(comments:list[str])->list[dict]:"""매 SSQ open-ended 'other discomfort' field → theme tag."""msg=client.messages.create(model="claude-opus-4-7",max_tokens=2048,system=("Tag each VR-sickness participant comment with: ""1+ tags from [oculomotor, nausea, disorientation, ""thermal, audio, latency, controls, other]. ""Output JSON list."),messages=[{"role":"user","content":"\n".join(f"{i+1}. {c}"fori,cinenumerate(comments))}],)returnmsg.content[0].text# 매 JSON parse downstream