MMD 모델을 바탕화면 캐릭터로: PMX를 VRM 1.0으로 바꾸는 전 과정
마음에 드는 PMX 모델을 구했는데 쓰려는 앱이 .vrm만 받는다면, 파일 이름을 바꾸는 것으로는 아무것도 해결되지 않습니다. 이 글은 블렌더와 VRM Add-on으로 PMX를 VRM 1.0으로 바꾸는 전 과정을 다룹니다. 뼈대를 VRM Humanoid에 연결하는 단계부터 표정, MToon 재질, SpringBone 물리, 메타 정보 입력, 내보내기, 그리고 Windows의 AniMate에 가져오기까지 순서대로 정리했습니다.
PMX를 VRM으로 바꾸면 무엇이 달라지나
PMX는 MMD(MikuMikuDance) 생태계의 표준 모델 형식입니다. 뼈대와 모프(morph), 재질, 물리가 MMD 애니메이션에 맞춰 조율되어 있어서 춤 영상을 만들 때는 뛰어나지만, 그 밖의 용도에서는 다루기 까다롭습니다. 요즘 캐릭터 앱과 플랫폼은 서로 주고받을 수 있는 아바타 파일을 원합니다.
VRM은 가상 캐릭터를 위해 설계된 공개 3D 형식입니다. VTuber 도구, VRChat류 소셜 플랫폼, 그리고 AniMate 같은 데스크톱 컴패니언 앱이 폭넓게 지원합니다. 한 번 변환해 두면 같은 모델을 여러 곳에서 다시 쓸 수 있습니다.
- 눈을 깜빡이고, 마우스에 반응하고, 대기 모션을 하고, 춤추면서 창 옆에 머무는 데스크톱 컴패니언으로 쓸 수 있습니다.
- VTube Studio, Warudo 같은 VTuber 제작 도구에서 쓸 수 있습니다.
- VR 소셜 플랫폼과 아바타 공유 커뮤니티에 올릴 수 있습니다.
- VRM 표준을 따르는 다른 앱과 앞으로 나올 도구에서도 그대로 통합니다.
정리하면 PMX는 MMD 파이프라인에 속한 형식이고, VRM은 옮겨 다니도록 만들어진 형식입니다.
한국에서는 시메지나 Desktop Mate, 버튜버 콘텐츠를 먼저 접한 뒤 VRM이라는 이름을 알게 되는 경우가 많습니다. 그다음 단계에서 "내가 이미 가진 MMD 모델을 쓰고 싶다"는 요구가 생기고, 여기서 PMX VRM 변환이 필요해집니다. 데스크톱 펫을 처음 시작한다면 시작하기 가이드를 먼저 읽고, 앱 선택이 고민된다면 Desktop Mate 대안 비교나 시메지 대안 정리를 참고하세요.
변환 경로 두 가지: 블렌더와 Unity
PMX를 VRM으로 옮기는 길은 크게 두 가지입니다. 둘 다 최종 결과물은 같은 VRM이지만, 작업 방식과 난이도가 다릅니다.
| 경로 | 도구 | 잘 맞는 경우 | 난이도 | 권장 |
|---|---|---|---|---|
| 경로 A: 블렌더 | Blender + VRM Add-on + MMD Tools | 처음 변환하는 사람, 화면 패널에서 클릭하며 작업하는 방식을 선호하는 사람 | 초보도 가능 | 권장 |
| 경로 B: Unity | Unity + MMD4Mecanim + UniVRM | Unity에 이미 익숙하고 충돌체를 세밀하게 다뤄야 하는 사람 | 중급 | 필요할 때만 |
PMX를 열기 전에 알아둘 VRM 1.0의 구조
블렌더를 열기 전에 VRM 파일 안에 무엇이 들어 있는지 몇 분만 살펴보세요. 변환 중에 생기는 문제의 대부분은 PMX의 개념을 엉뚱한 VRM 하위 시스템에 밀어 넣을 때 발생합니다. 구조를 알고 있으면 뒤에서 "왜 이 단계를 해야 하지"라는 의문이 사라집니다.
VRM은 glTF 2.0에 확장을 얹은 형식입니다
VRM은 처음부터 새로 발명한 형식이 아닙니다. Khronos Group이 3D 자산 전송을 위해 만든 glTF 2.0 위에 세워졌습니다. .vrm 파일은 사실상 .glb 이진 파일이고, glTF의 확장 필드에 VRM 전용 데이터를 선언합니다.
extensionsUsed: [
"VRMC_vrm", // VRM 핵심
"VRMC_materials_mtoon", // 애니메/셀 재질
"VRMC_springBone", // 스프링 본 물리
"VRMC_node_constraint", // 노드 제약
"KHR_materials_unlit", // 언릿 보조
"KHR_texture_transform", // 텍스처 변환 보조
]
이 확장들을 구현한 렌더러라면 glTF 2.0을 지원하는 어떤 앱에서도 VRM을 읽을 수 있습니다. 데스크톱 앱, VTuber 소프트웨어, 소셜 플랫폼에서 같은 파일이 통하는 이유가 바로 이 공통 기반입니다.
VRM을 구성하는 다섯 가지 핵심 요소
| 하위 시스템 | 필드 | 역할 | 필수 |
|---|---|---|---|
| Humanoid | humanoid | glTF 노드를 표준 인간형 뼈대로 연결합니다 | 필수 |
| Meta | meta | 모델 이름, 제작자, 버전, 라이선스를 담습니다 | 필수 |
| FirstPerson | firstPerson | VR 1인칭 시점에서 머리 메시를 보일지 정합니다 | 선택 |
| Expressions | expressions | 표정 시스템입니다. VRM 0.x에서는 BlendShape라고 불렀습니다 | 선택 |
| LookAt | lookAt | 목표를 향해 눈을 움직입니다 | 선택 |
VRM이 한 프레임에 계산하는 순서
VRM 명세는 매 프레임마다 하위 시스템을 계산하는 순서를 엄격하게 정해 둡니다. 표정이 깜빡임과 부딪히거나, 이유 없이 스프링 본이 떨린다면 원인은 대개 이 순서에 있습니다.
1. Humanoid 뼈대 계산
| (머리 위치가 정해짐)
2. LookAt 계산
| (뼈대가 눈을 회전시키거나 표정 가중치를 설정)
3. 표정 갱신
| (외부 입력 -> LipSync -> AutoBlink -> LookAt 표정)
4. 표정 적용
| (모든 표정 가중치를 모은 뒤 한 번에 적용)
5. 제약(Constraint) 계산
| (회전 제약, IK 제약 등)
6. Spring Bone 계산
VRM 0.x와 VRM 1.0의 차이
| 항목 | VRM 0.x | VRM 1.0 |
|---|---|---|
| 표정 이름 체계 | BlendShape | Expression |
| 표정 가중치 범위 | 0~100 | 0~1 |
| 감정 이름 | joy, sorrow, fun | happy, sad, relaxed |
| 놀람 표정 | 없음 | surprised |
| 표정 바인딩 | 대부분 MorphTarget | MorphTargetBind + MaterialColorBind + TextureTransformBind |
| 충돌 처리 | 정의되지 않음 | block / blend 모드를 갖춘 Override 시스템 |
| 확장 접두사 | 일관되지 않음 | VRMC_ |
| chest 뼈대 | 필수 | 선택 |
| neck 뼈대 | 필수 | 선택 |
공식 자료
| 자료 | 주소 | 용도 |
|---|---|---|
| VRM 공식 사이트 | vrm.dev | 형식 개요, 도구, 사례 소개 |
| VRM 명세 저장소 | github.com/vrm-c/vrm-specification | JSON 스키마와 문서를 포함한 전체 기술 명세 |
| UniVRM | github.com/vrm-c/UniVRM | Unity용 가져오기/내보내기 구현 |
| VRM Add-on for Blender | github.com/saturday06/VRM-Addon-for-Blender | 블렌더용 가져오기/내보내기 부가 기능 |
1단계: 블렌더와 부가 기능 설치하기
먼저 도구를 준비합니다. 블렌더 본체, VRM 내보내기를 담당하는 부가 기능, PMX를 읽어 오는 부가 기능까지 세 가지가 기본입니다.
| 도구 | 버전 | 받는 곳 |
|---|---|---|
| Blender | 3.6 이상, 가능하면 4.2 이상 | blender.org |
| VRM Add-on for Blender | 최신 버전 | GitHub |
| MMD Tools | 최신 버전 | 블렌더 부가 기능 관리자에서 설치 |
| CATS Blender Plugin | 선택 사항 | GitHub 또는 블렌더 확장에서 검색 |
VRM Add-on for Blender 설치하기
- 블렌더를 실행하고 Edit → Preferences로 들어갑니다.
- Add-ons 탭을 열고 오른쪽 위의 Install...을 누릅니다.
- 내려받은 VRM Add-on
.zip파일을 고르고 Install Add-on을 누릅니다. - 목록에서 VRM을 찾아 활성화합니다.
PMX 가져오기를 위한 mmd_tools 설치하기
- Preferences → Add-ons → Install에서 mmd_tools
.zip을 선택합니다. - 부가 기능을 설치하고 활성화합니다.
- 블렌더의 File → Import 메뉴에
MikuMikuDance Model (.pmx/.pmd)항목이 나타납니다.
설치가 끝났다면 블렌더를 한 번 다시 시작해 두는 편이 안전합니다. 부가 기능 목록에서 VRM과 mmd_tools가 모두 체크되어 있는지, Import 메뉴에 PMX 항목이 보이는지까지만 확인하면 준비는 끝입니다.
2단계: PMX 모델 가져오기
- File → Import → MikuMikuDance Model (.pmx/.pmd)를 실행합니다.
- 파일 탐색기에서 내
.pmx파일을 고릅니다. - 결과를 확인합니다. 메시가 모두 들어왔는지, 텍스처가 제대로 붙었는지, 아마추어에 예상한 뼈대가 있는지 봅니다.
경로와 파일 이름은 가능하면 영문으로 유지하는 편이 안전합니다. 변환 중간에 파일을 옮기거나 이름을 바꾸면 블렌더가 텍스처를 다시 찾지 못하는 경우가 있으므로, 작업 폴더를 하나 정해 그 안에서 끝내는 습관이 좋습니다.
3단계: MMD 뼈대를 VRM Humanoid에 연결하기
PMX와 VRM은 뼈대 체계가 서로 다릅니다. VRM은 표준화된 Humanoid 뼈대를 요구하므로, 이 단계에서 PMX의 아마추어를 VRM 뼈 이름에 맞춰 연결합니다. 변환 전체에서 가장 중요한 부분입니다. 필수 뼈대가 비어 있으면 내보내기 자체가 막히고, 설령 내보내더라도 나중에 애니메이션이 어긋납니다.
자동 매핑으로 시작하기
- 모델의 Armature를 선택합니다.
- 오른쪽 속성 패널에서 VRM 탭을 엽니다.
- Create VRM Model을 누르고 자동 매핑 결과를 기다립니다.
- Humanoid 섹션을 열어 결과를 하나씩 확인합니다.
MMD 뼈 이름 대응표
아래 표는 MMD에서 흔히 쓰는 뼈 이름과 VRM Humanoid 뼈의 대응 관계입니다. 굵게 표시한 항목은 VRM 1.0에서 필수이고, 나머지는 선택이지만 자연스러운 애니메이션을 위해 지정해 두는 편이 좋습니다.
몸통과 머리
| MMD 뼈 이름(일본어) | 신체 부위 | VRM 뼈 | VRM 1.0 필수? |
|---|---|---|---|
| 全ての親 | 루트 / hips 기준 | Hips | 필수 |
| 上半身 | 상체 | Spine | 필수 |
| 上半身2 | 가슴 | Chest | 아니요 |
| 上半身3 | 상부 가슴 | UpperChest | 아니요 |
| 首 | 목 | Neck | 아니요 |
| 頭 | 머리 | Head | 필수 |
| 左目 / 右目 | 왼쪽 / 오른쪽 눈 | LeftEye / RightEye | 아니요 |
| あご | 턱 | Jaw | 아니요 |
다리
| MMD 뼈 이름(일본어) | 신체 부위 | VRM 뼈 | VRM 1.0 필수? |
|---|---|---|---|
| 左足 | 왼쪽 허벅지 | LeftUpperLeg | 필수 |
| 左ひざ | 왼쪽 종아리 | LeftLowerLeg | 필수 |
| 左足首 | 왼쪽 발 | LeftFoot | 필수 |
| 左つま先 | 왼쪽 발끝 | LeftToes | 아니요 |
| 右足 | 오른쪽 허벅지 | RightUpperLeg | 필수 |
| 右ひざ | 오른쪽 종아리 | RightLowerLeg | 필수 |
| 右足首 | 오른쪽 발 | RightFoot | 필수 |
| 右つま先 | 오른쪽 발끝 | RightToes | 아니요 |
팔
| MMD 뼈 이름(일본어) | 신체 부위 | VRM 뼈 | VRM 1.0 필수? |
|---|---|---|---|
| 左肩 | 왼쪽 어깨 | LeftShoulder | 아니요 |
| 左腕 | 왼쪽 상완 | LeftUpperArm | 필수 |
| 左ひじ | 왼쪽 전완 | LeftLowerArm | 필수 |
| 左手首 | 왼쪽 손 | LeftHand | 필수 |
| 右肩 | 오른쪽 어깨 | RightShoulder | 아니요 |
| 右腕 | 오른쪽 상완 | RightUpperArm | 필수 |
| 右ひじ | 오른쪽 전완 | RightLowerArm | 필수 |
| 右手首 | 오른쪽 손 | RightHand | 필수 |
손가락: 선택이지만 지정할 가치가 있습니다
MMD의 손가락 뼈는 보통 指0부터 指3까지의 이름을 씁니다. VRM 1.0은 손가락 뼈대 전체를 정의해 두었습니다. 기본적인 데스크톱 사용에는 손가락이 필수가 아니지만, 물건을 잡거나 가리키는 동작, 손 제스처는 손가락에 의존합니다.
| VRM 손가락 뼈 | 설명 |
|---|---|
| LeftThumbMetacarpal | 엄지 중수골 |
| LeftThumbProximal | 엄지 첫마디 |
| LeftThumbDistal | 엄지 끝마디 |
| LeftIndexProximal → Distal | 검지 사슬 |
| LeftMiddleProximal → Distal | 중지 사슬 |
| LeftRingProximal → Distal | 약지 사슬 |
| LeftLittleProximal → Distal | 새끼손가락 사슬 |
오른손도 같은 규칙입니다. Left를 Right로 바꿔서 지정하면 됩니다.
VRM 1.0 Humanoid 계층 구조
Humanoid 뼈는 각각 부모 관계가 정해져 있습니다. 중간에 있는 뼈가 비어 있으면 계층은 조부모로 건너뜁니다. 매핑이 실패할 때 참고할 지도가 바로 이 나무 구조입니다.
root(Humanoid가 아닌 노드, 원점)
+-- hips
|-- spine
| +-- (chest)
| +-- (upperChest)
| |-- (neck)
| | +-- head
| | |-- (leftEye)
| | |-- (rightEye)
| | +-- (jaw)
| |-- (leftShoulder)
| | +-- leftUpperArm
| | +-- leftLowerArm
| | +-- leftHand
| +-- (rightShoulder)
| +-- rightUpperArm
| +-- rightLowerArm
| +-- rightHand
|-- leftUpperLeg
| +-- leftLowerLeg
| +-- leftFoot
| +-- (leftToes)
+-- rightUpperLeg
+-- rightLowerLeg
+-- rightFoot
+-- (rightToes)
hips만 이동하고 나머지 Humanoid 뼈대는 회전합니다. Humanoid 뼈 사이에 Humanoid가 아닌 중간 노드가 있어도 되고, 뼈대의 스케일 값은 양수여야 합니다.자동 매핑이 실패할 때
- 아마추어를 선택한 상태에서 부가 기능의 Auto Map을 다시 실행합니다.
- 비어 있는 뼈는 Humanoid 패널에서 직접 지정합니다.
- PMX가 표준 MMD 뼈 이름을 쓰는지 확인합니다. 일본어 이름이 정확히 일치해야 자동 매핑이 동작합니다.
필수 뼈대 여섯 개(양쪽 다리의 UpperLeg, LowerLeg, Foot)와 Hips, Spine, Head가 모두 채워졌는지 마지막에 다시 확인하세요. 이 목록만 통과하면 데스크톱에서 걷기, 서기, 손 흔들기 같은 기본 동작은 대체로 정상으로 나옵니다.
4단계: 표정(Expression) 만들기
VRM 캐릭터가 눈을 깜빡이고, 말하고, 감정을 보여 주려면 표준 표정이 필요합니다. VRM 0.x는 이 시스템을 BlendShape라고 부르고, VRM 1.0은 Expression이라고 부릅니다. 개념은 같지만 VRM 1.0이 더 많은 것을 할 수 있습니다.
감정 표정
| VRM 1.0 이름 | VRM 0.x 이름 | 흔한 MMD 모프 | 의미 |
|---|---|---|---|
happy | joy | 笑い | 웃는 얼굴 / 기쁨 |
angry | angry | 怒り | 화남 |
sad | sorrow | 困る | 슬픔 |
relaxed | fun | にっこり | 편안함 |
surprised | 0.x에는 없음 | びっくり | 놀람(VRM 1.0) |
립싱크
| VRM 1.0 이름 | VRM 0.x 이름 | 흔한 MMD 모프 | 모음 |
|---|---|---|---|
aa | a | あ | a |
ih | i | い | i |
ou | u | う | u |
ee | e | え | e |
oh | o | お | o |
깜빡임
| VRM 1.0 이름 | VRM 0.x 이름 | 흔한 MMD 모프 | 의미 |
|---|---|---|---|
blink | blink | まばたき | 양쪽 눈 깜빡임 |
blinkLeft | — | 左まばたき | 왼쪽 눈만 (1.0) |
blinkRight | — | 右まばたき | 오른쪽 눈만 (1.0) |
시선 표정
| VRM 1.0 이름 | 의미 |
|---|---|
lookUp | 위를 봄 |
lookDown | 아래를 봄 |
lookLeft | 왼쪽을 봄 |
lookRight | 오른쪽을 봄 |
leftEye / rightEye를 회전시키고, Expression 모드는 네 가지 시선 표정을 정점이나 텍스처 오프셋으로 움직입니다. MMD 모델은 눈을 텍스처로 그리는 경우가 많아 Expression 모드를 쓰는 편이 자연스럽습니다.블렌더에서 표정 설정하기
- VRM 패널에서 BlendShape Master(VRM 0.x) 또는 Expressions(VRM 1.0)를 엽니다.
- 표정 그룹을 하나씩 추가하면서 각 MMD 모프를 표준 VRM 표정에 연결합니다.
VRM 1.0 표정 바인딩 종류
| 바인딩 종류 | 효과 | 주로 쓰는 곳 |
|---|---|---|
| MorphTargetBind | 메시의 MorphTarget을 구동합니다 | 깜빡임, 입 벌리기, 미소 등 정점 변형 |
| MaterialColorBind | 재질 색을 바꿉니다 | 볼터치, 눈동자 색 변화 |
| TextureTransformBind | 텍스처 UV를 이동하거나 확대합니다 | 눈 텍스처를 굴려 시선 방향 표현 |
VRM 1.0에서는 표정 하나에 여러 바인딩을 함께 넣을 수 있습니다. 예를 들어 볼터치 표정에 "볼을 살짝 부풀리는 MorphTarget"과 "볼 재질을 붉게 바꾸는 MaterialColorBind"를 동시에 담을 수 있습니다.
VRM 1.0의 Expression Override
앱이 표정을 여러 개 동시에 걸 때, 예를 들어 자동 깜빡임이 켜진 상태에서 말을 하면 얼굴이 뭉개질 수 있습니다. Override 시스템은 이 상황을 세 가지 방식으로 다룹니다.
| Override 모드 | 동작 | 쓰는 곳 |
|---|---|---|
none | 아무것도 개입하지 않습니다 | 기본값 |
block | 이 표정이 켜져 있는 동안 대상 프로그램 표정을 0으로 강제합니다 | 웃는 동안 깜빡임을 막는 식의 확실한 차단 |
blend | 이 표정이 0에서 1로 갈수록 대상 표정을 서서히 줄입니다 | 자연스러운 전환, 권장 |
표정마다 overrideMouth, overrideBlink, overrideLookAt을 따로 지정할 수 있습니다.
happy, angry, sad에 overrideBlink = "blend"와 overrideMouth = "blend"를 지정하세요. 캐릭터가 웃으면서 깜빡일 때 눈꺼풀이 얼굴을 뚫고 나오는 문제를 막아 줍니다.표정 일괄 매핑 스크립트(선택)
PMX 메시가 하나로 합쳐져 있고 모프가 많다면 짧은 Python 스크립트가 매핑 시간을 줄여 줍니다. 아래 예시는 VRM 0.x BlendShape 그룹용입니다.
import bpy
# 메시를 선택한 상태에서 실행하세요.
# 흔한 MMD 모프 이름을 VRM 0.x BlendShape 이름에 연결합니다.
Proxy = {
"blink": "まばたき",
"a": "あ",
"i": "い",
"u": "う",
"e": "え",
"o": "お",
"joy": "笑い",
"angry": "怒り",
"sorrow": "困る",
}
for name, morph_name in Proxy.items():
bpy.ops.vrm.add_vrm0_blend_shape_group(
armature_object_name=bpy.context.active_object.name,
name=name
)
# 실제 모프 연결은 VRM Add-on 화면에서 하거나 이 스크립트를 확장하세요.
happy / sad / relaxed를 쓰고 surprised를 추가하세요. MorphTarget 가중치는 VRM 0.x의 0~100이 아니라 0~1입니다.5단계: 시선(LookAt) 설정
LookAt은 캐릭터의 눈이 목표를 따라가게 만듭니다. 데스크톱에서는 중요합니다. 마우스 커서 쪽을 자연스럽게 바라보는 캐릭터와 그렇지 않은 캐릭터는 체감 차이가 큽니다.
| 모드 | 구현 방식 | 어울리는 모델 |
|---|---|---|
| Bone | leftEye, rightEye 뼈대를 회전시킵니다 | 눈 뼈대가 따로 있는 모델 |
| Expression | lookUp / lookDown / lookLeft / lookRight를 구동합니다 | 눈을 텍스처로 그린 모델, MMD 모델에 흔함 |
左目, 右目 이름의 뼈대를 찾아보세요. 눈 뼈대가 따로 있으면 Bone 모드, 눈이 얼굴 메시의 일부이고 텍스처로 그려진다면 Expression 모드입니다. MMD 모델은 대부분 후자입니다.LookAt 공간과 오프셋
LookAt은 head 뼈대에 매달린 LookAt Space를 사용합니다. offsetFromHeadBone이 눈의 기준점을 정하며, 보통 두 눈 사이에 둡니다.
LookAt Space
|-- 부모: head 뼈대 (머리와 함께 움직임)
|-- 원점 오프셋: offsetFromHeadBone (예: [0, 0.06, 0])
+-- 회전: head 뼈대의 모델 공간 정적 회전의 역회전
RangeMap: 눈이 얼마나 돌아갈지 정하기
| RangeMap 속성 | 의미 |
|---|---|
rangeMapHorizontalInner | 코 쪽으로 향하는 안쪽 수평 회전 |
rangeMapHorizontalOuter | 귀 쪽으로 향하는 바깥쪽 수평 회전 |
rangeMapVerticalDown | 아래로 향하는 수직 회전 |
rangeMapVerticalUp | 위로 향하는 수직 회전 |
RangeMap마다 inputMaxValue와 outputScale이 있습니다. inputMaxValue를 작게 잡으면 같은 목표 각도에서 눈이 더 크게 돌아가고, outputScale은 Bone 모드에서는 뼈대 회전 각도, Expression 모드에서는 0~1 사이의 표정 가중치입니다.
boneRotation = min(|angle|, inputMaxValue) / inputMaxValue x outputScale
inputMaxValue를 90에서 45로 줄이거나 outputScale을 키우세요. 반대로 너무 많이 움직이면 반대 방향으로 조정합니다.6단계: MToon 재질로 바꾸기
PMX와 VRM은 재질 시스템이 다릅니다. VRM은 VRMC_materials_mtoon 확장으로 정의된 애니메/셀 셰이더인 MToon을 권장합니다. MToon은 Lambert식 조명에 두 가지 색(밝은 면과 그림자 면), 조절 가능한 툰 경계, 림 라이트, 외곽선 렌더링을 얹어 애니 캐릭터의 손그림 느낌을 유지합니다. MMD 모델을 데스크톱에 올렸을 때 "왜 이렇게 밋밋하지"라는 느낌이 든다면, 대개 이 단계를 건너뛴 결과입니다.
- 모델 메시를 선택합니다.
- Material Properties를 열고 재질을 하나씩 처리합니다.
- 셰이더를 MMD 재질에서 MToon으로 바꿉니다.
알파 모드와 투명 처리
| 속성 | 의미 | 권장 |
|---|---|---|
| Alpha Mode | OPAQUE, MASK, BLEND | 피부는 OPAQUE, 머리카락 경계는 MASK, 레이스는 BLEND |
| transparentWithZWrite | BLEND를 그리면서 깊이 값을 기록합니다 | 반투명 물체의 정렬이 필요할 때 켭니다 |
| renderQueueOffsetNumber | BLEND용 렌더 큐 오프셋 | 투명 물체끼리 가리는 문제를 고칩니다 |
렌더 큐 순서는 OPAQUE > MASK > BLEND + ZWrite > BLEND입니다.
밝은 색과 그림자 색
| 속성 | 의미 | 권장 |
|---|---|---|
Lit Color (baseColorFactor) | 빛을 받는 면의 색과 텍스처 | 원본 PMX 기본 텍스처를 사용 |
Shade Color (shadeColorFactor) | 그림자 면의 색과 텍스처 | 순수한 검정 대신 원본 텍스처나 어둡게 조정한 색을 사용 |
전통적인 Lambert 모델은 그림자 쪽이 검게 죽습니다. MToon은 그림자에 색을 지정할 수 있고, 셀 느낌을 만드는 핵심이 바로 여기에 있습니다.
툰 경계 조절
| 속성 | 기본값 | 의미 |
|---|---|---|
| shadingToonyFactor | 0.9 | 밝은 면과 그림자 경계의 선명도. 1에 가까우면 딱 떨어지는 셀 경계, 0에 가까우면 부드러운 그라데이션 |
| shadingShiftFactor | 0.0 | 경계 위치를 이동합니다. 양수면 밝은 면이 넓어집니다 |
| shadingShiftTexture | — | R 채널이 영역별 경계 위치를 조절합니다 |
| shadingShiftTexture.scale | 1.0 | 텍스처가 경계에 미치는 영향의 세기 |
shading = dot(N, L) + shadingShiftFactor + textureContribution x scale
shading = linearstep(-1.0 + shadingToonyFactor, 1.0 - shadingToonyFactor, shading)
color = lerp(shadeColor, litColor, shading) x lightColor
대부분의 애니 모델에서는 shadingToonyFactor를 0.8에서 1.0 사이로 두면 좋습니다.
림 라이팅
| 구성 요소 | 속성 | 의미 |
|---|---|---|
| MatCap | matcapFactor + matcapTexture | 뷰 공간 노멀로 텍스처를 샘플링해 고정된 하이라이트를 만듭니다 |
| Parametric Rim | parametricRimColorFactor, parametricRimFresnelPowerFactor(기본 5.0), parametricRimLiftFactor(기본 0.0) | 프레넬 기반으로 계산되는 절차적 림 라이트 |
| Rim Mask | rimMultiplyTexture | 림 라이트가 나타날 영역을 마스킹합니다 |
| Lighting Mix | rimLightingMixFactor(기본 1.0) | 0이면 장면 조명을 무시하고, 1이면 완전히 조명을 받습니다 |
rimShape = pow(saturate(1.0 - dot(N, V) + rimLiftFactor), fresnelPowerFactor)
rim = rimShape x parametricRimColorFactor
머리카락에는 연한 파랑이나 보라 계열의 Parametric Rim을 추가하고 프레넬 파워를 3~5 정도로 두면 역광이 비치는 듯한 부드러운 가장자리가 생깁니다.
외곽선
| 속성 | 의미 |
|---|---|
outlineWidthMode | none, worldCoordinates, screenCoordinates 중 하나 |
outlineWidthFactor | 외곽선 두께. 월드 모드는 미터, 스크린 모드는 화면 높이 비율 |
outlineWidthMultiplyTexture | G 채널이 영역별 두께를 마스킹합니다 |
outlineColorFactor | 외곽선 색 |
outlineLightingMixFactor | 0이면 단색 외곽선, 1이면 외곽선 색에 표면 조명을 곱합니다 |
MToon은 앞면 컬링을 켠 별도 패스로 외곽선을 그립니다. 정점을 노멀 방향으로 밀어내고 뒷면을 그리는 방식입니다. 외곽선은 doubleSided 설정과 무관하게 항상 앞면 컬링을 사용합니다.
shadingToonyFactor로 맞춥니다. MToon은 정점 색(vertex color)을 무시하므로 텍스처나 재질 설정으로 보완해야 합니다.UV 애니메이션
| 속성 | 기본값 | 의미 |
|---|---|---|
uvAnimationScrollXSpeedFactor | 0.0 | X축 UV 스크롤 속도(초당 UV 단위) |
uvAnimationScrollYSpeedFactor | 0.0 | Y축 UV 스크롤 속도 |
uvAnimationRotationSpeedFactor | 0.0 | 0.5, 0.5를 중심으로 한 UV 회전 속도(초당 라디안) |
uvAnimationMaskTexture | — | B 채널 애니메이션 마스크 |
흔한 용도는 눈이나 화면 텍스처를 흘려서 깜빡이는 디스플레이 효과를 만드는 것입니다. 변환 순서는 UV 중심을 기준으로 한 회전이 먼저, 그다음 이동입니다.
텍스처 채널 패킹
| 채널 | 텍스처 |
|---|---|
| R | shadingShiftTexture |
| G | outlineWidthMultiplyTexture |
| B | uvAnimationMaskTexture |
shadingToonyFactor = 0.9에서 시작한 뒤 필요한 곳만 세밀하게 조정하세요.7단계: SpringBone 물리 설정
VRM은 머리카락, 옷, 장식, 꼬리를 시뮬레이션할 때 Spring Bone을 씁니다. PMX 모델에는 MMD 물리 데이터가 들어 있는 경우가 많지만, 그대로 옮겨지지 않고 VRM Spring Chain으로 다시 만들어야 합니다.
| 대상 | 예 |
|---|---|
| 머리카락 | 머리카락 가닥의 뼈대 사슬 |
| 가슴 | 해당되는 모델의 가슴 물리 |
| 의상 | 치마, 망토, 리본, 긴 소매 |
| 장식 | 리본, 꼬리, 떠 있는 소품 |
Spring Chain 구조
VRM Spring Bone은 물리를 SpringChain 단위로 정리하고, 각 체인은 순서가 있는 조인트를 담습니다. a-b-c-d 체인이라면 실행 시점에 세 쌍의 머리-꼬리가 만들어집니다.
머리 (회전) 꼬리 (위치 + 충돌)
a -> b
b -> c
c -> d
- 머리 노드의 회전은 꼬리 노드의 변위로부터 계산됩니다.
- 마지막 조인트는 꼬리 역할만 하므로 자기 매개변수는 무시됩니다.
- 마지막 구간까지 흔들리게 하려면 끝에 빈 뼈대를 하나 추가합니다.
joints[n]은 joints[n+1]의 부모나 조상이어야 합니다. 하나의 조인트가 여러 SpringChain에 속할 수 없고, 갈라지는 체인은 실행 순서가 정의되지 않으므로 각각 별도의 SpringChain으로 만들어야 합니다.Spring Bone 조인트 매개변수
| 매개변수 | 형식 | 의미 | 조정 |
|---|---|---|---|
hitRadius | float(미터) | 조인트의 충돌 반지름 | 보통 뼈 길이의 작은 비율, 예를 들어 0.02~0.05 |
stiffness | float(0 이상) | 기본 자세로 되돌리려는 힘 | 낮으면 부드럽고, 높으면 뻣뻣합니다 |
gravityPower | float | 매 프레임 적용되는 중력 | 높으면 더 처지고, 0이면 중력이 꺼집니다 |
gravityDir | float[3] | 중력 방향 | 보통 [0, -1, 0] |
dragForce | float(0~1) | 감쇠 / 관성 소멸 | 낮으면 계속 흔들리고, 높으면 곧 멈춥니다 |
Verlet 적분 알고리즘
Spring Bone은 매 프레임 세 단계를 실행합니다.
1단계: 관성
inertia = (currentTail - prevTail) x (1.0 - dragForce)
spring = deltaTime x parentWorldRotation x initialLocalRotation x boneAxis x stiffness
gravity = deltaTime x gravityDir x gravityPower
nextTail = currentTail + inertia + spring + gravity
nextTail = worldPosition + (nextTail - worldPosition).normalized x boneLength
2단계: 충돌
현재 SpringChain에 지정된 각 충돌체에 대해:
조인트 꼬리까지의 거리가 0보다 작으면 꼬리를 밀어냅니다
그리고 뼈 길이 제약을 다시 적용합니다.
3단계: 회전 적용
prevTail = currentTail
currentTail = nextTail
to = (nextTail x inverse(parentWorldMatrix x initialLocalMatrix)).normalized
node.rotation = initialLocalRotation x fromToQuaternion(boneAxis, to)
dragForce를 씁니다. 그래서 복잡한 치마는 MMD의 Bullet 물리보다 가볍게 느껴질 수 있습니다.충돌체
| 충돌체 종류 | 매개변수 | 쓰는 곳 |
|---|---|---|
| Sphere | offset, radius | 머리, 가슴, 손 |
| Capsule | offset, radius, tail | 몸통, 허벅지, 팔 |
Sphere 충돌:
distance = |nextTail - colliderOffset| - colliderRadius - jointRadius
if distance < 0:
pushDirection = (nextTail - colliderOffset).normalized
nextTail += pushDirection x |distance|
Capsule 충돌:
조인트 위치를 캡슐 축에 투영한 뒤, 구 충돌로 계산합니다.
Center Space(기준 공간)
Spring Bone은 기본적으로 월드 공간에서 계산됩니다. VRM 1.0은 center 노드를 기준 공간으로 지원하며, 관성은 center 공간에서 계산되고 중력은 월드 공간에 남습니다. 캐릭터가 움직일 때 머리카락이 지나치게 휘날리면 center를 head 뼈대로 지정해 머리 움직임에 주로 반응하게 만들 수 있습니다.
블렌더에서 Spring Bone 추가하기
- Armature를 선택합니다.
- VRM 패널에서 Spring Bone 영역을 엽니다.
- Spring Bone Group을 추가합니다. 이 그룹이 SpringChain 하나가 됩니다.
- 체인의 Root Bones를 지정합니다.
stiffness,gravityPower,dragForce를 조정합니다.- 필요하면 충돌 뼈대와 모양을 담은 Collider Group을 추가합니다.
Unity에서 Spring Bone 다루기(고급)
물리를 더 정밀하게 잡고 싶다면 기본 변환은 블렌더에서 끝내고, VRM을 Unity로 가져가 UniVRM으로 Spring Bone을 설정하는 방법이 있습니다. UniVRM의 시각적 충돌체 편집기가 미세 조정에 편합니다.
| 매개변수 | Unity 컴포넌트 | 의미 |
|---|---|---|
stiffness | VRM10SpringBoneJoint.m_stiffnessForce | 뻣뻣함 |
dragForce | VRM10SpringBoneJoint.m_dragForce | 감쇠 |
gravityPower | VRM10SpringBoneJoint.m_gravityPower | 중력 세기 |
hitRadius | VRM10SpringBoneJoint.m_hitRadius | 충돌 반지름 |
| Collider | VRM10SpringBoneCollider | Sphere / Capsule 충돌체 |
Unity를 쓴다면 VrmSpringBoneTool도 시도해 볼 만합니다. Spring Bone 설정을 단순화하고 VRM 0.x에서 1.0으로의 이전도 지원합니다.
8단계: 메타 정보 입력하고 VRM으로 내보내기
VRM 패널의 Meta 영역을 열고 모델 정보(VRMC_vrm.meta)를 채웁니다. 이 단계는 형식적인 절차가 아닙니다. 나중에 이 파일을 받은 사람이나 앱이 이용 조건을 판단하는 근거가 됩니다.
| 필드 | 의미 | 예 |
|---|---|---|
| Name / Title | 모델 이름 | 내 교복 아바타 |
| Author | 제작자 이름 | 본인 이름 또는 원본 모델 제작자 |
| Version | 버전 번호 | 1.0 |
| Description | 모델 설명 | MMD PMX에서 변환, VRM 1.0 데스크톱 컴패니언 용도로 최적화 |
| License | 이용 라이선스 | 모델 readme를 읽고 선택 |
| Avatar Permission | 다른 사람의 아바타로 쓰는 것을 허용할지 | 특정 조건만 허용 / 허용 / 금지 |
| Allow Excessively Violent Usage | 과도한 폭력적 장면 허용 | 허용 / 금지 |
| Allow Excessively Sexual Usage | 과도한 성적 장면 허용 | 허용 / 금지 |
| Commercial Usage | 상업적 이용 라이선스 | 허용 / 금지 |
| Third Party Licenses | 제3자 라이선스 표기 | 원본 모델 제작자의 조건을 함께 기재 |
VRM 라이선스 플래그
| 라이선스 | 의미 |
|---|---|
| Redistribution | 재배포를 허용합니다 |
| Modification | 개조를 허용합니다 |
| Credit | 출처 표기를 요구합니다 |
내보내기 전 확인
- 모델이 T-Pose인지 확인합니다. 팔을 벌리고 손바닥이 아래를 향한 자세입니다. VRM Humanoid는 T-Pose를 기준 자세로 쓰므로 다른 자세로 내보내면 가져온 뒤 애니메이션이 크게 어긋납니다.
- 내보낼 버전을 고릅니다. 데스크톱 컴패니언과 새 플랫폼은 VRM 1.0, 구형 호환이 필요하면 VRM 0.x입니다.
- File → Export → VRM (.vrm)을 실행합니다.
- 저장 경로를 정하고 내보내기 설정을 확인한 뒤 마칩니다.
내보내기 직전에 파일 크기도 한 번 확인해 두세요. 재질 수와 텍스처 해상도가 큰 모델은 파일이 무거워지고, 데스크톱에 항상 띄워 두는 용도에서는 부담이 됩니다.
마지막 단계: 변환한 VRM을 AniMate에 가져오기
.vrm을 내보냈다고 해서 캐릭터가 완성된 것은 아닙니다. AniMate에 가져오기 전에 아래 목록을 빠르게 확인하세요.
- 뼈대: 필수 Humanoid 뼈대가 모두 연결되어 있고 팔, 다리, 머리에 자동 매핑 누락이 없습니다.
- 표정: 깜빡임, 립싱크, 감정 표정이 있고 필요한 곳에 VRM 1.0 Override가 blend로 설정되어 있습니다.
- 재질: 투명 재질이 검게 나오지 않고 MToon 경계가 의도한 대로 보입니다.
- 물리: 머리카락과 치마가 눈에 띄게 뚫리지 않고, 충돌체가 머리와 몸통을 덮고 있습니다.
- 라이선스: Meta 필드가 원본 readme와 일치합니다.
AniMate에서는 바탕화면의 캐릭터를 마우스 오른쪽 버튼으로 눌러 Workshop을 열고 Add Character를 골라 내보낸 .vrm을 선택합니다. 모델이 올라오면 크기와 위치, 마우스 상호작용을 조정하고, Workshop에서 모션과 춤, 스테이지를 더합니다. AniMate는 VRM 0.x와 VRM 1.0을 모두 직접 가져오며, 캐릭터와 모션, 춤, 음악 반응 자산을 한 라이브러리에서 관리합니다.
가져온 뒤에는 아바타 목록 관리로 정리하고, 모델 정보 확인과 바탕화면 상호작용 설정을 차례로 살펴보세요. 캐릭터를 움직이게 하고 싶다면 춤 추가하기와 스테이지 추가하기로 이어가면 됩니다. 모델 가져오기 흐름만 다시 보고 싶다면 VRM 모델 가져오기를 참고하세요.
변환 후 자주 생기는 문제와 해결
PMX에서 VRM으로 넘어올 때 걸리는 지점은 어느 정도 정해져 있습니다. 증상별로 확인할 곳을 정리했습니다.
| 증상 | 원인 | 해결 |
|---|---|---|
| 모델이 단색으로 보이거나 검게 나옵니다 | 텍스처를 찾지 못했습니다 | 텍스처를 PMX와 같은 폴더에 두고, 압축 해제 인코딩을 Shift-JIS로 지정합니다 |
| 팔과 다리가 구부러지지 않습니다 | 필수 Humanoid 뼈대가 비었거나 가중치가 IK 뼈에 붙었습니다 | Humanoid 패널에서 비어 있는 뼈를 지정하고, 가중치를 회전 뼈로 옮깁니다 |
| 내보내기 버튼이 막힙니다 | 필수 뼈대가 채워지지 않았습니다 | Hips, Spine, Head와 양쪽 다리 여섯 뼈를 먼저 채웁니다 |
| 웃을 때 눈꺼풀이 얼굴을 뚫습니다 | 표정이 동시에 겹칩니다 | VRM 1.0 Override에서 overrideBlink와 overrideMouth를 blend로 둡니다 |
| 그림자 쪽이 새까맣습니다 | Lambert식 재질이 그대로 남았습니다 | MToon으로 바꾸고 Shade Color를 어두운 색으로 지정합니다 |
| 머리카락과 치마가 심하게 떨립니다 | 체인 계층이나 충돌체 설정이 맞지 않습니다 | SpringChain 부모 관계를 확인하고 stiffness, gravityPower, dragForce를 조정합니다 |
| 가져온 뒤 자세가 크게 어긋납니다 | T-Pose가 아닌 자세로 내보냈습니다 | 팔을 벌린 T-Pose로 되돌려 다시 내보냅니다 |
| 끝부분만 흔들리지 않습니다 | VRM 1.0에는 종단 조인트 자동 추가가 없습니다 | 체인 끝에 빈 뼈대를 하나 추가합니다 |
성능도 함께 봐 두세요. 항상 켜 두는 데스크톱 펫은 모델 복잡도, 재질 수, SpringBone 체인 수, 실행 환경이 겹쳐서 부담이 결정됩니다. 복잡한 모델을 하루 종일 띄워 두기 전에 가벼운 모델로 먼저 확인하고, 춤과 스테이지를 더할 때는 춤과 스테이지 조합을 참고하세요. 다른 앱과 비교가 필요하면 Windows 애니 데스크톱 펫 정리를 보면 됩니다.
관련 글
| 주제 | 페이지 |
|---|---|
| VRM 데스크톱 컴패니언이 무엇인가요? | VRM 데스크톱 컴패니언 |
이미 .vrm 파일이 있나요? | VRM 가져오기 가이드 |
| 모델은 어디서 구하나요? | 무료 VRM 모델 목록, VRM 모델 출처와 라이선스 확인 |
| 캐릭터를 춤추게 하고 싶나요? | AniMate Workshop, 춤과 스테이지 가이드 |
| VRM을 처음부터 만들고 싶나요? | AI로 VRM 모델 만들기 |
| 데스크톱 펫 앱을 비교하고 싶나요? | Desktop Mate 대안, 시메지 대안, HoloWaifu 대안 |
| 처음 설치부터 따라가고 싶나요? | 시작하기, 모델 가져오기 튜토리얼 |
| 바탕화면을 더 손보고 싶나요? | 컴패니언 꾸미기, 언어 전환, 라이선스 활성화 |
자주 묻는 질문
PMX 파일을 AniMate에 바로 가져올 수 없나요?
AniMate는 VRM 데스크톱 컴패니언 파일을 기준으로 만들어졌으므로 .vrm이 가장 확실한 선택입니다. PMX는 블렌더와 VRM Add-on, 또는 Unity와 UniVRM으로 먼저 변환한 뒤 가져오세요. 변환 자체는 이 글의 8단계를 그대로 따라가면 됩니다.
3D 프로그램을 다뤄 본 적이 없어도 변환할 수 있나요?
가능합니다. 블렌더와 VRM Add-on 조합이 더 완만한 경로입니다. 부가 기능을 설치하고, PMX를 가져오고, VRM Model을 만든 뒤 뼈대와 표정, 재질, 물리를 패널에서 차례로 처리합니다. 대부분의 단계에 스크립트가 필요하지 않고, 스크립트는 선택 사항입니다.
VRM 0.x와 VRM 1.0 중 어느 쪽으로 내보내야 하나요?
새 데스크톱 컴패니언 용도라면 VRM 1.0을 고르세요. 표정 이름이 더 일관되고, Expression Override가 충돌을 처리하며, SpringBone 규칙이 더 완전합니다. VRM 0.x는 그 형식을 요구하는 구형 플랫폼에만 사용하세요.
변환 후 머리카락과 치마 물리가 더 어색해진 이유는 무엇인가요?
VRM SpringBone은 강체 물리가 아니라 입자-스프링 시스템입니다. SpringChain마다 부모 관계를 확인한 뒤 hitRadius, stiffness, gravityPower, dragForce를 조정하고, 머리와 몸통에 충돌체를 추가하세요. 복잡한 치마는 MMD의 Bullet 물리보다 가볍게 느껴질 수 있습니다.
남의 MMD 모델을 변환해 상업적으로 사용해도 되나요?
모델에 포함된 readme를 먼저 읽으세요. 대부분의 MMD 모델은 상업적 이용과 재배포를 금지하며, 개조와 스트리밍, 상업 이용은 창작자의 라이선스로 별도 확인해야 합니다. 확인한 내용을 VRM Meta의 라이선스 필드에 그대로 반영하는 편이 안전합니다.
변환한 VRM의 텍스처가 검게 나오는 이유는 무엇인가요?
텍스처가 PMX와 같은 폴더에 있는지 확인하고, 일본어 파일 이름이 깨지지 않도록 압축을 Shift-JIS로 풀었는지도 확인하세요. 재질은 MToon으로 바꾸고 Shade Color를 순수한 검정 대신 어두운 색으로 지정합니다. MToon은 정점 색을 사용하지 않으므로 텍스처와 재질 설정으로 보완해야 합니다.
MMD 뼈 이름이 일본어인데 그대로 둬도 되나요?
그대로 두는 편이 좋습니다. PMX의 표준 뼈 이름(全ての親, 上半身, 左足 등)을 유지해야 자동 매핑이 제대로 동작합니다. 이름을 임의로 바꾸면 매핑이 실패할 수 있으니, 실패하면 Auto Map을 다시 실행하거나 Humanoid 패널에서 직접 지정하세요.
변환한 모델이 무거우면 바탕화면이 느려지나요?
부담은 모델 복잡도, 재질 수, SpringBone 체인 수, 실행 환경에 따라 달라집니다. 항상 켜 두는 데스크톱 컴패니언으로 쓸 계획이라면 복잡한 모델을 상시로 두기 전에 가벼운 모델로 먼저 시험해 보세요.
MMD 캐릭터를 바탕화면으로 꺼내기
먼저 AniMate의 내장 모델로 앱에 익숙해진 다음, 변환한 VRM을 가져와 Workshop에서 캐릭터와 모션, 춤을 관리하세요.