AI는 Live2D를 리깅할 수 없습니다
그런데 결과는 의외로 괜찮았습니다
Live2D의 리깅은 편집기에서 마우스로만 조정할 수 있어 AI 에이전트가 끼어들 수 없습니다. 이번에는 Opus 5.5와 협업해 2D 애니메이션의 기초 상식만으로 일러스트 한 장을 고개를 돌리고, 눈을 깜빡이고, 말하고, 카메라를 따라 움직이는 2D 퍼펫으로 만들었습니다. 아홉 단계마다 방법, 검수 기준, 이유를 붙였고, 자주 묻는 질문은 밟은 함정의 유형별로 정리했습니다.
일러스트 한 장, 아홉 단계
먼저 해보고 싶다면 글 끝의「놀아보기」로 바로 넘어가세요. 카메라를 켜면 카노가 당신을 따라 움직입니다.

이 아이는 우파루파 소녀 카노(중국어로 花野, 영어로 Kano, 일본어로 カノ)입니다. 이름은 우파루파의 고향인 Xochimilco 호수에서 따왔고, 나와틀어로 「꽃밭」이라는 뜻입니다. 카노는 2D 퍼펫입니다. 일러스트 한 장을 83개 레이어로 나누었고, 고개를 돌리고, 눈을 깜빡이고, 말하고, 26가지 동작을 하며, 카메라 속의 당신을 따라 움직이기도 합니다.
프로젝트 전체에서 Live2D 편집기를 한 번도 열지 않았습니다. Live2D의 메시와 변형은 편집기에서 마우스로만 조정할 수 있고, 공식적으로 프로그램에서 메시를 고치는 인터페이스를 제공하지 않아 AI 에이전트가 끼어들 수 없습니다. 그래서 이번에는 2D 애니메이션의 기초 상식만으로 퍼펫 효과를 직접 재현했는데, 의외로 결과물이 괜찮았습니다. 역할 분담은 제가 그림을 보고 결정하고, Opus 5.5가 코드를 쓰고 수치를 재는 것이었습니다. 2026-10-08에 착수해 10-14에 웹페이지에 올렸습니다. 웹 버전은 일부러 텍스처를 줄였기 때문에 가까이서 보면 원본보다 조금 흐립니다(이유는 단계 9에 있습니다).
왜 Live2D 편집기를 쓰지 않았나
Live2D가 하는 일은 풀어 보면 모두 그래픽스의 기본기입니다. 메시 변형, 앞뒤 레이어의 시차, 뼈, 이미지 교체입니다. 편집기는 이것들을 마우스 조작으로 감싸 두었고, 공식이 외부 프로그램에 제공하는 인터페이스에는 메시 정점을 고치는 기능이 없습니다(2026-10 확인). 모델을 재생하는 Cubism Core는 프로그램에서 읽을 수 있어서, 단계 1에서 공식 샘플로 측정할 수 있었습니다. 이번에는 이것들을 코드로 하나씩 다시 써 넣었습니다.
| Live2D 작업 흐름에서 사람이 손으로 하는 일 | 이번에는 | 단계 |
|---|---|---|
| 일러스트레이터가 일러스트를 레이어가 나뉜 PSD로 그립니다 | 이미지 편집으로 가려진 부분을 보완하고, 레이어 분해 모델로 레이어를 나눕니다 | 2、3 |
| 고개를 돌리는 몇 가지 각도에서 마우스로 메시를 당겨 옆얼굴을 만듭니다 | 정점마다 깊이를 부여하고, 이동량은 프로그램이 계산합니다 | 1、4 |
| 팔에 회전 디포머를 겁니다 | 뼈 세 개로 구부리고, 큰 동작은 이미지를 교체합니다 | 5 |
| 파라미터의 키 값마다 입, 눈썹, 눈의 모양을 배치합니다 | 옵티컬 플로우로 입과 눈썹을 밀고, 눈은 깜빡일 때 교체합니다 | 6 |
| 타임라인에서 모션 곡선을 당깁니다 | 코드로 키프레임을 작성합니다 | 7 |
아홉 단계 한눈에 보기
| 단계 | 방법 | 검수 기준 | 도구 |
|---|---|---|---|
| 1 레퍼런스 측정 | 전문가 퍼펫이 고개를 돌릴 때 각 레이어가 얼마나 움직이는지 측정 | 비율표 한 장 | Cubism Core |
| 2 보완 | 가려진 부분은 이미지 편집으로 보완 | 스케일 차이 ≤ 3%, 회전 ≤ 1.5° | ChatGPT, OpenCV |
| 3 레이어 분해 | 모델이 레이어를 분해하고, 픽셀은 원본으로 되돌림 | 겹쳐 놓으면 차이 0.035/255 | See-through |
| 4 고개 돌리기 | 정점만 이동, 이미지 교체 없음 | 비율이 레퍼런스와 일치 | PixiJS |
| 5 팔 | 작은 각도는 구부리고, 큰 동작은 이미지 교체 | 손을 교체하는 프레임에 반투명 0 | ChatGPT |
| 6 표정 | 입과 눈썹은 밀어서, 눈은 깜빡일 때 교체 | 반투명 프레임 0장 | OpenCV 옵티컬 플로우 |
| 7 모션 | 전문가 작품의 리듬에 맞춰 키프레임을 직접 배치 | 26개 모션 모두 움직임 | — |
| 8 카메라 | 얼굴과 상반신을 두 경로로 추적 | 실제 사람 보정 8개 항목 모두 정답 | MediaPipe |
| 9 웹페이지에 올리기 | 공개 버전은 해상도를 낮추고 외부 연결을 차단 | 로딩 17.5 → 5.4초 | Cloudflare Workers |
고개 돌리기는 앞 단계의 결함을 처음으로 드러내는 단계입니다. 그리지 않은 부분이 드러나면 단계 2로 돌아가 보완하고, 두 번째 윤곽선이 나타나면 단계 3으로 돌아가 다시 분해합니다.
먼저 전문가 레퍼런스를 측정해 「비슷한가」를 숫자로 바꿉니다
작업에 들어가기 전에, 전문가 퍼펫이 고개를 돌릴 때 각 레이어가 얼마나 움직이는지 측정합니다.
방법
- Live2D 공식 Cubism Core로 휴머노이드 샘플 모델 12개를 불러와 고개 돌리기 파라미터를 끝까지 밀어 봅니다
- 얼굴 윤곽의 이동량을 1로 두고 각 레이어의 상대 이동량을 계산해, 12개의 중앙값을 취합니다
| 레이어 | 고개를 돌릴 때의 상대 이동량(얼굴 윤곽 = 1) |
|---|---|
| 뒷머리 | 0.06 |
| 귀 | 0.49 |
| 앞머리 | 1.25 |
| 눈 | 1.44 |
| 코 | 2.06 |
검수 기준
12개 모델의 방향이 모두 같았고, 카메라에 가까운 레이어일수록 많이 움직이며 뒷머리는 거의 움직이지 않습니다(2026-10-09 측정, 공식 샘플의 스타일만을 대표합니다).
이유
눈으로만 보면 「종이 조각 같다」는 것만 알 뿐, 어느 레이어를 고쳐야 하는지는 모릅니다. 비율표가 있으니 네 번째 버전에서 재 보자마자 뒷머리 0.40, 귀 0.90으로 앞뒤 층이 납작해졌다는 것이 보였습니다.
메인 이미지는 한 장, 가려진 부분은 따로 그립니다
정면 일러스트에는 머리카락 뒤나 팔 뒤에 있는 것이 없으므로 따로 그려야 합니다.
방법
- ChatGPT 이미지 편집으로 메인 이미지를 바탕 삼아, 한 장에 한 가지만 수정합니다
- 편집된 이미지는 ECC(이미지 정합 방법의 하나)로 메인 이미지에 맞춰 정렬하며, 정렬할 때는 수정하지 않은 부분만 봅니다

| 편집 | 보완할 것 |
|---|---|
| 민머리 | 머리 모양, 귀, 목 |
| 빈 얼굴 | 이목구비 밑의 얼굴 피부 |
| 뒷머리만 남김 | 앞머리에 가려진 머리카락 |
| 팔 제거 | 팔에 가려진 옷 |
| 눈 감음, 입 벌림 | 눈꺼풀, 구강 |
| 손 흔들기 등 손짓 6종 | 큰 동작의 팔(단계 5) |
검수 기준
정렬 후 스케일 차이는 3% 이내, 회전은 1.5° 이내, 수정하지 않은 부분의 평균 색 차이는 12/255 미만이어야 하며, 넘으면 다시 생성합니다.
이유
두 번째 버전에서는 수학적 곡면으로 정면 이미지에서 측면을 추정하려 했지만 새로운 정보는 나오지 않았고, 고개를 돌리면 종이 한 장이 도는 것처럼 보였습니다.
레이어 분해 후, 보이는 부분은 원본 이미지 픽셀로 되돌립니다
레이어 분해는 모델에 맡기고, 색은 원본만 따릅니다.
방법
- 메인 이미지와 단계 2의 편집 이미지를 레이어 분해 모델(이번에는 2026년 2월에 발표된 See-through)에 넣어 머리카락, 얼굴, 이목구비, 옷 등의 레이어로 분해합니다
- 각 레이어에서 보이는 영역의 픽셀은 모두 원본 이미지에서 다시 붙이고, 같은 픽셀은 가장 위의 레이어에만 줍니다
- 분류에 없는 부위(카노의 아가미)는 원본에서 어느 레이어에도 덮이지 않은 부분을 잘라 냅니다
- 각 레이어 캔버스에서 불투명도가 0.06 미만인 노이즈를 지웁니다

검수 기준
모든 레이어를 다시 겹치면 원본과의 평균 차이가 0.035/255이고, 구멍은 0픽셀입니다.
이유
레이어 분해 모델의 각 레이어는 다시 그려진 것입니다(위 그림 왼쪽에서 두 번째). 이목구비의 반투명 가장자리까지 아래의 얼굴 피부에 붙이면, 고개를 돌릴 때 얼굴에 두 번째 윤곽선이 남습니다.
고개 돌리기는 정점만 움직이고 이미지는 바꾸지 않습니다
이미지 레이어는 한 장도 교체하지 않고, 머리를 타원체로 보고 축을 중심으로 돌리며, 각 레이어는 비율표의 깊이에 따라 움직입니다.
방법
- 정점마다 깊이를 하나씩 부여하고, 레이어 간 앞뒤 거리는 단계 1의 비율표에서 역산합니다. 코가 가장 앞, 뒷머리가 가장 뒤입니다
- 목은 거의 움직이지 않고 턱이 목 위를 미끄러지듯 지나갑니다(공식 샘플에서 고개를 돌릴 때 목의 이동량은 0에 가깝습니다)

검수 기준
비율을 공식 샘플과 다시 대조했습니다. 뒷머리 −0.18, 귀 0.53, 눈 1.58, 코 2.00입니다. 고개 돌림 폭의 상한은 얼굴 너비의 16%로 잡았는데, 이보다 크면 비스듬히 돌릴 때 머리카락이 갈라집니다.
이유
각도 사이에서 다른 이미지로 페이드하면 얼굴에 잔상이 생기고, 레이어를 각자 평행 이동하면 머리가 목 위에서 미끄러져 목이 돌릴수록 길어집니다.
팔은 작은 각도만 구부리고, 큰 동작은 이미지를 한 장 교체합니다
내려뜨린 손은 수십 도 안에서만 구부리고, 손을 드는 것 같은 큰 동작은 따로 그린 이미지로 교체합니다.
방법
- 내려뜨린 손은 어깨, 팔꿈치, 손목 세 개의 뼈로 구부리고, 관절 근처의 메시를 촘촘하게 합니다
- 손 들기, 얼굴 가리기, 허리에 손 올리기 같은 자세는 각각 단계 2의 방법으로 이미지를 한 장씩 편집하며, 카노는 모두 6종입니다
- 교체할 때는 페이드하지 않습니다. 손이 먼저 자세 방향으로 휙 휘어지다가 중간의 한 프레임에서 그대로 교체되고, 새 손이 한 번 튕기며 자리를 잡습니다
- 손을 들 때 위팔은 0.55배로 줄어들고, 팔꿈치의 지점도 위로 따라 올라갑니다

검수 기준
초당 30프레임으로 한 프레임씩 확인해, 손이 교체되는 프레임 전후에 반투명한 손이 없어야 합니다.
이유
정면으로 그린 팔을 화면에서 100° 이상 돌리면 어떻게 해도 판지처럼 보입니다. 크로스페이드는 0.03초라도 초당 30프레임에서는 반투명한 그 프레임이 거의 틀림없이 찍힙니다.
표정은 밀어서 바꾸고, 눈은 깜빡이는 프레임에서 교체합니다
표정을 바꿀 때 페이드 인/아웃을 쓰지 않습니다. 입과 눈썹은 옵티컬 플로우로 밀어 옮기고, 눈은 깜빡이는 프레임에 숨겨서 교체합니다.
방법
- 표정만 바꾼 얼굴 11장을 생성하고, 단계 2의 기준으로 메인 이미지에 정렬합니다
- 옵티컬 플로우(두 이미지 사이에서 각 픽셀이 어떻게 움직였는지 계산하는 방법)로 원래 얼굴을 새 표정으로 밀어 옮깁니다
- 눈은 밀지 않습니다. 강제로 한 번 깜빡이게 하고, 눈이 감긴 프레임에서 얼굴과 눈을 함께 교체합니다. 11개 표정 중 9개가 이 경로를 따릅니다

검수 기준
이 9개 표정을 초당 30프레임으로 한 프레임씩 검사했습니다. 반투명은 0프레임, 얼굴과 눈은 같은 프레임에서 교체되고, 교체되는 프레임에서 눈은 99% 이상 감겨 있습니다.
이유
페이드 인/아웃을 쓰면 두 얼굴이 겹쳐 보입니다. 옵티컬 플로우는 입 모양과 눈썹은 밀 수 있지만, 원래 없던 것을 만들어 낼 수는 없습니다. 깜빡임은 눈 교체를 마침 숨겨 주고, 어차피 원래 일어나는 동작입니다.
모션은 전문가 작품의 리듬에 맞춰 직접 배치합니다
모션의 좋고 나쁨은 리듬에 달려 있습니다. 리듬은 전문가 작품에서 가져오고, 키프레임은 직접 배치합니다.
방법
- 공식 샘플의 모션을 보고 공통된 리듬을 정리하되, 어떤 곡선도 그대로 가져오지 않습니다
- 모션마다 키프레임을 직접 배치합니다. 머리, 몸, 시선, 아가미, 표정, 손짓에 타임라인을 하나씩 둡니다
- 기쁨 계열은 「힘 모으기 → 튀어 오르기 → 멈추기 → 머리카락이 따라 흔들리기」의 네 박자로 배치하고, 감정은 표정에 맡깁니다
- 모션에 필요한 표정과 손짓은 단계 5, 6에서 만들어 둔 세트를 적용합니다

검수 기준
26개 모션을 재생 1/4, 1/2, 3/4 지점에서 각각 샘플링했을 때 파라미터가 모두 움직였고 페이지 오류는 0건이었습니다. 직접 배치한 23개를 이전 곡선과 하나하나 비교하니, 이름이 같은 곡선 85개 중 원형 그대로인 것은 하나도 없었습니다.
이유
첫 버전의 환호는 감으로 배치했다가 통째로 반려됐습니다. 공식 모션 290개를 살펴보고 나서야 기쁨 계열에는 모두 고정된 네 박자가 있다는 것을 알았습니다. 처음에는 공식 곡선을 그대로 적용했는데 라이선스를 확인해 보니 안 되는 것이어서 전부 다시 배치해야 했습니다.
카메라 연결: 얼굴과 상반신을 두 경로로 나눕니다
얼굴과 몸이 각자 따로 움직이므로, 한쪽이 추적을 놓쳐도 다른 쪽은 계속 움직입니다.
방법
- 브라우저에서 추적 모델 두 개를 돌립니다. 하나는 얼굴, 하나는 몸을 봅니다
- 두 경로가 각자 중앙을 맞추고 각자 평활화합니다. 처음 1초간 정지한 자세를 정면으로 삼고, 이후에는 정면과의 차이를 측정합니다
- 방향은 거울처럼: 당신이 왼쪽으로 가면 카노도 화면에서 왼쪽으로 갑니다
- 팔의 작은 동작은 그대로 따라가며, 손 들기는 임계값을 넘겨 들고 잠시 멈춰야 단계 5의 자세 이미지로 교체됩니다
| 부위 | 방법 | 이유 |
|---|---|---|
| 머리 각도, 눈 깜빡임, 입, 눈썹 | 추적(얼굴 모델) | — |
| 귀, 어깨, 팔꿈치, 손목, 좌우 각각 | 추적(몸 모델, 8점) | — |
| 팔의 앞뒤 깊이 | 절반만 반영 | 곧게 든 팔뚝이 카메라를 향한 것으로 판정됨 |
| 옆으로 기울이기, 비틀기 | 상한 ±5°, ±12° | 퍼펫은 그 이상 돌릴 수 없음 |
| 골반, 다리 | 추적 안 함 | 노트북 카메라에 찍히지 않아 점이 제멋대로 떠다님 |
| 손가락 | 추적 안 함 | — |
검수 기준
실제 사람 보정 8개 항목의 방향이 모두 맞았습니다(어깨 으쓱, 좌우 옆으로 기울이기, 좌우 어깨 돌리기, 왼손 들기, 오른손 들기, 양손 수평으로 들기). 그 밖에 히나의 3D 모델로 알려진 동작의 테스트 영상을 찍어, 2D와 3D를 구간별로 비교했습니다.
이유
옆얼굴일 때 얼굴 모델이 추적을 놓치는데, 몸이 얼굴과 같은 경로에 묶여 있으면 손도 따라서 멈춥니다.
웹페이지에 올리기
웹페이지에 올리려면 먼저 세 가지를 해결해야 합니다. 원본을 그대로 내보낼 수 없다는 점, 로딩이 너무 느리다는 점, 그리고 몰래 외부로 연결하는 라이브러리가 하나 있다는 점입니다.
방법
- 공개 버전에는 보호 장치를 세 겹 따로 둡니다. 레이어별 텍스처의 가로·세로를 원본의 3분의 1로 줄이고 메시를 성기게 하며, 원본은 내 컴퓨터에만 둡니다. 에셋은 암호화한 뒤 조각내어 전송합니다. 각 레이어에는 보이지 않는 워터마크와 서명을 숨겨 둡니다
- 로딩할 때는 먼저 미리보기 이미지를 띄우고, 퍼펫이 준비되면 바꿉니다
- 텍스처는 무손실 WebP로 바꿉니다
- 추적용 라이브러리가 60초마다 사용량 통계를 외부로 보내는데 끄는 스위치가 없어서, 페이지 안에서 직접 응답해 버립니다
| 원본 | 공개 버전 | |
|---|---|---|
| 정점 | 15,495 | 8,254 |
| 텍스처 | 3.0 MB | 205 KB |
| 얼굴 레이어 | 281×316 px | 93×104 px |

검수 기준
- 20 Mbps로 속도를 제한했을 때, 전체 버전 로딩이 17.5초에서 5.4초로 줄었습니다(2026-10-12 측정)
- 카메라를 켜고 75초 동안 돌렸을 때 외부 요청은 0건입니다
- 공개 버전으로 바꾼 뒤 고정 자세 42개를 원본과 비교하면 윤곽 겹침이 최저 0.986입니다(2026-10-14 측정)
이유
웹에서 움직이는 퍼펫은 결국 파일이 독자의 컴퓨터에 도달합니다. 세 겹의 보호 장치는 문턱을 높일 뿐이며, 그 대가로 가까이서 보면 조금 흐립니다. 손실 압축은 레이어 가장자리에서 12~21/255만큼 차이가 나서 무손실을 썼습니다. 사용량 통계는 89 bytes에 불과하고 이미지도 없지만, 「영상이 브라우저를 떠나지 않는다」가 성립하려면 한 건도 보내서는 안 됩니다.
밟은 함정
작업하면서 만난 문제는 대부분 아래 일곱 가지 유형에 속합니다. 유형마다 나타나는 증상과 막는 법만 적습니다.
「이동」으로 해야 할 일을 페이드나 이미지 교체로 처리함
나타나는 증상: 이중상, 반투명한 프레임 하나, 입선 두 줄.
막는 법: 정점을 움직일 수 있으면 움직입니다. 이미지 교체가 불가피하면 눈 깜빡임이나 손을 휙 흔드는 프레임에 숨깁니다(단계 4–6).

화면에 없는 것을 만들어 내라고 요구함
나타나는 증상: 고개를 돌리면 종이 한 장이 도는 것 같고, 든 손은 판지 같고, 입을 크게 벌리면 입속에 고스트가 생깁니다.
막는 법: 가려진 부분은 먼저 보완하고, 구부릴 수 있는 범위를 넘는 동작은 이미지를 교체하며, 밀어서 나오지 않는 것은 억지로 밀지 않습니다(단계 2, 5, 6).
AI의 이미지 편집과 레이어 분해는 멋대로 다시 그림
나타나는 증상: 고치려 하지 않은 곳이 바뀌고, 분해된 레이어의 색이 원본과 다르고, 손이 한 쌍 더 생기고, 레이어 주위에 옅은 안개가 낍니다.
막는 법: 한 장에 한 가지만 수정하고, 정렬 기준으로 위치 이동과 스케일 변화를 걸러 내며, 내용을 잘못 그린 것은 사람이 눈으로 확인합니다. 픽셀은 항상 원본을 씁니다(단계 2, 3).

감으로 조정하고 증상만 고침
나타나는 증상: 「다르다」는 것만 알 뿐 어느 레이어를 고쳐야 할지 모릅니다. 같은 결함을 세 번 고쳤는데도 그대로입니다. 예를 들어 목이 돌릴수록 길어지는 경우입니다.
막는 법: 먼저 전문가 레퍼런스를 측정해 「비슷한가」를 숫자로 바꿉니다. 같은 곳을 두 번 고쳤는데도 그대로면 방법 자체를 바꿉니다. 예를 들어 평행 이동을 회전으로 바꿉니다(단계 1, 4).
추적 모델의 사각지대
나타나는 증상: 옆얼굴일 때 손도 멈추고, 화면 밖의 점이 제멋대로 떠다니고, 곧게 든 손이 카메라를 향한 것으로 판정되고, 옆으로 기울였을 뿐인데 퍼펫이 몸을 돌립니다.
막는 법: 얼굴과 몸을 두 경로로 나누고, 카메라에 찍히는 점만 추적하며, 불안정한 깊이는 할인하고, 할 수 없는 것은 제한으로 그대로 적습니다(단계 8).
놀아보기
- 「카메라」를 눌러 카메라를 켜면 카노가 따라서 고개를 돌리고, 눈을 깜빡이고, 손을 움직입니다. 영상은 당신의 브라우저 안에서만 처리됩니다
- 동작 버튼을 누르면 모션이 재생됩니다. 카메라를 켜지 않으면 카노는 커서를 바라봅니다
퍼펫이 그대로 다운로드될 위험을 낮추기 위해 웹 버전의 텍스처는 원본의 3분의 1로 줄였습니다. 가까이서 보면 조금 흐린데, 정상입니다.
저작권 고지
- 카노의 캐릭터 디자인, 레이어, 메시, 표정과 모션 © 2026 JonesHong. 이 페이지에서 보는 용도로만 제공되며, 다운로드, 재게시, 재배포, 2차 가공은 허용되지 않습니다
- 웹 렌더링: PixiJS(MIT)
- 카메라 추적: MediaPipe Tasks Vision 및 Face Landmarker, Pose Landmarker 모델(Apache-2.0, Google)
비율표를 당신의 캐릭터와 대조해 보세요
비율표, 가려진 부분 목록, 카메라의 8개 점. 이 세 가지가 자기 캐릭터와 대조해 보기에 가장 쉽습니다.
아래 내용을 AI에게 붙여 넣어, 가지고 있는 2D 캐릭터와 대조하게 해 보세요.
더 읽을거리
| 자료 | 중요한 이유 |
|---|---|
| 히나 편: 설계도 한 장에서 3D까지 | 3D 버전의 같은 「방법/검수 기준/이유」 구성입니다. 단계 8의 테스트 영상은 히나의 모델로 촬영했습니다 |
| See-through: Single-image Layer Decomposition for Anime Characters | 단계 3에서 쓴 레이어 분해 모델입니다. 이 모델이 분해한 레이어는 다시 그려진 것이라서, 단계 3에서 보이는 픽셀을 원본으로 바꿔 넣어야 했습니다 |
| Live2D 공식 샘플 모델 | 단계 1 비율표의 출처입니다. 12개를 함께 측정해야 「카메라에 가까울수록 많이 움직인다」가 특정 리거의 습관이 아니라 일반 원칙임을 알 수 있습니다 |