핸드 트래킹 핀치

Hand-tracking pinch

엄지와 검지를 맞대는 동작을 카메라로 인식해 "선택 확정"으로 쓰는, 컨트롤러 없는 입력 방식.

다른 이름: Pinch gestureIndirect input
···
html
<div class="pw"><div class="target" id="pt"></div></div>
<div class="hand"><div class="tip th" id="th"></div><div class="tip ix" id="ix"></div><div class="lk" id="lk"></div></div>
css
body{background:radial-gradient(circle at 50% 30%,#1c2038,#0a0a12 70%)}
.pw{position:absolute;inset:0;display:grid;place-items:center}
.target{width:clamp(60px,20vmin,90px);height:clamp(60px,20vmin,90px);border-radius:50%;
  background:rgba(255,255,255,.08);border:2px solid rgba(255,255,255,.25);
  display:grid;place-items:center;transition:transform .15s,background .15s,border-color .15s}
.target.hit{transform:scale(.88);background:var(--accent);border-color:var(--accent)}
.hand{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none}
.tip{position:absolute;width:14px;height:14px;border-radius:50%;background:#ffd7a8;box-shadow:0 0 0 4px rgba(255,215,168,.2)}
.lk{position:absolute;height:2px;background:rgba(255,215,168,.5);transform-origin:left center}
js
const target=document.getElementById('pt');
const th=document.getElementById('th'), ix=document.getElementById('ix'), lk=document.getElementById('lk');
function place(el,x,y){ el.style.left=x+'px'; el.style.top=y+'px'; el.style.transform='translate(-50%,-50%)'; }
function link(x1,y1,x2,y2){
  const dx=x2-x1, dy=y2-y1, d=Math.hypot(dx,dy), a=Math.atan2(dy,dx);
  lk.style.width=d+'px'; lk.style.left=x1+'px'; lk.style.top=y1+'px'; lk.style.transform='rotate('+a+'rad)';
}
let t=0;
function frame(){
  t+=0.03;
  const cx=innerWidth*0.28, cy=innerHeight*0.66;
  const pinch=(Math.sin(t)+1)/2;
  const gap=26*(1-pinch)+2;
  const x1=cx-gap*0.5, y1=cy-10, x2=cx+gap*0.5, y2=cy+10;
  place(th,x1,y1); place(ix,x2,y2); link(x1,y1,x2,y2);
  target.classList.toggle('hit', pinch>0.92);
  requestAnimationFrame(frame);
}
frame();

핸드 트래킹 헤드셋은 손에 아무것도 쥐지 않아도 손가락 관절 위치를 추적한다. 그중 가장 널리 쓰이는 제스처가 핀치 — 엄지와 검지 끝을 맞닿게 하는 동작 — 다. 이건 마우스의 클릭에 해당한다.

핀치의 특징은 "간접 입력"이라는 점이다. 손이 화면 속 버튼과 같은 위치에 있을 필요가 없다 — 시선(게이즈)으로 무엇을 고를지 정하고, 손은 몸 앞 편한 위치(허벅지 근처)에서 핀치만 하면 된다. 그래서 팔을 뻗지 않아도 먼 거리의 UI를 조작할 수 있다.

데모는 엄지·검지 두 점이 서로 가까워졌다 붙었다(핀치) 떨어지는 동작을 반복하고, 핀치가 일어나는 순간 화면의 타깃이 눌리는 반응을 보여준다. 실제 기기에서는 이 순간 게이즈로 고른 대상이 함께 확정된다.

언제 쓰나

게이즈 호버와 항상 함께 씁니다. 손이 실제 UI 위치에 있을 필요가 없다는 게 direct-touch와의 핵심 차이입니다.