본문 바로가기

블로그 / 아트

한 장짜리 캐릭터를 라운드 사이에 움직이기: 기울이기를 버리고 몸풀기 자세를 두 장씩 그렸다

랜선포차의 숨 고르기 10초 동안 캐릭터가 몸을 푼다. 처음엔 그림을 기울이고 늘여서 흉내 냈다가 별로라 접고, 56종마다 몸풀기 자세 두 장(112장)을 그려 번갈아 보여 준 과정을 적었다.

Salmonholic ·· 5분 읽기

에어로빅쌤, 요리사, 등산러, 복서, 골프광, 해녀 캐릭터 여섯 명이 저마다 다른 몸풀기 자세를 취한 낙서체 그림 모음

랜선포차는 우유 벌칙 파티 게임이다. 한 라운드가 끝나고 다음 떼창이 시작되기 전에 숨 고르기 10초가 있다. 이 10초 동안 아무도 조작할 게 없어서 화면이 정지 사진처럼 멈춘다. 캐릭터가 그 자리에 뻣뻣하게 서 있으면 게임이 꺼진 것처럼 보였다. 그래서 숨 고르는 동안 캐릭터가 각자 몸을 풀게 만들기로 했다.

문제는 캐릭터가 전부 한 장짜리 그림이라는 점이다. 56종 전부 무표정 낙서체로 그린 평면 그림이고, 어깨도 관절도 레이어도 없다. 뼈대 없는 그림을 어떻게 움직일까.

처음엔 그림을 기울이고 늘여서 흉내 냈다

첫 시도는 그림 자체는 그대로 두고 변형만 주는 방식이었다. 회전 중심을 어깨나 골반 쪽으로 옮긴 척 보정 이동을 더하고, 캐릭터마다 다섯 가지 동작 중 하나를 골라 반복했다. 어깨춤, 옆구리 늘리기, 목 돌리기, 기지개, 제자리 콩콩이었다.

case "shoulder": {
  const u = tt / 0.5;                    // 0.5초마다 한쪽 어깨
  const lift = Math.floor(u) % 2 ? -1 : 1;
  const pop = Math.pow(Math.sin(Math.PI * (u % 1)), 1.5);
  const rot = lift * 0.2 * pop;          // 반대 어깨를 축으로 11도쯤
  return around(rot, -pop * span * 0.12);
}

처음엔 움직임이 너무 소심해서 안 하느니만 못했다. 그래서 과장을 키웠다. 어깨는 11도, 옆구리는 19도까지 기울이고, 기지개는 세로로 1.14배, 콩콩은 뛰는 높이를 두 배로 올렸다. 캐릭터마다 박자와 위상을 조금씩 어긋나게 해서 다 같이 기계처럼 움직이지 않게도 했다.

그런데 결과가 영 어색했다. 평면 그림을 통째로 기울이면 몸을 푸는 게 아니라 그림이 바람에 흔들리는 것처럼 보였다. 어깨가 따로 없는 그림에서 “한쪽 어깨만 들썩이기”는 아무리 보정해도 흉내에 그쳤다. 직접 돌려 보고 “각도로 때운 티가 난다”는 판단이 들어서 이 방식을 접었다.

자세를 두 장씩 그렸다

결론은 단순했다. 기울여서 흉내 내지 말고, 동작의 처음과 끝 자세를 그냥 그리기로 했다. 캐릭터마다 몸풀기 동작 하나를 정하고 그 동작의 두 자세(A와 B)를 그렸다. 복서는 왼주먹 잽과 오른주먹 스트레이트, 두부는 팔 벌려 뛰기의 벌린 자세와 모은 자세, 요리사는 국자를 든 런지 좌우. 56종 × 2장 = 112장이 됐다.

복서와 두부 캐릭터가 각각 A 자세와 B 자세로 나란히 그려진 비교 그림. 복서는 왼팔과 오른팔을 번갈아 들고, 두부는 팔다리를 벌렸다 모은다

동작마다 A 자세(왼쪽)와 B 자세(오른쪽)를 그려 둔다. 복서는 잽과 스트레이트, 두부는 팔 벌려 뛰기.

한 장에 A를 왼쪽, B를 오른쪽에 나란히 그리게 해서 둘의 화풍과 크기를 맞췄다. 기준은 기존에 쓰던 캐릭터 그림(우유 수염이 그려진 0단계)이라, 같은 인물이 몸만 푸는 그림이 되도록 레퍼런스로 붙였다. 생성한 뒤에는 가운데 빈 줄에서 반으로 잘라 _a·_b 두 파일로 나누고, 몸통 덩어리 면적을 0단계와 같게 맞추고 발을 바닥 선에 붙이고 가로 무게중심을 정렬했다. A와 B가 같은 배율로 같은 자리에 서 있어야 번갈아 보여 줄 때 튀지 않는다.

좌우 대칭 동작 열두 종은 모델이 B를 A와 거의 똑같이 그려 놔서, A를 좌우로 뒤집어 B로 썼다. 소품이 반대 손으로 가긴 해도 동작은 정확히 좌우가 바뀐다. 감자는 배경에 엉뚱한 선이 끼어서, 택시기사는 어깨 으쓱이 약해서 다시 뽑았다. 한 장 평균 14KB, 112장을 합쳐도 1.6MB쯤이라 용량 부담은 작았다.

머리만 따로 따라 움직이게

가발이나 선글라스 같은 머리·얼굴 파츠는 원래 그림 위에 따로 얹는다. 자세를 바꾸면 머리 위치와 각도도 달라지는데, 파츠가 제자리에 붙어 있으면 허공에 뜬다. 그래서 각 자세 그림에서 0단계의 머리 부분(정수리부터 목까지)을 템플릿 매칭으로 찾았다. 회전은 ±50도, 배율은 0.7~1.5배까지 돌려 가며 맞추고, 우유 수염의 흰 자리와 눈·머리카락의 검은 자리가 맞는지도 확인했다. 찾은 각도와 배율로 파츠 앵커를 옮기니, 목 돌리기 자세에서는 가발과 선글라스도 같이 기울었다.

확신이 낮게 나온 19장은 그 그림에서 파츠를 아예 숨겼다. 엉뚱한 자리에 가발이 붙느니 없는 게 나아서다. 목에 거는 소품은 숙이거나 비트는 몸을 따라가지 못해 늘 뜨고, 손에 쥐는 소품은 자세마다 손 위치가 달라서, 둘 다 몸풀기 동안은 숨겼다.

숨 고르기가 시작되면 화면이 얼굴~가슴 구도에서 전신 구도로 0.35초에 걸쳐 부드럽게 빠진다. 다리 동작까지 보여야 해서다. 대신 발이 화면 아래 게이지 줄에 겹치므로 그동안 게이지 줄은 흐리게 처리했다.

멈춰야 할 때는 멈춘다

아줌마, 자전거아재, 할머니, 농부, 행사MC, 디제이 캐릭터가 저마다 다른 몸풀기 자세를 취한 낙서체 그림 모음

동작은 캐릭터 성격에 맞췄다. 자전거아재는 햄스트링 늘리기, 할머니는 무릎 돌리기, 농부는 쪼그려 앉았다 만세.

움직임은 A와 B를 캐릭터마다 0.5~0.8초 박자로, 서로 다른 위상으로 번갈아 보여 주는 게 전부다. 자세가 바뀌는 순간에만 0.09초 동안 발을 기준으로 살짝 눌렸다 펴서 갑자기 바뀐 티를 줄였다. 기울이고 늘이는 변형은 전부 없앴다. 움직임 줄이기를 켠 기기에서는 박자를 두 배로 늘리고 눌림도 뺀다.

몸풀기를 하면 안 되는 경우도 정해 뒀다. 그림이 아직 안 받아졌거나 그림이 없는 캐릭터는 도형으로 어설프게 흉내 내지 않고 그냥 가만히 둔다. 배탈 게이지가 3단계(90%) 이상인 사람은 몸풀기 대신 배를 부여잡은 그림을 그대로 쓴다 — 곧 화장실 갈 사람이 팔다리를 쭉쭉 뻗으면 이상하니까. 0~2단계는 멀쩡한 얼굴로 몸을 푼다. 그림은 방에 있는 사람 것만, 표정 그림을 다 받은 뒤에 이어서 미리 받는다.

돌아보면 “뼈대 없는 그림을 변형으로 움직인다”는 기술적 욕심을 버리고, 그냥 두 장을 더 그린 게 정답이었다. 112장을 더 그리는 품이 들었지만 결과는 비교가 안 됐다.

이 캐릭터들이 처음 어떻게 그려졌는지는 AI 이미지로 병맛 캐릭터 56종을 그린 과정에, 배탈 단계와 화장실 관전은 배탈 게이지와 화장실 관전에 적어 뒀다. 캐릭터들이 몸 푸는 모습은 랜선포차에서 직접 볼 수 있다.

#캐릭터 아트#애니메이션#랜선포차#아트 파이프라인#모션

함께 읽으면 좋은 글

전체 글 →