펀치 동작을 화면에 올렸는데 주먹을 안 쥐었다. 팔은 제대로 뻗는데 손이 쫙 펴진 채다.
원인을 두 번 짚었고, 두 번 다 틀렸다.
첫 번째: “손가락 회전 정보가 없다”
파일에 손가락 움직임이 안 담겼다고 판단했다. 그럴듯했다. 손가락이 안 움직이니까.
세어봤다. 회전 정보가 160개 들어 있었다. 손가락 뼈마다 다 있었다.
두 번째: “값이 들어는 있는데 기본 자세다”
그럼 값이 전부 0이거나 기본 자세일 거라고 생각했다. 그것도 그럴듯했다.
재봤다. 손가락 회전이 평균 56.5도. 충분히 쥐고 있었다.
파일은 멀쩡했다. 두 번 다 파일만 뒤졌고, 두 번 다 파일에는 문제가 없었다.
진짜 원인은 그리는 쪽에 있었다
화면에 재생하는 코드를 열었다. 거기 손가락을 걸러내는 필터가 있었다.
의도는 좋았다. 안 움직이는 손가락은 계산에서 빼서 가볍게 하려는 거였다. 문제는 판단 기준이었다. “첫 프레임과 비교해서 변화가 없으면 버린다.”
펀치는 처음부터 끝까지 주먹을 쥐고 있다. 첫 프레임과 비교하면 변화가 없다. 그래서 제대로 쥔 주먹이 통째로 버려졌다. 버려진 손가락은 기본 자세로 그려지니까 화면에서는 쫙 펴진다.
기준을 하나 더 넣었다. 첫 프레임과 비교하는 것에 더해 기본 자세와도 비교한다. 둘 다 변화가 없을 때만 버린다. 처음부터 쥔 주먹은 기본 자세와 다르니까 이제 살아남는다.
그리고 몇 개를 남기고 몇 개를 버렸는지 화면에 찍게 했다. 예전엔 조용히 버려서 뭐가 사라졌는지 알 수가 없었다. 이제 숫자가 0이면 바로 보인다.
이 파일은 사람이 읽을 수 없게 압축된 상태여서 고치는 것도 쉽지 않았다. 원본이 남아 있지 않은 코드였다. 그래서 고치기 전에 통째로 복사본을 떠놓고 손댔다.
배운 것
파일이 정상인데 화면이 다르면, 남은 곳은 그리는 코드뿐이다. 나는 그 뻔한 순서를 두 번 건너뛰고 파일만 두 번 뒤졌다.
① 저장된 값과 보이는 결과가 다르면 재생·표시 코드를 읽는다. 데이터만 계속 뒤지지 않는다.
② “없을 것이다”라고 판단하기 전에 세어본다. 두 번 다 세어보니 있었다.
③ 최적화 필터는 무엇을 기준으로 버리는지 확인한다. 기준이 틀리면 정상까지 버린다.
④ “변화가 없다”는 무엇 대비인지가 전부다. 시작점 대비와 기본값 대비는 다른 질문이다.