2026-06-09
무게감의 정체 — 아케이드 이동과 점프
물리 엔진을 뺐으니 이동도 점프도 순수 함수로 직접 짰다.
핵심 발상은 플레이어 위치를 터널 단면의 극좌표로 표현하는 것이다.
각도(터널 둘레를 도는 위치)와 높이(벽 표면에서 중심 쪽으로 띄운 거리), 이 둘이면 충분했다.

좌우 이동에서 손맛은 즉발이 아닌 데서 나온다.
구버전은 키를 누르면 각도가 휙 바뀌었다.
이번엔 키 입력이 각가속도를 주고, 키를 떼면 각속도가 감쇠로 서서히 줄어든다.
그래서 키를 떼도 토끼가 곧장 멈추지 않고 미끄러진다.
이 "안 멈추는 한 박자"가 바로 무게감의 정체다.
점프는 인공 중력으로 만들었다.
점프하면 위로 속도를 주고, 매 프레임 중력으로 그 속도를 깎는다.
위로 솟다가 자연스럽게 정점을 찍고 떨어진다.
let { height, radialVel, grounded } = p;
if (input.jump && grounded) { radialVel = PLAYER.JUMP_VELOCITY; grounded = false; }
if (!grounded) {
height += radialVel * dt;
radialVel -= PLAYER.GRAVITY * dt;
if (height <= 0) { height = 0; radialVel = 0; grounded = true; }
}
값은 JUMP_VELOCITY = 9, GRAVITY = 24로 잡았다.
그러면 자연 정점은 v²/2g ≈ 1.69m.
혹시 모를 폭주를 막으려고 상한 클램프(2.4m)를 두긴 했지만 평소엔 안 닿는다.
순수 함수로 짠 데는 이유가 있다.
Three.js에 묶이지 않으니 점프 궤적을 Jest로 그대로 검증할 수 있다.
입력과 dt를 넣고 높이가 솟았다 0으로 돌아오는지 단위 테스트로 확인한다 — 손맛을 눈이 아니라 테스트로 잡는 셈이다.
다음 편은 이 좌표 위에서 부딪힘을 판정하는 충돌 이야기다.