2D 캐릭터 원화 레이어 자동 분할과 Spine 본 바인딩 자동화 실전 가이드

PSD 한 장으로 받은 2D 캐릭터 원화를 머리·팔·다리·의상 레이어로 자동 분할하고 Spine JSON에 본과 슬롯을 생성해 바인딩하는 파이프라인의 원리와 검수 기준을 정리합니다. 관절 깨짐과 피벗 오류를 줄이는 실무 절차까지 다룹니다.

✓ 복사 완료!
챕터일반 가이드
난이도중급
상태● 검토 완료
대상 엔진
Engine Agnostic
최종 업데이트
2D 캐릭터 원화 레이어 자동 분할과 Spine 본 바인딩 자동화 실전 가이드

핵심 요약

2D 캐릭터 원화 자동화의 핵심은 이미지를 단순히 잘라내는 것이 아니라 부위별 마스크를 만들고 관절 주변의 숨은 영역을 복원한 뒤 마스크의 위치와 크기에서 Spine 본·슬롯·피벗 정보를 생성하는 것입니다. 실무에서는 의미론적 분할, 알파 마스크 정리, 관절 보정, 좌표계 변환, 본 가중치 계산을 하나의 검수 가능한 파이프라인으로 구성해야 합니다.

단계입력주요 처리출력
1. 원화 분석PSD, PNG, TIFF레이어·알파·색상·선화 분석원본 메타데이터
2. 부위 분할합성 이미지 또는 레이어의미론적 분할, 연결 요소 분석부위별 마스크
3. 마스크 보정부위별 마스크팽창, 침식, Closing, 구멍 채우기애니메이션용 레이어
4. 관절 복원팔꿈치, 무릎, 어깨 영역오버랩 확장, 인페인팅, 경계 정리변형 가능한 레이어
5. 리깅 데이터 생성마스크와 랜드마크본 계층, 슬롯, 피벗, 가중치 계산Spine 어댑터 입력
6. 검수Spine 미리보기포즈 테스트와 자동 지표 검사승인 또는 수정 목록
flowchart LR
    A[PSD 또는 PNG] --> B[부위 분류]
    B --> C[알파 마스크 생성]
    C --> D[관절 영역 확장 및 보정]
    D --> E[본 계층과 피벗 계산]
    E --> F[슬롯 및 가중치 생성]
    F --> G[Spine 미리보기 검수]

1. 무엇을 자동화하고 무엇을 수동으로 남길까?

모든 캐릭터를 완전 자동으로 처리하려고 하면 머리카락과 장식물처럼 경계가 불명확한 요소에서 오류가 빠르게 누적됩니다. 따라서 자동화 대상과 아티스트 확인 대상을 분리하는 것이 안정적입니다.

자동화하기 좋은 영역수동 확인이 필요한 영역
부위별 초기 마스크 생성손가락, 머리카락, 얇은 끈
작은 노이즈 제거팔과 몸통이 겹치는 순서
파일명과 폴더 구조 생성관절 뒤에 필요한 숨은 그림
본 이름과 계층 초안 생성장식물의 독립 회전 여부
피벗과 바운드 계산변형 방식과 메시 밀도
가중치 정규화최종 포즈에서의 찌그러짐

이 구조의 목표는 아티스트의 판단을 없애는 것이 아니라 반복적인 픽셀 편집과 리깅 데이터 입력을 줄이는 것입니다. 특히 마스크가 틀린 상태에서 자동 바인딩을 실행하면 본 가중치도 함께 틀리므로 분할 결과를 먼저 검수해야 합니다.

2. 2D 원화 레이어 분할은 왜 자주 실패하는가?

2.1 PSD가 있다면 합성 이미지보다 원본 레이어를 우선 사용한다

PSD 원본에는 레이어 이름, 그룹 구조, 알파 채널, 블렌딩 모드가 남아 있습니다. head, torso, upper_arm_l, lower_arm_l처럼 명확한 이름이 이미 있다면 이미지 분할 모델보다 원본 레이어 메타데이터를 먼저 사용하는 편이 정확합니다.

다만 원화 레이어가 Layer 1, Paint copy 3처럼 정리되지 않았거나 여러 부위가 한 레이어에 합쳐져 있다면 합성 이미지 기반 분할이 필요합니다. 이때 분할 모델은 마스크의 초기 후보를 만드는 역할로 제한하고 최종 출력은 규칙 기반 후처리를 거쳐야 합니다.

2.2 분할 모델의 마스크를 그대로 Spine 레이어로 쓰지 않는다

일반적인 처리 순서는 다음과 같습니다.

  1. 이미지에서 캐릭터 전경을 추출한다.
  2. 머리, 몸통, 상완, 전완, 손, 허벅지, 종아리처럼 리깅 단위로 분류한다.
  3. 각 영역의 알파 마스크를 이진화한다.
  4. 연결 요소 분석으로 작은 노이즈를 제거한다.
  5. 관절과 가려진 부분을 확장한다.
  6. PNG와 메타데이터를 함께 저장한다.

초기 마스크에는 작은 구멍, 끊긴 외곽선, 불필요한 점, 다른 부위로 번진 픽셀이 포함될 수 있습니다. OpenCV를 사용한다면 Morphological Closing으로 작은 틈을 메우고 Connected Components로 최소 면적 미만의 영역을 제거할 수 있습니다.

import cv2
import numpy as np

def clean_mask(mask, min_area=200, close_size=5):
    kernel = np.ones((close_size, close_size), np.uint8)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    count, labels, stats, _ = cv2.connectedComponentsWithStats(mask, connectivity=8)
    result = np.zeros_like(mask)

    for label in range(1, count):
        area = stats[label, cv2.CC_STAT_AREA]
        if area >= min_area:
            result[labels == label] = 255

    return result

min_area와 close_size는 이미지 해상도에 따라 조정해야 합니다. 4K 원화에 200픽셀 기준을 그대로 적용하면 작은 장식물이 삭제될 수 있으므로 기준값을 이미지 대각선이나 캐릭터 높이에 비례시키는 방법이 좋습니다.

부위별 알파 마스크와 정리 전후를 비교한 2D 캐릭터 레이어 분할 예시

3. 관절이 깨지지 않도록 숨은 영역을 어떻게 복원할까?

레이어를 분할할 때 가장 중요한 문제는 가려진 픽셀입니다. 원화에서 몸통 뒤에 있는 팔이나 옷 주름은 실제로 그려져 있지 않을 수 있습니다. 이 상태로 팔을 회전시키면 빈 공간이 생기므로 관절 주변에 최소한의 숨은 그림을 추가해야 합니다.

3.1 관절 확장 영역을 별도 파라미터로 관리한다

각 관절에 다음과 같은 확장 파라미터를 둘 수 있습니다.

파라미터의미예시 초깃값
joint_pad_px관절 중심에서 마스크를 확장할 거리8~24px
overlap_px인접 레이어가 겹쳐야 하는 폭2~8px
inpaint_radius숨은 영역 복원 반경3~12px
min_component_area삭제할 최소 연결 영역해상도 비례
weight_power본 거리 가중치의 집중도1.5~3.0

확장 폭은 최종 게임 해상도가 아니라 원본 작업 해상도를 기준으로 계산하고 실제 런타임 해상도에서 다시 확인해야 합니다. 과도한 확장은 옷과 피부가 서로 비치는 문제를 만들 수 있으므로 레이어의 드로 오더와 함께 검수해야 합니다.

3.2 단순 복사보다 인페인팅과 대칭 복원을 조합한다

숨은 영역 복원은 다음 우선순위가 실용적입니다.

  • 같은 레이어 안의 주변 색과 텍스처를 복제한다.
  • 좌우 대칭이 가능한 부위는 반대편 픽셀을 참고한다.
  • 선화는 색칠 영역과 분리해 연속성을 유지한다.
  • 복원이 불가능한 부위는 자동 처리 대상에서 제외하고 아티스트 수정 목록으로 보낸다.

자동화 파이프라인은 복원된 픽셀을 원본과 구분할 수 있어야 합니다. 예를 들어 알파 마스크의 메타데이터에 generated_region: true를 기록하면 나중에 아티스트가 자동 생성 영역만 필터링해서 수정할 수 있습니다.

4. Spine 본 계층은 어떤 규칙으로 자동 생성할까?

본 계층은 이미지의 위치를 그대로 따라 만드는 것이 아니라 애니메이션 의도를 반영해야 합니다. 캐릭터마다 본 이름이 달라지면 애니메이션 재사용과 런타임 코드 연결이 어려워지므로 명명 규칙을 먼저 정합니다.

예를 들면 다음과 같은 계층을 사용할 수 있습니다.

root
└── body
    ├── head
    ├── arm_l
    │   ├── forearm_l
    │   └── hand_l
    ├── arm_r
    │   ├── forearm_r
    │   └── hand_r
    ├── leg_l
    │   ├── shin_l
    │   └── foot_l
    └── leg_r
        ├── shin_r
        └── foot_r

자동 생성기는 부위 라벨과 좌우 방향을 기준으로 본을 만들고 아티스트가 추가한 예외 규칙을 적용해야 합니다. hair_front, weapon, cloth_01 같은 장식물은 기본 계층에 억지로 포함하기보다 독립 본으로 만들지 여부를 설정 파일에서 선택하는 편이 안전합니다.

본 위치는 마스크의 바운딩 박스 중심만으로 계산하면 안 됩니다. 팔꿈치나 무릎처럼 회전축이 중요한 곳은 다음 정보 중 두 가지 이상을 함께 사용합니다.

  • 부위 마스크의 끝점
  • 인접 부위 마스크의 최근접점
  • 포즈 랜드마크
  • 아티스트가 지정한 관절 힌트
  • 캐릭터 비율에 따른 기본 관절 위치

5. Spine 슬롯과 피벗은 어떻게 자동 연결할까?

Spine에서 본은 변환을 담당하고 슬롯은 특정 본에 붙는 드로어블과 드로 순서를 관리합니다. 따라서 부위별 PNG를 만들었다고 자동으로 리깅이 끝나는 것은 아닙니다. 최소한 다음 매핑을 생성해야 합니다.

원화 리소스Spine 데이터
head.pnghead 본에 연결된 head 슬롯과 attachment
upper_arm_l.pngarm_l 본에 연결된 슬롯
lower_arm_l.pngforearm_l 본에 연결된 슬롯
coat_front.pngbody 또는 독립 의상 본의 슬롯
weapon.png손 본 또는 무기 본의 슬롯

5.1 좌표계 변환을 먼저 고정한다

이미지 좌표는 일반적으로 왼쪽 위가 원점이고 Y가 아래로 증가합니다. Spine 좌표는 프로젝트 설정과 내보내기 방식에 따라 기준점이 달라질 수 있으므로 변환 규칙을 한 곳에서만 적용해야 합니다.

다음은 이미지 피벗을 기준으로 한 전형적인 변환 예시입니다.

xspine=(xpx−pivotx)×scalex_{spine} = (x_{px} - pivot_x) \times scale yspine=(pivoty−ypx)×scaley_{spine} = (pivot_y - y_{px}) \times scale

scale은 픽셀을 Spine 단위로 바꾸는 비율입니다. 이 값을 아트 파이프라인 전체에서 고정하지 않으면 캐릭터 크기와 본 길이가 에셋마다 달라집니다.

5.2 피벗은 부위의 중심이 아니라 회전축으로 계산한다

머리나 몸통은 마스크 중심과 회전축이 비슷하지만 팔과 다리는 다릅니다. 팔의 피벗은 어깨 또는 팔꿈치에 가까워야 하며 손의 피벗은 손목이나 무기 그립에 맞춰야 합니다.

피벗 계산 규칙은 다음처럼 분리할 수 있습니다.

  1. 아티스트 힌트가 있으면 힌트를 최우선으로 사용한다.
  2. 힌트가 없으면 인접 본의 끝점과 마스크 경계를 분석한다.
  3. 계산된 피벗을 캐릭터 높이 대비 상대 좌표로 저장한다.
  4. 포즈 테스트에서 회전 후 빈틈과 과도한 겹침을 검사한다.

개념적인 Spine 데이터는 다음과 같은 형태입니다. 실제 생성 시에는 사용하는 Spine 버전의 JSON 스키마와 런타임 호환성을 확인해야 합니다.

{
  "bones": [
    {"name": "root"},
    {"name": "body", "parent": "root"},
    {"name": "head", "parent": "body", "x": 0, "y": 180},
    {"name": "arm_l", "parent": "body", "x": -42, "y": 120}
  ],
  "slots": [
    {"name": "body_slot", "bone": "body", "attachment": "body"},
    {"name": "head_slot", "bone": "head", "attachment": "head"},
    {"name": "arm_l_slot", "bone": "arm_l", "attachment": "upper_arm_l"}
  ]
}

이 데이터에 실제 이미지 attachment, 메시 정점, 가중치, 스킨 정보를 추가하는 어댑터를 별도로 두면 Spine 버전이 바뀌어도 분할 결과와 리깅 규칙을 재사용할 수 있습니다.

6. 본 가중치는 어떻게 자동 계산할까?

부위 전체를 하나의 본에 연결하는 Region Attachment(또는 가중치가 없는 Mesh Attachment)는 설정과 검수가 단순하지만 팔꿈치와 무릎에서 단절이 보일 수 있습니다. 반대로 가중치를 적용한 Mesh Attachment는 부드럽게 변형할 수 있지만 정점 수와 가중치 품질을 함께 관리해야 합니다.

6.1 Rigid Attachment와 Mesh Attachment 비교

방식장점단점적합한 부위
Region Attachment 또는 가중치 없는 Mesh Attachment생성과 검수가 단순함관절 회전 시 단절 가능머리, 신발, 무기
2본 혼합 가중치관절이 자연스럽게 이어짐가중치 조정이 필요함팔꿈치, 무릎
다중 본 Mesh복잡한 변형 표현데이터와 검수 비용이 큼치마, 긴 머리, 망토

거리 기반 가중치는 한 가지 휴리스틱으로, 각 메시 정점과 후보 본 사이의 거리를 이용해 계산할 수 있습니다. 본과 정점 사이의 거리를 d_i, 가중치 집중도를 p, 작은 수를 epsilon이라고 하면 다음과 같이 정규화합니다.

wi=(di+ϵ)−p∑j(dj+ϵ)−pw_i = \frac{(d_i + \epsilon)^{-p}}{\sum_j (d_j + \epsilon)^{-p}}

모든 정점에 모든 본을 적용하면 불필요한 변형이 생기므로 먼저 영향 후보를 제한해야 합니다. 일반적으로 가장 가까운 본 2~4개만 선택하고 몸통에서 멀리 떨어진 본의 영향은 제거합니다. 마지막에는 각 정점의 가중치 합이 1이 되도록 정규화합니다.

def normalize_weights(weights):
    if not weights:
        return []

    total = sum(weights)
    if total <= 1e-8:
        return [1.0] + [0.0] * (len(weights) - 1)
    return [value / total for value in weights]

자동 계산 후에는 팔꿈치와 무릎 주변의 가중치를 별도로 검사해야 합니다. 거리만으로 계산하면 몸통에 가까운 손가락이나 장식물이 몸통 본의 영향을 받는 사례가 생길 수 있습니다. 부위 라벨과 본 계층을 함께 사용해 금지된 영향 조합을 제거하는 것이 좋습니다.

7. 실제 자동화 파이프라인을 어떻게 구현할까?

Step 1. 입력 규격을 고정한다

입력 이미지의 색상 모드, 해상도, 투명도, 파일명 규칙을 정합니다. PSD를 읽는 단계와 합성 PNG를 읽는 단계를 분리하고 원본 파일은 덮어쓰지 않습니다.

권장 메타데이터 예시는 다음과 같습니다.

{
  "character_id": "hero_001",
  "canvas_size": [2048, 2048],
  "units_per_pixel": 0.01,
  "parts": [
    {"name": "head", "label": "head", "side": "center"},
    {"name": "upper_arm_l", "label": "upper_arm", "side": "left"}
  ]
}

Step 2. 부위 라벨과 마스크를 생성한다

PSD 레이어 이름을 먼저 파싱하고 이름이 불명확한 레이어만 이미지 분할 모델이나 색상 기반 규칙으로 처리합니다. 분할 모델을 사용하는 경우 모델 버전과 임계값을 함께 기록해야 동일한 입력에서 결과를 재현할 수 있습니다.

마스크는 흑백 PNG만 저장하지 말고 다음 정보를 함께 보관합니다.

  • 원본 캔버스 크기
  • 마스크의 바운딩 박스
  • 피벗 좌표
  • 부위 라벨
  • 좌우 방향
  • 생성 방식
  • 후처리 파라미터

Step 3. 관절 주변을 확장하고 픽셀을 복원한다

상완과 전완처럼 서로 맞닿는 레이어는 관절 방향으로 일정 폭을 확장합니다. 이때 외곽선을 무조건 늘리면 실루엣이 두꺼워질 수 있으므로 확장 영역을 관절 내부에 한정합니다.

Step 4. 본과 슬롯을 생성한다

부위 이름에서 본 이름과 슬롯 이름을 결정하고 부모 본을 계층 규칙으로 찾습니다. 본 생성 순서는 부모가 먼저 와야 하며 슬롯의 드로 순서는 원화의 앞뒤 관계를 반영해야 합니다.

Step 5. attachment와 가중치를 연결한다

Region Attachment 또는 가중치 없는 Mesh Attachment로 시작한 뒤 관절 부위에만 가중치를 적용한 Mesh Attachment를 쓰면 검수 비용을 줄일 수 있습니다. 메시를 자동 생성할 때는 마스크 외곽선을 그대로 정점으로 사용하지 말고 단순화 허용 오차를 적용해 불필요한 정점을 줄입니다.

Step 6. 포즈 테스트와 자동 검수를 실행한다

최소한 중립 포즈, 팔을 들어 올린 포즈, 무릎을 굽힌 포즈, 몸통을 비튼 포즈를 테스트합니다. 각 포즈에서 다음 지표를 수집합니다.

검수 지표검사 방법
빈틈인접 레이어 경계 사이의 투명 픽셀 탐지
과도한 겹침레이어 교차 면적과 기준값 비교
가중치 오류정점별 가중치 합이 1인지 확인
피벗 오류회전 전후 관절 중심 이동량 비교
드로 순서 오류손, 무기, 앞머리의 레이어 순서 확인
파일 오류PNG, atlas, JSON의 이름과 참조 일치 여부 확인

8. 자동 생성 결과는 어떤 기준으로 승인할까?

프로젝트마다 캐릭터 해상도와 아트 스타일이 다르므로 하나의 절대 기준을 정하기는 어렵습니다. 대신 팀의 초기 기준을 정하고 실제 오류 데이터를 통해 조정합니다.

예를 들어 다음과 같은 승인 정책을 사용할 수 있습니다.

  • 마스크의 작은 연결 요소는 자동 삭제하되 삭제 목록을 로그로 남긴다.
  • 관절 주변의 빈틈이 목표 해상도에서 보이면 자동 반려한다.
  • 가중치 합이 1에서 허용 오차를 벗어나면 export를 중단한다.
  • 본 이름, 슬롯 이름, attachment 이름이 규칙에 맞지 않으면 경고한다.
  • 자동 복원 영역이 일정 비율을 넘으면 아티스트 검수를 요구한다.

중요한 것은 실패를 조용히 통과시키지 않는 것입니다. 자동화 도구는 결과 파일만 만드는 프로그램이 아니라 어느 단계에서 신뢰도가 낮았는지 알려주는 검수 도구여야 합니다.

Spine에서 자동 생성된 본 계층과 관절 포즈를 검수하는 화면 예시

9. 자주 발생하는 문제와 해결 방법

문제원인해결 방법
팔을 돌리면 어깨에 빈틈이 생김숨은 영역을 복원하지 않음관절 내부를 joint_pad_px만큼 확장하고 픽셀 복원
머리카락이 몸통과 함께 움직임장식물의 본 영향 제한이 없음부위별 허용 본 목록을 지정
좌우 캐릭터 크기가 다름픽셀-단위 변환값이 에셋마다 다름units_per_pixel을 프로젝트 설정으로 고정
무기가 손에서 미끄러짐손 본의 피벗이 회전축과 다름그립 위치를 아티스트 힌트로 저장
관절이 부드럽지만 몸이 찌그러짐거리 기반 가중치가 너무 넓게 적용됨영향 본 수를 제한하고 금지 조합 제거
Spine에서 리소스를 찾지 못함파일명과 attachment 이름이 다름export 전 참조 무결성 검사
앞머리가 얼굴 뒤로 들어감슬롯 드로 순서가 원화와 다름슬롯 순서를 명시적인 레이어 순서로 생성

10. 성능과 유지보수는 어떻게 관리할까?

자동 분할과 바인딩은 대부분 오프라인 콘텐츠 제작 단계에서 실행되므로 런타임 성능보다 재현성과 검수 시간이 중요합니다. 처리 결과에는 입력 파일의 해시, 도구 버전, 파라미터, 생성 시각을 기록하면 같은 에셋을 다시 만들 때 원인을 추적하기 쉽습니다.

또한 다음 구성 요소를 하나의 거대한 스크립트로 묶지 않는 것이 좋습니다.

  • extract_layers: PSD와 이미지에서 원본 레이어 추출
  • segment_parts: 부위별 마스크 생성
  • clean_masks: 형태학적 후처리와 연결 요소 정리
  • repair_joints: 관절 확장과 숨은 영역 복원
  • build_rig: 본 계층, 슬롯, 피벗 생성
  • validate_rig: 포즈와 파일 참조 검사
  • export_spine: 프로젝트 버전에 맞는 출력 생성

이렇게 나누면 분할 모델을 바꾸더라도 본 생성 규칙을 유지할 수 있고 Spine 버전을 변경할 때도 export 어댑터만 수정할 수 있습니다.

자주 묻는 질문 (FAQ)

PSD 없이 PNG 한 장만 있어도 자동화할 수 있나요?

가능합니다. 다만 PNG에는 원래 레이어 경계와 가려진 픽셀이 없으므로 부위 분할과 관절 복원 단계의 오류가 커집니다. 결과를 완전 자동 확정하기보다 초기 마스크와 수정 목록을 생성하는 반자동 방식이 적합합니다.

모든 부위를 Mesh Attachment로 만들어야 하나요?

아닙니다. 머리, 신발, 무기처럼 형태가 단단한 부위는 Region Attachment나 가중치 없는 Mesh Attachment로 한 본에 연결할 수 있습니다. 팔꿈치, 무릎, 망토처럼 변형이 필요한 영역에만 메시 가중치를 적용하면 관리할 변형 정보를 줄일 수 있습니다.

Spine 버전이 바뀌면 자동화 도구를 다시 만들어야 하나요?

분할 결과, 본 규칙, 피벗 계산을 Spine 고유 코드와 분리하면 전체를 다시 만들 필요는 없습니다. 버전별 JSON 스키마, attachment 구조, atlas 규칙을 담당하는 export 어댑터만 교체하는 구조가 안전합니다.

정리

2D 캐릭터 원화의 레이어 분할과 Spine 본 바인딩 자동화는 이미지 처리 문제와 리깅 문제를 분리해서 설계해야 성공률이 높습니다. 원본 레이어와 메타데이터를 우선 활용하고 마스크 후처리와 관절 복원을 거친 뒤 좌표계·피벗·슬롯·가중치를 순서대로 생성해야 합니다.

가장 현실적인 목표는 완전 자동 생성보다 신뢰도 높은 초안과 명확한 검수 리포트를 만드는 것입니다. 이 구조를 갖추면 캐릭터 수가 늘어나도 반복적인 포토샵 분리와 Spine 수작업을 줄이면서 아티스트가 실제 연출과 변형 품질에 집중할 수 있습니다.