
게임 개발에서 1장짜리 일러스트 적 캐릭터를 AI로 자동 분할 및 Spine 애니메이션화하려다 한계를 느끼고 3D로 방침을 전환한 이야기
요약
1장의 일러스트를 AI로 자동 분할하여 Spine 애니메이션화하려던 파이프라인 구축 시도와 그 한계를 다룹니다. SAM3와 LaMa 등을 활용했으나, 일러스트의 복잡한 경계와 배경 보완(Inpaint)의 품질 문제로 인해 결국 3D 모델링으로 방침을 전환한 과정을 기록했습니다.
핵심 포인트
- VLM, Grounding DINO, SAM3를 조합한 2D 캐릭터 파츠 자동 추출 파이프라인 구축
- LaMa를 이용한 배경 영역 자동 보완(Inpaint) 시 발생하는 텍스처 품질 저하 문제
- 2D 이미지 분할 시 발생하는 경계 모호성 및 데이터 중복 할당의 한계
- 자동화 시도에도 불구하고 결국 수작업 보정이 필요해짐에 따른 3D 전환 결정
[!IMPORTANT]
이 기사는 AI (Antigravity / Gemini)에 의해 작성되었으며, Qiita API를 통해 자동 게시되었습니다.
개인 개발 중인 RPG (Lost Historia)에서, AI를 사용하여 "1장의 정지 화상 일러스트로부터 부위별로 자동 추출하고, 배경을 자동으로 보완하며, Spine으로 부드럽게 움직이게 하는" 완전 자동화 파이프라인을 구축하려고 했습니다.
결론부터 말하자면, **이 시도는 실패 (개발 동결)**로 끝났습니다.
하지만 그 과정에서 얻은 지견과, "왜 2D 상태로 처리하는 것을 포기하고 3D 모델화로 방침을 전환했는가"라는 프로세스가 흥미로웠기에 기록으로 남깁니다.
게임 개발에서 적 캐릭터를 매력적으로 보이게 하기 위해서는 애니메이션이 필수적입니다. 하지만 개인 개발에서 수십 마리의 캐릭터를 부위별로 수작업으로 나누고, 배경을 그려 넣으며, Spine으로 셋업하는 것은 엄청난 작업량이 됩니다.
그래서 최근의 강력한 생성 AI나 세그멘테이션 (Segmentation) 모델을 조합하여, 이 공정을 전자동화하는 파이프라인을 구축했습니다.
VLM을 통한 부위 계획 (GPT-4o / Qwen-VL 등)-
이미지를 분석시켜 "머리", "몸통", "오른팔", "왼팔", "무기" 등의 파츠 구성과, 그것들을 추출하기 위한 텍스트 프롬프트 (예: green goblin torso)를 자동 생성.
Grounding DINO를 통한 사각형 검출-
VLM이 생성한 텍스트 프롬프트를 바탕으로, 이미지 내 어디에 해당 파츠가 있는지 바운딩 박스 (Bounding Box, 사각형)로 검출합니다.
SAM3 (Segment Anything Model 3)를 통한 픽셀 단위의 잘라내기-
사각형 정보를 힌트로 삼아, 대상 파츠의 픽셀 레벨의 고정밀 마스크 (Mask)를 생성합니다.
LaMa를 통한 배경 영역의 자동 보완 (Inpaint)-
앞쪽의 파츠 (예를 들어 오른팔)를 잘라낸 후, 그 뒤에 숨겨져 있는 몸통 영역을 AI로 자동적으로 그려 넣습니다.
Spine용 JSON 출력-
잘라낸 각 파츠 이미지와 겹침 순서 (Z-order)를 포함한 구성을 그대로 Spine으로 임포트 가능한 형식으로 출력.
언뜻 보기에는 이것으로 완벽하게 자동화할 수 있을 것 같았습니다. 실제로 스크립트는 에러 없이 완주하였고, 파츠별 이미지가 출력되는 단계까지는 도달했습니다.
파이프라인 자체는 기술적으로 동작했지만, 나온 결과를 게임에 적용하려 했을 때, **"2D 이미지를 2D 상태 그대로 분할·추론하는 것의 구조적 한계"**에 직면했습니다.
사람의 눈에는 "여기서부터가 팔"이라고 이해되더라도, 일러스트의 화풍이나 장식에 따라 경계선은 모호합니다.
- 무기의 일부가 팔과 함께 잘려 나간다
- 머리와 몸통에 동일한 픽셀이 이중으로 할당된다
- 뾰족한 귀 끝부분만 사라진다
프로그램상에서 "겹침 비율이 〇% 이상이면 에러"와 같은 기계적인 QA (품질 보증) 게이트를 두더라도, 결국에는 수작업을 통한 마스크 미세 조정이나 프롬프트 조정이 캐릭터마다 필요하게 되어 자동화의 전제가 무너져 버렸습니다.
사진이라면 잘라낸 배경의 풍경을 LaMa 등으로 이질감 없이 Inpaint 하는 것이 가능합니다. 하지만 손으로 그린 일러스트나 게임용 스프라이트 (Sprite)의 경우, 뒤에 숨겨진 영역 (예를 들어 팔에 가려진 갑옷의 장식)을 AI에게 예측하게 하면, **"주변 픽셀을 적당히 흐리게 섞은 듯한, 찰흙 같은 텍스처"**가 생성되어 버립니다.
Spine으로 애니메이션을 시킨 순간, 앞쪽의 파츠가 움직이면 그 뒤에서 "파손된 텍스처"가 노출되어 버려, 게임의 퀄리티로서 도저히 사용할 수 없는 수준이었습니다.
설령 완벽하게 잘라내기와 배경 보완이 되었다고 가정해 봅시다. 하지만 캐릭터의 골격이나 프로포션 (Proportion)은 제각각 다르기 때문에, Spine 상에서의 본 배치 (Rigging, 리깅)나 모션 제작은 결국 캐릭터마다 수작업으로 수행해야 하는 문제가 남았습니다.
"2D 일러스트를 억지로 2D 레이어로 분할하려고 하니까, 보이지 않는 부분의 파손이나 겹침이 문제가 되는 것이다"라는 것을 깨닫고, 완전히 다른 접근 방식으로 방향을 틀기로 했습니다.
그것이 바로, **"1장짜리 그림에서 직접 3D 모델 (Mesh)을 생성하고, 게임 내에서 '라이팅 없는 (Unlit) 2D 스프라이트'로서 움직이게 한다"**는 방침입니다.
-
image-to-3D를 통한 형상 생성 (Hunyuan3D-2 등) - 1장의 일러스트로부터 AI를 사용하여 베이스가 되는 3D 메쉬 (Mesh)를 생성.
-
실루엣의 자동 성형 - 3D 모델을 정면에서 보았을 때의 실루엣이 원래의 2D 일러스트와 완전히 일치하도록, 복셀 (Voxel) 처리를 사용하여 불필요한 부풀어 오름을 깎아내거나 결손된 부분을 보완한다.
-
투영 베이크 (Planar Projection Bake) - 생성된 3D 모델에 대해 원래의 일러스트를 그대로 정면에서 "텍스처로서 투영 (Bake)"한다.
-
게임 엔진 (Axmol)에서의 Unlit 렌더링 - 3D 모델에 빛을 비추지 않고 (쉐이더 무효화), 텍스처의 색상을 그대로 표시한다. 이를 통해 측면 시점 (2D 게임 시점)에서는 원래의 일러스트와 완전히 동일한 화풍을 재현할 수 있다.
-
보이지 않는 영역의 문제가 자연스럽게 해결: 3D이므로 "팔 뒤쪽의 몸통"은 처음부터 입체로서 존재하며, 인페인트 (Inpaint) 특유의 기괴한 텍스처 깨짐 현상이 발생하지 않는다.
-
리그 (Rig)와 모션의 재사용 가능: 고블린, 오크, 스켈레톤 등 동일한 "휴머노이드 (Humanoid)"라면, 하나의 3D 리그와 모션 (대기, 공격, 사망 등)을 그대로 유용할 수 있다.
-
2D 특유의 "화풍" 유지: Unlit으로 렌더링함으로써 AI가 생성한 3D 모델 특유의 "밋밋함"이나 "CG 같은 느낌"을 지우고, 손으로 그린 일러스트 그대로의 느낌으로 게임에 내보낼 수 있다.
현재 이 "PoC-A (정적 모델의 생성과 Unlit 표시)" 단계까지 검증이 진행되었으며, 정면에서 보면 원래의 일러스트와 구분이 가지 않을 수준으로 게임 엔진 상에 배치할 수 있음을 확인했습니다.
"2D 일러스트를 움직이고 싶다면 2D로 처리해야 한다"라는 고정관념에 얽매여 있었으나, 생성 AI의 진화로 인해 "일단 3D 모델로 만들어 버린다"라는 무식한 방법이 결과적으로 가장 범용성이 높고 품질을 담보하기 쉽다는 것을 깨달았습니다.
그렇다고는 해도, 이 3D화 접근 방식에 대한 연구는 이제 막 시작되었을 뿐이며 완성 단계에 이르지는 않았습니다.
향후에는 생성된 3D 메쉬에 자동으로 뼈대를 심고 (Auto-rig), 공통 모션을 주입하는 "PoC-B" 검증을 진행할 예정입니다.
마찬가지로 "1장의 그림으로부터 대량의 적 캐릭터를 양산하여 움직이고 싶다"라고 생각하는 개인 개발자분들에게, Spine을 이용한 2D 분할에 대한 집착을 한 번 내려놓고 image-to-3D + Unlit 렌더링으로 전환하는 접근 방식이 어떤 힌트가 된다면 좋겠습니다. 다음 진척 사항이 있으면 다시 글로 전해드리겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기