AI 이미지로 병맛 캐릭터 56종을 그린 과정
랜선포차의 무표정 낙서 캐릭터 56종과 파츠·배경을 AI 이미지 생성으로 만든 과정. 기준 그림 한 장, 마젠타 배경 크로마키, 네 번 다시 뽑은 마스크팩, 28MB를 4.1MB로 줄인 최적화까지 적었다.

랜선포차는 여섯 명이 화상 채팅 창처럼 2×3 그리드에 모이는 파티 게임이다. 창마다 사람 얼굴 대신 캐릭터가 서 있다. 이 캐릭터들은 전부 AI 이미지 생성으로 그렸다. 몸통 56종, 몸통마다 배탈 단계별 그림 5장, 파츠, 배경 5장까지 원본 이미지가 303장이다. 혼자서 이틀 안에 이 양을 그릴 수는 없어서 처음부터 “그림을 그리는 것”이 아니라 “그림이 나오는 공장을 만드는 것”을 목표로 잡았다.
화풍은 일부러 못 그린 그림으로
처음 정한 것은 화풍이었다. 잘 그린 그림은 여섯 개가 한 화면에 모였을 때 오히려 웃기지 않았다. 그래서 프롬프트 맨 앞에 붙는 공통 문장을 이렇게 썼다. “마우스로 그림판에 대충 그린 듯한 낙서, 두께가 들쭉날쭉한 굵은 검은 선, 명암 거의 없는 단색, 살짝 삐뚤어진 모양.” 그리고 모든 캐릭터에 같은 표정 규칙을 걸었다. 점 두 개 눈, 일자 입, 정면을 보는 무표정이다. 한국식 병맛 유머는 웃긴 상황을 진지한 얼굴로 할 때 산다고 봤다.
화풍을 문장으로만 정하면 56장이 제각각 나온다. 그래서 감자 한 장을 먼저 뽑아 기준 그림으로 삼았다. 생성 작업 목록을 세 단계로 나눴는데, 0단계는 감자 기본 그림 하나, 1단계는 나머지 몸통 55종의 기본 그림과 파츠·배경, 2단계는 몸통마다 배탈 단계 그림 4장이다. 1단계 작업은 감자를 “화풍 참고”로, 2단계 작업은 자기 기본 그림을 “같은 캐릭터 참고”로 첨부해서 보낸다. 참고 그림이 아직 없으면 그 작업은 기다렸다가 자동으로 시작한다.
| 단계 | 작업 | 참고 그림 |
|---|---|---|
| 0 | 감자 기본 그림 1장 | 없음 |
| 1 | 몸통 55종 기본 그림, 파츠 18종, 배경 5장 | 감자(화풍만) |
| 2 | 몸통 56종 × 배탈 단계 4장 | 자기 기본 그림(같은 캐릭터) |
배경을 빼고는 전부 같은 마젠타(#FF00FF) 한 색 바닥 위에 그리게 했다. 그라데이션, 바닥 그림자, 테두리도 금지했고, 캐릭터 몸에는 마젠타·분홍·보라를 쓰지 말라고 적었다. 투명 배경을 직접 달라고 하면 가장자리가 지저분하게 나와서, 배경을 한 색으로 받고 내가 빼는 쪽을 골랐다.
왼쪽이 생성된 원본, 오른쪽이 크로마키로 배경을 빼 사무실 배경에 올린 결과. 이 감자가 56종 전체의 화풍 기준이다
마젠타를 빼는 크로마키
배경 빼기는 파이썬으로 직접 짰다. 그림 테두리 픽셀의 중앙값을 키 색으로 잡고, 각 픽셀이 키 색에서 얼마나 떨어져 있는지로 투명도를 정한다. 거리 70 이하는 완전 투명, 150 이상은 완전 불투명, 그 사이는 비례다. 가장자리에 남는 분홍 기운은 빨강·파랑 값을 초록 값 근처로 눌러 없앴다.
몸통은 크기도 맞춰야 했다. AI는 같은 캐릭터라도 매번 조금씩 크게 또는 작게 그린다. 그래서 몸통 덩어리(가장 큰 연결 영역)의 면적을 기본 그림과 같게 맞추고, 가로 가운데·바닥 490픽셀 위치에 세웠다. 이게 없으면 배탈 단계가 바뀔 때마다 캐릭터가 커졌다 작아졌다 한다.
네 번 다시 뽑은 마스크팩
대부분은 한두 번 만에 쓸 만한 그림이 나왔지만, 얼굴 파츠 “마스크팩”은 네 번째에야 통과했다.
왼쪽부터 첫 시도 세 장은 버렸고, 오른쪽이 게임에 들어간 최종본이다
| 시도 | 결과 | 문제 |
|---|---|---|
| 1 | 배경이 투명으로 나옴 | 다음 단계가 마젠타 배경을 전제로 해서 쓸 수 없음 |
| 2 | 흰 시트에 마젠타가 얼룩덜룩 번짐 | 크로마키가 얼룩을 구멍으로 뚫음 |
| 3 | 회색 윤곽선만 있고 속이 빔 | 시트가 배경과 같은 색이 됨 |
| 4 | 속이 흰색으로 꽉 찬 시트 | 통과 |
흰 물체를 마젠타 위에 그리게 하면 AI가 흰색을 “반투명한 흰색”으로 해석하는 일이 잦았다. 네 번째 프롬프트에서는 “시트 안쪽 전체를 불투명한 순백색 물감으로 채운다(마젠타가 아님), 구멍으로만 배경이 보인다”고 못 박았다. 첫 번째처럼 투명 배경이 나오는 경우는 다른 그림에서도 가끔 있어서, 그 뒤로는 생성 직후 투명한 부분을 마젠타 위에 다시 얹는 처리를 파이프라인에 넣었다.
사람 캐릭터 50종의 규칙
음식·동물 6종 다음으로 사람 캐릭터 50종을 만들었다. 김부장, 김대리, 해녀, 도사, 요리사, 복학생 같은 인물이다. 사람 목록은 한 개의 JSON 파일에 이름, 희귀도, 기본 지급 여부, 한 줄 설명을 두고, 그림 스크립트와 음성 스크립트가 같은 파일을 읽는다. 캐릭터가 하나 늘면 그림과 떼창 음성이 같이 따라 만들어진다.
사람 그림에는 규칙을 세 개 더 걸었다. 첫째, 모두 성인이다. 머리가 전체 키의 4분의 1 정도인 성인 비율로 그리고, 아이처럼 보이는 2등신은 금지했다. 복학생은 첫 그림이 너무 앳되게 나와서 버렸고, 턱의 수염 자국과 눈 밑 다크서클을 설명에 넣어 다시 뽑았다.
왼쪽이 버린 첫 시도, 오른쪽이 최종본. 옷은 같고 얼굴 나이만 달라졌다
둘째, 실존 인물을 닮으면 안 된다. 모든 사람 프롬프트 끝에 “실제 연예인이나 실존 인물을 닮지 않은 가상의 사람”을 붙였다. 그런데도 원래 목록에 있던 가수 캐릭터는 이름부터 특정 인물을 떠올리게 했다. 그날 커밋 10d79a6의 메시지는 “엘비스 → 반짝이가수 교체”였다. 금색 반짝이 행사 재킷에 빨간 나비넥타이를 한 50대 트로트 가수로 바꾸고, 흰 점프수트·높이 올린 앞머리·구레나룻은 넣지 말라고 따로 적었다.
셋째, 오른손은 가슴 높이로 들고 비워 둔다. 게임에서 우유팩이나 마이크 같은 손 소품을 쥐여 줄 자리다. 들고 있는 소품이 설명에 있으면 왼손에 쥐게 했다.
옷 대신 목 소품
처음 계획에는 옷 파츠가 있었다. 막상 그려 보니 오징어, 두부, 비둘기, 고등어는 체형이 너무 달라서 옷 한 벌이 어디에도 맞지 않았다. 커밋 f109303에서 옷 칸을 없애고 목에 거는 작은 소품 6종으로 바꿨다. 넥타이, 나비넥타이, 사원증, 스카프, 금목걸이, 꽃목걸이다. 몸통 56종마다 목 위치와 배율을 따로 적어 두고, 소품의 윗부분 가운데가 그 점에 걸리게 했다.
머리 4, 얼굴 4, 목 6, 손 4. 파츠도 같은 감자 그림을 화풍 참고로 썼다
배경 5종. 캐릭터가 설 가운데는 비워 두고 대비를 낮게 그리게 했다
28MB를 4.1MB로
다 만들고 나니 공개 폴더의 아트가 28MB였다. 모바일 브라우저 게임에서 받기엔 너무 컸다. 캐릭터 커밋 dcbc6cc의 메시지에 이렇게 적혀 있다. “WebP 변환·몸통 384px 축소(28MB → 4.1MB)”. 몸통은 512픽셀로 만들어 두고 공개할 때 384픽셀 WebP로 줄였다. 화상 창 한 칸에 들어가는 크기라 이 정도면 충분했다. 여기에 방에 들어온 여섯 명의 그림만 대기실에서 미리 받게 해서, 56종 전부를 한꺼번에 받는 일도 없앴다.
돌아보면 그림 한 장 한 장보다 공통 규칙 문장, 기준 그림, 배경 빼기, 크기 맞추기 같은 “공장” 쪽에 시간이 더 들었다. 대신 공장이 한 번 돌아가자 캐릭터 한 종을 추가하는 일은 JSON 한 줄과 명령 한 번이 됐다. 이렇게 만든 캐릭터들로 모르는 사람 여섯 명이 모이는 게임은 랜선포차 소개 페이지에서 볼 수 있다. 같은 캐릭터 목록으로 떼창 음성을 만든 이야기는 TTS로 떼창 만들기에 이어서 적었다.


