← 글

직접 만든 옷 갈아입히기 인형 공유: 설계도 한 장에서 3D까지

· 20 분 읽기 · 21 회 조회
3D VRM Tripo Blender three.js ElevenLabs Mixamo ChatGPT
AI 3D 옷 갈아입히기 인형

직접 만든 옷 갈아입히기 인형 공유

설계도 한 장에서 3D까지

Opus 5.5와 협업하며 검증한 워크플로입니다. ChatGPT, Tripo, Blender, three.js를 사용해 설계도 한 장으로 브라우저에서 옷을 갈아입고, 춤추고, 네 가지 언어로 말하는 3D 옷 갈아입히기 인형을 만들었습니다. 각 단계마다 방법, 검수 기준, 이유를 함께 적었습니다.

시작하며

설계도 한 장, 열 개의 단계

히나(陽菜) Hina|네 가지 스타일・중일영한 립싱크(voice: elevenlabs.io) · YouTube에서 열기 ↗

영상 속 주인공은 히나(陽菜) Hina이며, 네 가지 스타일로 각각 다른 언어를 말합니다. OL 정장 차림에서는 화를 내며 중국어, 아이돌 의상에서는 수줍어하며 일본어, 짧은 머리에서는 한국어, 원래 스타일에서는 영어를 말합니다. 히나는 3D 옷 갈아입히기 인형이고, VRM(3D 캐릭터에 많이 쓰이는 파일 형식)으로 저장했습니다. ChatGPT가 그린 설계도에서 시작해 2026-09-29에 작업을 시작했고, 10-05에 공개 버전을 완성했습니다. 중간에 Claude Code 사용량을 다 써서 며칠간 멈춰 있었습니다.

ChatGPT가 그린 콘셉트 이미지
ChatGPT가 그린 콘셉트 이미지
출발점: ChatGPT가 그린 설계도(정면, 양옆, 뒷면)
출발점: ChatGPT가 그린 설계도(정면, 양옆, 뒷면)

이 프로젝트는 처음부터 끝까지 Opus 5.5와 대화하며 진행했습니다. 이 글에서는 검증으로 알아낸 방법을 열 개의 단계로 정리했고, 각 단계는 세 칸으로 나뉩니다.

  • 방법: 그대로 따라 할 수 있는 절차
  • 검수: 수치로 확인할 수 있는 기준
  • 이유: 테스트하면서 겪은 일과, 그래서 이렇게 정하게 된 배경

사용한 도구는 다음과 같습니다. ChatGPT(설계도, 4면도), Tripo(3D 생성, 자동 리깅), Blender(조립 및 수정), three.js와 three-vrm(웹 렌더링), ElevenLabs(음성), wav2vec2(립싱크), Mixamo(모션)입니다.

역할 분담

저는 그림을 보고 결정하고, Opus 5.5가 실제 작업을 합니다

역할 분담은 첫날 정했고, 이후 바꾼 적이 없습니다.

  • 나: 디자인 방향을 결정합니다. 각 단계가 끝날 때마다 그림을 보고 통과 여부를 정합니다. Tripo 포인트를 쓰기 전에 승인합니다. 계정 로그인과 결제를 맡습니다
  • Opus 5.5: Blender, 측정, 웹 페이지용 코드를 작성하고 백그라운드에서 Blender를 실행합니다. ChatGPT와 Tripo의 웹 페이지를 조작합니다. 각 단계의 결과물로 비교 이미지를 만들어 저에게 보여 줍니다

그림을 확인할 때는 두 가지 규칙이 있습니다.

  • 검수용 이미지는 최소 1024 px로 하고, 얼굴은 따로 잘라 확대한 이미지를 한 장 더 준비합니다
  • 얼굴은 정면, 좌우 30°, 완전한 측면의 네 각도에서 확인합니다
첫 번째 시도: 왼쪽은 입력한 설계도, 오른쪽은 Tripo가 바로 생성한 얼굴
첫 번째 시도: 왼쪽은 입력한 설계도, 오른쪽은 Tripo가 바로 생성한 얼굴

이유

첫 번째 시도에서는 설계도 한 장으로 모델 전체를 한 번에 생성하려 했는데, 너무 허황된 생각이었습니다. 생성된 모델은 폴리곤 수가 부족했고 디테일도 모자랐습니다. 그래서 이후에는 머리, 머리카락, 몸을 따로 생성한 뒤 마지막에 합치는 방식으로 바꾸었습니다.

단계 1

먼저 품질 기준을 정합니다

방법

작업을 시작하기 전에 three-vrm 공식 샘플 모델을 같은 미리보기 웹 페이지에 넣고 스크린샷을 찍어, '이 정도 수준까지 만든다'는 목표를 먼저 정했습니다.

품질 기준: 왼쪽은 three-vrm 공식 샘플 모델, 오른쪽은 첫 번째 시도로 만든 히나
품질 기준: 왼쪽은 three-vrm 공식 샘플 모델, 오른쪽은 첫 번째 시도로 만든 히나

이유

첫 번째 시도에는 기준이 없어서, 다 만들고 웹페이지에 올려 보고서야 차이가 크다는 것을 알았습니다. 참고한 두 크리에이터도 모두 완성품이 아직 거칠다고 말했고, 그중 한 분의 말을 그대로 옮기면 "카메라를 가까이 당기면 버티지 못한다"였습니다. 기대치는 작업을 시작하기 전에 분명히 해 두어야 합니다.

단계 2

4면도 3세트 그리기

방법

  • ChatGPT에게 4면도(정면, 왼쪽, 오른쪽, 뒷면) 3세트를 그려 달라고 요청합니다:
  • 머리: 머리카락이 없는 민머리에 귀가 드러나게 합니다. 눈은 크게 뜨고 홍채 전체가 보이게 합니다. 입은 "아" 하고 벌려 위쪽 앞니와 혀가 보이게 합니다. 목은 쇄골 위에서 평평하게 자릅니다
  • 머리카락: 머리카락과 머리 장식만 있고 안쪽은 비어 있습니다
  • 몸: T자 자세로 세웁니다. 목은 머리와 같은 높이에서 자릅니다
  • 모든 이미지에 디자인 시안과 같은 각도의 뷰를 첨부하고, "첨부 이미지를 편집해 달라"고 요청합니다
  • 이미지 한 장마다 새 대화를 엽니다
  • 몸의 측면도에는 "팔이 카메라를 정면으로 향하게"라고 명시합니다
ChatGPT가 수정해 준 4면도 3세트입니다. 가로선은 네 장의 높이가 일치하는지 확인하는 데 사용합니다
ChatGPT가 수정해 준 4면도 3세트입니다. 가로선은 네 장의 높이가 일치하는지 확인하는 데 사용합니다
머리 4면도를 반투명하게 만들어 디자인 시안 위에 겹치고 윤곽을 대조합니다
머리 4면도를 반투명하게 만들어 디자인 시안 위에 겹치고 윤곽을 대조합니다
몸 4면도를 반투명하게 만들어 디자인 시안 위에 겹칩니다
몸 4면도를 반투명하게 만들어 디자인 시안 위에 겹칩니다

검수

  • 정수리, 턱, 어깨, 발바닥의 높이 차이가 네 장의 이미지 사이에서 이미지 높이의 2% 미만이어야 합니다
  • 왼쪽 측면도에서 캐릭터의 얼굴이 화면 왼쪽을 향해야 합니다
  • 네 장의 이미지에서 장신구 개수가 같아야 합니다

이유

  • 머리는 입을 벌린 상태로 생성해야 치아, 혀, 구강이 입체 메시가 됩니다. 입을 다무는 방향은 나중에 되돌려 만들 수 있지만, 입을 다문 머리로는 구강을 만들 수 없습니다
  • 텍스트 설명만으로 그린 머리카락 4면도는 헤어스타일이 설계 시안과 많이 달랐습니다
  • 같은 대화에서 이어서 측면을 생성하면 3/4 시점이 됩니다. 몸 측면을 명시하지 않으면 팔이 등 뒤로 뻗습니다
  • 설계 시안 자체가 모순되기도 합니다. 측면의 코끝은 눈에서 턱까지의 44% 위치인데, 정면에서는 27%입니다. 정면을 기준으로 삼았습니다
단계 3

Tripo로 생성하고, 텍스처는 마지막에 입힙니다

방법

  • Smart Mesh P2.0 멀티뷰로 부품을 하나씩 보냅니다: 머리 → 몸 → 머리카락. 부품당 100 포인트입니다
  • 전송하기 전에 매번 네 가지 항목을 다시 설정합니다: 모델 P2.0, 업로드 창의 두 번째 아이콘(멀티뷰), 면 수 25,000, 공개 설정 Private
  • 우선 메시만 생성합니다. 조립과 비율 수정을 모두 끝낸 뒤 마지막에 텍스처를 입히고(부품당 20 포인트), 정점 위치를 기준으로 UV를 수정된 메시로 옮깁니다
Tripo로 생성한 세 부품(텍스처 적용 전)
Tripo로 생성한 세 부품(텍스처 적용 전)

검수

다운로드한 뒤 면 수를 셉니다. 부품당 사각형 면이 약 25,000개여야 합니다. 5,000개뿐이라면 설정이 초기화된 것입니다.

이유

  • 페이지를 불러올 때마다 기본값으로 돌아가고, 면 수 기본값은 5,000이기 때문입니다
  • 업로드 창의 세 번째 아이콘은 일괄 모드로, 이미지 네 장에서 각각 모델을 하나씩 생성하며 300 포인트가 차감됩니다
  • 머리가 가장 어렵기 때문에 머리부터 생성하고, 마음에 들지 않으면 머리만 다시 뽑습니다
  • 실측해 보니 텍스처를 입혀도 메시는 바뀌지 않았습니다. 머리의 52,220개 면은 전부 찾을 수 있었고 정점 위치도 그대로이며, UV 이음선을 따라 분리될 뿐이었습니다. 따라서 메시는 먼저 안심하고 수정해도 됩니다
  • Left 칸에는 캐릭터 본인의 왼쪽 측면을 넣어야 합니다. 첫 번째 시도에서는 반대로 넣는 바람에 머리의 옆얼굴이 뒤통수에 생겨 360 포인트가 헛되이 사라졌습니다
단계 4

설계 시안의 높이에 맞춰 조립합니다

방법

  • 디자인 시안에서 정수리, 눈, 턱, 목 밑동의 픽셀 높이를 잽니다
  • 치맛단과 신발 밑창을 기준으로 미터로 환산하고(이번에는 픽셀당 0.785 mm), 그 높이에 맞춰 부품 세 개를 배치합니다
  • 행마다 모델과 시안의 실루엣 너비를 비교하여 차이표를 만듭니다
  • 한 번에 한 부위씩 고치고, 고친 뒤에는 표 전체를 다시 돌린 다음 다음 부위를 고칩니다
  • 앞면과 뒷면이 맞지 않을 때는 양쪽의 평균을 취합니다
4면도 감사: 모델 각 부품의 윤곽선을 시안 위에 겹쳐 행마다 너비를 비교합니다
4면도 감사: 모델 각 부품의 윤곽선을 시안 위에 겹쳐 행마다 너비를 비교합니다
모델을 반투명하게 해서 시안 위에 겹쳤습니다. 가로선은 높이를 비교하기 위한 기준선입니다
모델을 반투명하게 해서 시안 위에 겹쳤습니다. 가로선은 높이를 비교하기 위한 기준선입니다

검수

한 곳을 고칠 때마다 비교표를 다시 돌리고, 수정 전후 비교 이미지를 보여 주세요.

이유

  • 목 너비에 맞춰 스케일했더니 머리가 1.4배 커졌습니다. 생성된 목이 몸 쪽 부분보다 가늘었습니다
  • 첫 번째 비교표에는 십여 개 항목의 차이가 나열되었는데, 그중 두 항목은 잘못 잰 것이었습니다. 턱이 "22% 좁다"는 것은 눈으로 읽은 수치였고, 열마다 다시 재 보니 70 대 69 px였습니다. 발목이 "16% 가늘다"는 것은 신발 입구를 잰 것이었고, 모델의 해당 행은 아직 양말이었습니다. 차이가 말이 안 될 만큼 크면 먼저 잰 위치를 확인합니다
  • 시안의 앞면도와 뒷면도가 서로 어긋납니다. 같은 치마인데 앞면이 뒷면보다 10% 넓습니다
단계 5

이음매는 한 층씩 고칩니다

방법

머리와 몸은 목에서 이어지므로, 아래 순서대로 확인하고 수정합니다.

순서 층 점검 항목 수정 방법 이번 결과
1 지오메트리 경계를 따라 샘플링하여 틈을 측정합니다 몸의 절단면에 머리 쪽 링을 구성하는 각 정점을 보충합니다 0.19 mm → 0
2 법선(빛을 받는 방향) 이음매 양쪽 법선이 이루는 각도 이음매에는 양쪽의 평균 법선을 사용합니다 22.2° → 0.01°
3 텍스처 절단면 양쪽의 RGB 차이 몸 텍스처에서 피부색에 가까운 픽셀에 채널별로 게인을 곱합니다 (13, 9, 11) → (1, 1, 2)
4 가중치(어느 뼈를 따라 움직이는지) 일곱 가지 포즈에서의 최대 균열 머리의 가장자리를 몸의 가장자리에 붙이고, 가중치는 몸 기준으로 보간하며, 위쪽으로 15 mm에 걸쳐 원래 가중치로 다시 섞습니다 3.27 mm → 0.001 mm
5 외곽선 육안 이음매 1 cm 이내에는 외곽선을 그리지 않습니다 검은 선이 사라졌습니다
목 이음매 수정 전후입니다: 정면, 위를 올려다본 모습, 그리고 30° 돌린 두 각도
목 이음새 수정 전후: 정면, 위를 올려다본 모습, 그리고 30° 돌린 두 각도
회색 모델 위 이음새 명암선: 윗줄은 수정 전, 아랫줄은 최종본
회색 모델 위 이음새 명암선: 윗줄은 수정 전, 아랫줄은 최종본
고개를 숙였을 때 턱 아래의 주름: 1 이음새만 수정, 2 가중치 스무딩 추가, 3 법선 통일
고개를 숙였을 때 턱 아래의 주름: 1 이음새만 수정, 2 가중치 스무딩 추가, 3 법선 통일

이유

머리와 몸을 따로 생성했기 때문에 이음새는 모든 층에서 한 번씩 문제를 일으켰고, 앞 층을 고쳐야 다음 층의 문제가 보였습니다. 가중치는 두 차례 수정했습니다. 첫 번째는 고개를 들 때 갈라지는 문제, 두 번째는 고개를 숙일 때 턱 아래에 생기는 주름을 처리했습니다.

단계 6

리깅과 스프링 본

방법

  1. 전체를 4.5만 면으로 줄이고 Tripo Auto Rig(VRM 1.0 휴머노이드 본, 20 포인트)에 업로드합니다
  2. 다운로드한 뒤 90° 방향 4가지를 시도하고, ICP로 원래 위치에 맞춥니다
  3. 가장 가까운 면에서 보간하여 가중치를 전체 메시에 복사합니다
  4. 머리카락의 가중치는 모두 머리 본에만 연결되도록 설정합니다
  5. 스프링 본을 추가합니다. 머리카락은 머리를 둘러 20°마다 체인 1개(13개, 각 5마디), 치마는 골반 본을 둘러 30°마다 1개(12개, 각 3마디)입니다
  6. 치마의 좌우 절반은 높이에 따라 가중치 일부를 같은 쪽 허벅지에 나누고, 치맛단은 최대 절반까지 나눕니다
  7. 몸통 윤곽을 측정합니다(2 cm마다 한 층, 층마다 36방위). 웹에서 동작을 재생할 때 손이 윤곽 안으로 들어오면 상완을 바깥쪽으로 회전시키며, 한 번에 4°씩 최대 48°까지 돌립니다
Auto Rig로 리깅한 뒤의 포즈 확인: 팔을 45° 내리고 팔꿈치를 90° 굽힌 상태
Auto Rig로 리깅한 뒤의 포즈 확인: 팔을 45° 내리고 팔꿈치를 90° 굽힌 상태
머리카락에 스프링 본 추가: 윗줄은 T자, 아랫줄은 팔을 내린 상태, 오른쪽 네 칸은 흔들리는 중의 뒷모습
머리카락에 스프링 본 추가: 윗줄은 T자, 아랫줄은 팔을 내린 상태, 오른쪽 네 칸은 흔들리는 중의 뒷모습
치마 가중치를 허벅지에 나누고 손을 몸통에서 밀어내도록 함: 윗줄은 수정 전, 아랫줄은 수정 후
치마 가중치를 허벅지에 나누고 손을 몸통에서 밀어냅니다: 윗줄은 수정 전, 아랫줄은 수정 후
치마의 스프링 본: 정지 상태, 다리 30° 들기, 다리 57° 들기, 흔들리는 모습
치마의 스프링 본: 정지 상태, 다리 30° 들기, 다리 57° 들기, 흔들리는 모습
Mixamo 모션을 적용한 목록
Mixamo 모션을 적용한 목록

검수

  • 가중치가 없는 정점은 0개이고, 정렬 잔차는 약 1 mm입니다
  • 여섯 가지 포즈(팔 내리기 45°, 팔꿈치 90°, 무릎 60°, 허리 비틀기 20°, 고개 돌리기 30°, 끄덕임 15°)의 클로즈업입니다. 관절과 목이 깨지지 않습니다
  • 36개의 테스트 포즈에서 몸통에 파고든 손 정점이 976개에서 59개로 줄었습니다

이유

  • 15.7만 면의 모델 전체를 Auto Rig에 보내면 「Polygon Limit Exceeded」가 표시됩니다
  • Tripo는 업로드한 모델의 방향을 바꾸고 높이 1 m로 줄입니다
  • Tripo가 준 머리카락 가중치를 쓰면 팔을 내리자마자 앞머리가 끌려가서 구겨집니다
  • 치마는 20° × 4마디로 시험해 봤습니다. 치마 안감이 허벅지에 너무 붙어 있어서 콜라이더가 5 mm로 줄어들었고, 허벅지가 그대로 뚫고 나왔습니다
  • Mixamo의 모션은 다른 체형으로 만들어졌기 때문에 손이 가슴과 허리를 파고듭니다
단계 7

표정은 입을 벌린 상태에서 거꾸로 만듭니다

방법

  • 입을 다문 표정도 눈을 감은 표정도 입을 벌리고 눈을 뜬 모델에서 거꾸로 밀어서 셰이프 키(정점의 변위를 기록하는 변형)로 만들었습니다
  • 별도로 눈과 입을 감은 참조용 머리(100 포인트)를 생성하고, 정렬한 뒤 눈꺼풀과 입술이 그 표면의 깊이를 가져오게 하며, 주변으로 갈수록 점점 약해지게 했습니다
  • 눈꺼풀의 슬라이드는 조화장으로 풀고, 눈꺼풀의 단단한 부분과 아래 눈꺼풀, 바깥 둘레를 고정했습니다
  • 입술 사이의 치아 텍스처는 립스틱으로 덮어 가립니다. 두 입술 사이의 오목한 부분을 따라 얼굴 텍스처에 베이크하고, 입술선 위 2.2 mm 이내에서 입술색보다 밝은 픽셀을 먼저 입술색으로 덮습니다
  • 립스틱은 색상만 바꾸고, 원래 입술색의 명암은 그대로 유지합니다
따로 생성한 눈과 입을 감은 참조용 머리(100 포인트)에서 눈꺼풀과 입술의 깊이를 빌려 옵니다
따로 생성한 눈과 입을 감은 참조용 머리(100 포인트)에서 눈꺼풀과 입술의 깊이를 빌려 옵니다
눈 감기의 이전 두 버전: 윗줄은 눈구멍에 U자형 홈이 생겼고, 아랫줄은 매끈하게 펴 주니 부어오른 것처럼 보입니다
눈 감기의 이전 두 버전: 윗줄은 눈구멍에 U자형 홈이 생겼고, 아랫줄은 매끈하게 펴 주니 부어오른 것처럼 보입니다
옆에서만 보이는 윗입술의 돌출
옆에서만 보이는 윗입술의 돌출
텍스처에 구워 넣은 립스틱으로 두 입술 사이로 보이는 치아의 흰 테두리를 가립니다
텍스처에 구워 넣은 립스틱으로 두 입술 사이로 보이는 치아의 흰 테두리를 가립니다
표정 한눈에 보기: 입 다묾, 반쯤 감은 눈, 감은 눈, 입 반쯤 벌림, 입 끝까지 벌림. 윗줄은 정면, 아랫줄은 30° 회전한 모습입니다
표정 한눈에 보기: 입 다묾, 반쯤 감은 눈, 감은 눈, 입 반쯤 벌림, 입 끝까지 벌림. 윗줄은 정면, 아랫줄은 30° 회전한 모습입니다
입 벌림 0, 0.25, 0.5, 0.75, 1: 치아와 혀 모두 입술 밖으로 뚫고 나오지 않습니다
입 벌림 0, 0.25, 0.5, 0.75, 1: 치아와 혀 모두 입술 밖으로 뚫고 나오지 않습니다
립스틱은 입을 다물었을 때의 흰 테두리만 가리고, 입을 벌렸을 때 치아는 그대로 흰색입니다
립스틱은 입을 다물었을 때의 흰 테두리만 가리고, 입을 벌렸을 때 치아는 그대로 흰색입니다

검수

  • 입 다묾: 다섯 각도에서 입 안을 봤을 때 보이는 픽셀은 0입니다(대조군: 완전히 벌렸을 때 정면 10,854 px)
  • 입 벌림: 25%, 50%, 75%, 100%까지 벌려도 치아와 혀 모두 입술 밖으로 뚫고 나오지 않습니다
  • 눈 감김: 정면과 좌우 30°에서 드러나는 안구 틈을 셉니다(이번 확정판은 오른쪽 눈 0개, 왼쪽 눈 1–3개)
  • 모든 표정을 옆에서도 한 번씩 확인합니다

이유

  • 이 머리는 안구가 주변 피부보다 6 mm 더 깊이 들어가 있습니다. 눈꺼풀을 원래 깊이 그대로 아래로 내리면 눈구멍에 U자형 홈이 생기고, 매끈하게 펴 주면 이번에는 부어오른 것처럼 보입니다
  • 윗입술을 그대로 닫으면 6.4 mm 앞으로 튀어나오지만, 정면에서는 눈에 띄지 않습니다. 참조용 머리를 빌린 뒤에는 3.8 mm로 줄었고, 참조용 머리 자체는 4.0 mm입니다
  • Tripo는 윗니를 입을 벌린 텍스처에 그려 두었기 때문에, 입을 다물면 윗입술 아래쪽에 딱 겹쳐서 정면에서는 흰 테두리 한 줄로 보입니다. 립스틱을 베이크한 뒤에는 입술 선 위의 흰색 픽셀이 577개에서 0개로 줄었습니다
단계 8

옷 갈아입히기와 표정

방법

  • 옷: ChatGPT에 4면도를 새 옷으로 고쳐 그려 달라고 요청합니다 → Tripo로 T자 자세의 머리 없는 몸을 생성합니다 → ICP로 히나에 정렬합니다(매 회차마다 오차가 가장 큰 30%는 제외) → 각 정점이 히나 몸에서 가장 가까운 점의 가중치를 복사합니다(치마는 제외하고, 영향이 큰 뼈 네 개만 유지) → 목 절단면을 머리에 연결합니다
  • 헤어스타일: Tripo로 '머리+머리카락'을 생성하고, 히나의 머리를 그 머리 위에 겹쳐 정렬을 계산합니다. 머리카락은 이쪽으로 옮겨 와서 머리 본에 바인딩합니다
  • 화남, 부끄러움: 눈썹을 텍스처에서 오려 내 패치로 만들고, 원래 자리는 피부색으로 메웁니다. 부끄러움에는 홍조를 따로 추가합니다
현재의 헤어스타일과 의상은 자유롭게 조합할 수 있습니다
현재의 헤어스타일과 의상은 자유롭게 조합할 수 있습니다
표정: 맨 윗줄은 ChatGPT가 그린 목표 참고 이미지이고, 아래 두 줄은 웹페이지에서의 실제 결과(정면, 30° 회전)입니다
표정: 맨 윗줄은 ChatGPT가 그린 목표 참고 이미지이고, 아래 두 줄은 웹페이지에서의 실제 결과(정면, 30° 회전)입니다
ChatGPT로 다시 그린 옷 갈아입히기용 뷰: 아이돌 의상, OL 정장
ChatGPT로 다시 그린 옷 갈아입히기용 뷰: 아이돌 의상, OL 정장
Tripo로 생성한 머리 없는 의상 몸. 나중에 히나에 정렬합니다
Tripo로 생성한 머리 없는 의상 몸. 나중에 히나에 정렬합니다

검수

모든 의상을 웹페이지에서 실제로 입혀 보았고, 모든 표정을 웹페이지에서 한 번씩 전환해 보았습니다.

왜 그렇게 했는가

  • 한 번 몸에 리깅을 해 두면 옷이 그 가중치를 복사하기 때문에, 몇 벌을 갈아입혀도 다시 리깅할 필요가 없습니다
  • 눈썹을 피부에 그려 넣으면 피부가 2–4 mm 움직일 때 눈썹 꼬리 근처에서 22–47개의 삼각형이 뒤집힙니다
  • 보라색 곱슬머리는 만들었지만 얹지 않았습니다. 머리숱이 너무 적어서 대머리처럼 보였기 때문입니다

현재 헤어스타일은 하이 포니테일, 공주 머리, 짧은 머리 세 가지이고, 의상은 아이돌 의상과 OL 정장 두 벌이 있습니다.

단계 9

목소리와 립싱크

방법

  1. ElevenLabs의 Voice Design으로 텍스트로 음색을 묘사해 히나의 목소리를 생성하고, Eleven v4로 중국어, 일본어, 영어, 한국어 대사를 읽게 합니다(무료 플랜)
  2. wav2vec2(XLSR-53, 국제 음성 기호를 출력하는 버전)로 20 ms마다 소리를 하나씩 인식합니다
  3. 음소를 a, i, u, e, o 다섯 가지 입 모양으로 묶습니다. i, u로 시작하는 활음(「月」「亮」 같은 소리)은 뒤에 오는 모음의 입 모양을 사용합니다. b, p, m, f, v에서는 잠깐 입을 다뭅니다
  4. 입을 벌리는 크기는 음량으로 정하며, 닫힘, 반쯤 열림, 완전히 열림의 세 단계로 나누어 초당 30프레임으로 처리합니다
  5. 모델에는 입을 벌린 형태가 하나뿐입니다. i, e, o, u는 웹 페이지에서 그 형태로부터 만들어 냅니다. 입 벌림을 줄이고 입꼬리를 바깥으로 당기면 i, e가 되고, 안쪽으로 모으면서 앞으로 내밀면 o, u가 됩니다
  6. 자막은 ElevenLabs가 돌려주는 단어별 시간 정보를 사용하며, 언어마다 오프셋을 하나씩 보정합니다
네 가지 언어의 립싱크 영상 스크린샷입니다. 자막은 원문과 중국어 번체를 함께 표시했습니다
네 가지 언어의 립싱크 영상 스크린샷입니다. 자막은 원문과 중국어 번체를 함께 표시했습니다

검수

자막 시간은 소리와 맞아야 합니다. 「이 단어를 발음하는 중」과 「소리가 충분히 큼」이라는 두 타임라인을 어긋나게 해 가며 비교하여, 겹치는 구간이 가장 많은 오프셋을 선택했습니다. 이번 결과는 중국어가 0.24초, 한국어가 0.15초, 일본어가 0.12초, 영어가 0.04초 앞당겨진 값이었습니다.

이유

립싱크는 소리만 보기 때문에 네 가지 언어가 같은 프로그램을 공용으로 사용합니다. ElevenLabs가 돌려주는 시간은 실제 소리보다 늦으며, 얼마나 늦는지는 언어에 따라 다릅니다.

단계 10

웹 페이지에 올리기

방법

VRM을 내보내고, three.js와 three-vrm으로 웹페이지에서 실시간으로 렌더링합니다. Mixamo의 모션은 먼저 로컬에서 히나(陽菜)의 뼈대로 변환해 두었습니다. 완성본은 글 맨 아래에 있으며, 바로 즐기실 수 있습니다.

공개판에는 별도로 세 겹의 보호를 적용했습니다:

  • 텍스처는 256 px로 낮추고, 원본은 제 컴퓨터에만 보관합니다
  • 모델과 모션은 암호화하여 전송합니다
  • 텍스처에 눈에 보이지 않는 워터마크를 숨겨 두었습니다

웹페이지에서 돌려 볼 수 있는 모델은 결국 파일이 독자의 컴퓨터까지 전달됩니다. 이 세 겹의 보호는 진입 장벽을 높이는 정도에 그칩니다.

위쪽은 원본 텍스처, 아래쪽은 공개판의 256 px 텍스처입니다
위쪽은 원본 텍스처, 아래쪽은 공개판의 256 px 텍스처입니다

검수

라이선스는 하나하나 확인했습니다.

  • Mixamo: 상업적 이용은 가능하지만 원본 모션 파일은 배포할 수 없습니다. 공개판에는 변환한 모션만 넣었습니다. 이는 게임에서 하는 방식에 따라 제가 약관을 해석한 것이며, Adobe에는 확인하지 않았습니다
  • Bandai Namco 모션 데이터셋: CC BY-NC-ND. 다른 캐릭터에 적용하면 2차적 저작물에 해당하므로 공개판에는 넣지 않았습니다
  • ElevenLabs 무료 플랜: elevenlabs.io를 표기하며, 비영리입니다
비용

얼마나 들었나

기록이 남아 있는 현금 지출은 Tripo의 한 달 Pro 플랜뿐입니다. 월 요금은 CN¥140이고 첫 달은 30% 할인되어 실제 결제액은 CN¥98이었습니다. 2026-09-29에 결제했고 청구 기간은 9/29–10/29입니다. P2.0 모델을 내보내려면 Pro가 필요합니다.

Tripo 결제 영수증(영수증 번호, 청구서 번호, 카드번호 끝 4자리, 이메일은 가렸습니다)
Tripo 결제 영수증(영수증 번호, 청구서 번호, 카드번호 끝 4자리, 이메일은 가렸습니다)

포인트(기록이 남아 있는 부분만이며, 옷 갈아입히기 생성은 기록하지 않았습니다):

용도 포인트
머리, 몸, 머리카락의 메시 300
몸, 머리카락 텍스처(머리는 8K 시험 사용, 0 포인트) 40
Auto Rig 20
눈과 입을 감은 참조용 머리 100
첫 번째 시도는 좌우를 반대로 만들어서 무효가 되었습니다 360

그 밖의 도구: ElevenLabs 무료 플랜, Mixamo 무료, Blender와 three.js는 오픈소스 소프트웨어입니다. ChatGPT와 Opus 5.5의 구독료는 위의 현금 금액에 포함하지 않았습니다.

Opus 5.5가 이번 한 주 동안 작성한 코드와 수정은 총 93개의 commit입니다.

현재 상황

아직 끝내지 못한 것

현재 알려진 문제는 다음과 같습니다:

  • 눈을 감았을 때 바깥쪽 눈꼬리에 가느다란 조각이 생기고, 속눈썹이 다소 두꺼우며 뾰족한 부분이 몇 군데 있습니다. 왼쪽 눈은 옆에서 보면 안구 이음새가 1~3개 드러납니다
  • 고개를 숙이면서 돌리면 턱 아래에 옅은 주름이 아직 남아 있습니다
  • 오른쪽 입꼬리에 60°를 넘게 꺾인 작은 면이 2개 있습니다
  • 가까이에서 보면 아랫입술 아래에 미세한 알갱이가 보입니다
  • T자 자세에서는 팔이 머리카락을 뚫고 지나갑니다(공개 버전은 기본적으로 팔을 내린 상태입니다)
  • 아직 휴대폰에서 성능을 테스트하지 못했습니다. 공개 버전 페이지의 통계로는 삼각형 면이 약 27만 개이며, 외곽선 때문에 모델을 한 번 더 그리게 됩니다

다음 단계는 히나를 완전한 옷 갈아입히기 인형으로 만드는 것입니다. 아래 세 가지는 아직 모두 시도해 보지 않았습니다:

  1. 옷 갈아입히기 시스템
  2. 눈동자 색: 안구는 독립된 메시이므로 해당 텍스처의 색만 바꿀 계획입니다
  3. 표정: VRM 표준인 기쁨, 슬픔, 놀람, 편안함을 추가합니다
  4. 의상과 동작: 계속 추가합니다
  5. 체형과 얼굴형 만들기
  6. 키, 다리 길이, 머리와 얼굴 크기: 본을 스케일링할 계획입니다. 예상되는 위험은 비균등 스케일링으로 인해 얼굴과 손이 변형되는 것입니다
  7. 가슴둘레, 허리둘레, 엉덩이둘레, 얼굴 너비: shape key로 만들어 슬라이더로 조절할 계획입니다
  8. 옷: 모든 옷에 몸과 대응하는 shape key 세트가 하나씩 있어야 몸을 살찌웠을 때 옷도 함께 변합니다. 이 부분이 작업량이 가장 많을 것으로 예상합니다. 체형 슬라이더를 하나 추가할 때마다 모든 옷에 세트를 하나씩 더 만들어야 합니다
  9. webcam 모션 캡처: 브라우저 안에서 얼굴과 몸의 특징점을 감지하고, 이를 본 각도와 표정 가중치로 변환해 히나에게 실시간으로 적용할 계획입니다. 영상은 독자의 컴퓨터 안에서만 처리하며 업로드하지 않습니다
완성품

직접 해보기

드래그하면 시점을 돌릴 수 있고, 버튼으로 머리 모양, 옷, 표정을 바꿀 수 있습니다. 오른쪽 위 메뉴에는 38개의 동작이 있습니다. 모델이 그대로 다운로드될 위험을 줄이기 위해 웹 버전의 텍스처는 256 px로 낮췄습니다. 가까이에서 보면 조금 흐릿한데, 정상입니다.

저작권 고지

  • 히나 Hina의 캐릭터 디자인, 3D 모델, 텍스처, 표정, 옷 갈아입히기는 © 2026 JonesHong의 저작물입니다. 이 페이지에서 보는 용도로만 사용할 수 있으며, 다운로드, 재게시, 재배포, 개작은 허용되지 않습니다
  • 3D 메시와 텍스처: Tripo AI로 생성(tripo3d.ai)
  • 설계도와 4면도: ChatGPT(OpenAI)로 생성
  • 음성: ElevenLabs로 생성(elevenlabs.io)
  • 동작: Mixamo(© Adobe). 페이지에는 변환된 동작 데이터만 올려 두었으며 원본 파일은 제공하지 않습니다
  • 웹 렌더링: three.js(MIT, © three.js authors), @pixiv/three-vrm 및 @pixiv/three-vrm-animation(MIT, © pixiv Inc.)
  • 3D 편집: Blender(GNU GPL, Blender Foundation)
  • 립싱크: wav2vec2 XLSR-53 음소 인식 모델(Apache-2.0, Meta)
이 부분 가져가기

10단계를 여러분의 캐릭터 파일과 대조해 봅니다

따로 생성하기, 층별로 이음새 고치기, 표정은 옆모습으로 확인하기, 공개 전에 라이선스 확인하기. 이 네 가지가 가장 빠뜨리기 쉽습니다.

아래 내용을 사용 중인 AI에 붙여 넣어, 가지고 있는 3D 캐릭터와 대조하게 해 보세요.

이 글의 10단계 워크플로를 사용해서, 제가 가진 3D 캐릭터 파일(glTF 또는 VRM)을 점검해 주세요: https://blog.joneshong.com/zh/blog/hina-3d-playground 1. 면 수, 텍스처 크기, 본 개수, 표정(shape key 또는 VRM expression)을 읽어 내어 표로 정리해 주세요 2. 단계 2, 3과 대조해서, 머리·머리카락·몸을 따로 생성했는지, 4면도에서 높이 차이(2% 이내)와 좌우 방향을 확인했는지 저에게 물어봐 주세요 3. 단계 5와 대조해서, 머리와 몸이 별도 부품이라면 목 이음새부터 차례로 지오메트리 틈, 법선, 텍스처 색 차이, 가중치(고개를 들거나 숙일 때 갈라지지 않는지), 외곽선을 점검해 주세요 4. 단계 7과 대조해서, 입을 다문 표정이나 눈을 감은 표정이 있다면 정면, 좌우 30°, 완전한 옆면에서 한 번씩 확인하고 입안이나 안구가 드러나는지 알려 주세요 5. 단계 10과 대조해서, 웹페이지에 공개할 경우 소재(모델, 모션, 음성)별 라이선스를 나열하고, 원본 파일을 배포할 수 없는 것을 표시해 주세요 제가 정지 이미지 한 장만 필요하거나 캐릭터를 기존 캐릭터 메이킹 도구로 만들었다면, 이 워크플로가 필요 없다고 그대로 알려 주세요. 억지로 끼워 맞추지 마세요.
참고 자료

더 읽을거리

리소스왜 중요한가
Nano(@Dstudio_ai)의 제작 공유머리와 몸이 각각 2만 면이고, 절반 이상의 시간을 웨이트 페인팅에 쓰며, 얼굴 텍스처는 손으로 수정해야 합니다. 그래서 각 부품을 25,000면으로 설정했습니다.
お寿司職人(@SushiNFTart)의 장문 글머리카락, 머리, 몸 세 가지를 따로 생성하고, 입은 벌린 모델에서 거꾸로 작업합니다. 이 워크플로의 순서는 이 글에서 가져왔습니다.
three-vrm의 humanoidAnimation 예제Mixamo 모션을 VRM 스켈레톤으로 옮기는 방법입니다. 단계 10에서 모션을 미리 변환할 때 쓰는 것이 바로 이 변환 프로그램입니다.

추천 글

✦ 프롬프트 복사