AI 보간이 무너지는 자리 — 뚜껑 여는 팔은 손으로 조립했어요
스프라이트 보간을 세 번 돌렸고 세 번 다 같은 곳에서 무너졌습니다. 결국 팔은 새로 그리지 않고, 원본 소매 픽셀을 곡선을 따라 구부려서 만들었어요.
인트로에서 캐릭터가 노트북 뚜껑을 여는 9프레임이 있어요. 프레임 사이를 채우는 건 AI 보간에 맡기면 될 줄 알았습니다. 세 번 뽑았고, 세 번 다 같은 곳에서 무너졌어요.
- 손 덩어리가 83 → 171 → 252px로 부풀면서 가로로 21px 순간이동했어요. 위팔은 몸통과 윤곽선으로 갈린 둥근 덩어리가 됐고요.
- 두 팔이 다 움직이고 눈까지 감겼어요. 한쪽 팔만 움직이라고 했는데요.
- 마지막 프레임을 시작점으로 넣고 “나머지는 그대로”라고 자세히 지시했는데도, 얼굴이 프레임마다 다시 그려지고(눈·앞머리·볼) 후드 조임끈이 사라지고, 스프라이트 안에 회색 노트북을 새로 그려 넣었어요. 노트북은 별개 오브젝트라 이러면 화면에 두 개가 됩니다.
결론은 하나예요. 정지해야 할 부위를 말로 막는 건 안 먹힙니다.
새로 그리지 말고 구부리세요
그래서 파이썬 스크립트로 직접 만들었어요. 핵심은 이겁니다 — 팔을 새로 칠하지 않고, 원본 소매 픽셀을 곡선을 따라 구부립니다.
캡슐이나 스윕으로 새로 칠하면 두께·윤곽선·접힘선·어깨 주름이 전부 사라져요. 넘어가는 프레임에서 팔이 갑자기 뭉개져 보입니다.
- 팔 없는 몸통 판 — 원본에서 오른팔과 주먹을 지우고 그 자리에 옆선을 세웁니다.
- 뼈대 — 어깨는 고정, 손목은 노트북 뚜껑 윗변을 따라가고, 팔꿈치는 그 둘에서 나와요.
- 살 = 곡선 워프 — 새 곡선 기준으로 각 픽셀의 (호길이
u, 옆으로 떨어진 거리off)를 구하고, 원본 곡선의 같은 자리에서 색을 가져옵니다. 원본 픽셀이 그대로 오니까 두께도 윤곽선도 반대쪽 팔과 같아요. - 손 — 원본의 손을 그대로 옮깁니다. 프레임 수를 뚜껑과 같은 9장으로 맞춰서 손과 뚜껑이 항상 같이 움직여요.
팔꿈치가 옆으로 부푸는 양은 역기구학에 맡기면 안 됩니다. 곧게 편 상태에서 h = √(L² − a²)는 0에서 기울기가 무한대라, 한 프레임 만에 팔꿈치가 3.6px 튀어나오고 팔이 통째로 뚱뚱해져요. 0 → 5px를 smoothstep으로 줍니다.
잔상은 “옮긴 자리”가 아니라 “떠난 자리”에 남아요
팔을 옮기는 편집에서 실제로 셋이 나왔어요.
- 옛 주먹의 왼쪽 두 열 — 판을 만들 때
x ≥ 151만 지웠는데 원본 주먹은x149까지 걸쳐 있었어요. 손이 올라간 프레임에서 그 두 열이 노트북 모서리에 붉은 얼룩으로 남았습니다. - 캡슐이 원본 소매보다 넓은 자리 — 남은 본색이 소매 가장자리와 윤곽선 사이에 1px 밝은 줄로 끼었어요.
- 뚜껑 뒤로 넘긴 손 — 뚜껑의 들쭉날쭉한 모서리에 주먹 왼쪽 열이 걸렸다 말았다 하면서 화면 테두리에 붉은 점선이 생겼어요.
스크립트가 스스로 검사하게 했어요
돌 때마다 넷을 검사합니다. 연결 요소 1개, 팔레트 26색, 특정 구간에서 끊긴 행 0개, 오른쪽 살색 덩어리 1개. 거기에 원본 대비 팔 폭을 줄마다 찍어 줍니다. 실패하면 종료 코드 1을 내요.
원본은 반드시
tools/sprites/base/에서 읽습니다. 출력 폴더를 읽게 두면 자기 결과물을 다시 먹어서, 돌릴 때마다 팔이 1~2px씩 부풀었어요.
AI로 뽑는 게 빠른 자리와, 손으로 조립해야 하는 자리가 따로 있어요. 기준은 이렇게 잡고 있습니다 — 덩어리가 크고 속이 찬 그림은 맡기고, 형태가 정확히 유지돼야 하는 그림은 직접.