Unreal Engine 얼굴 Static Mesh 기반 Morph Target 제작 구조
Unreal Engine 얼굴 Static Mesh 기반 Morph Target 제작 구조
1. 검토한 문제
Unreal Engine의 Morph Target은 기본적으로 Skeletal Mesh 버텍스에 대한 변형량(delta)으로 볼 수 있다.
MorphDelta[i] = TargetPosition[i] - BasePosition[i]
DCC에서 Shape Key / Blend Shape를 Skeletal Mesh와 함께 가져오는 것이 일반적인 방식이지만, 별도의 변형 메시로부터 에디터 타임에 delta를 계산해 Morph Target을 생성하는 방식도 가능하다.
처음에는 다음 구조를 검토했다.
Base Skeletal Mesh
↕
Base Static Mesh
↕
Morph Static Mesh
하지만 Skeletal Mesh와 Static Mesh는 Unreal 임포트/빌드 과정이 서로 다르므로, DCC에서 동일한 vertex index를 가졌더라도 Unreal 내부에서 동일한 index가 유지된다고 보장하기 어렵다.
위치 등을 이용해 correspondence를 다시 복원할 수도 있지만 파이프라인이 복잡해진다.
2. 얼굴을 독립된 Static Mesh로 관리
Morph가 필요한 얼굴 영역 자체를 처음부터 별도의 Static Mesh로 관리한다.
Body Skeletal Mesh
│
├─ 얼굴 영역 제거
│
└─ 기존 Skeleton / Skin Weight 유지
Face_Base (Static Mesh)
│
├─ Face_Smile
├─ Face_Blink
├─ Face_Angry
└─ ...
Face_Base와 모든 변형 Face Mesh는 완전히 동일한 topology를 유지한다.
DCC에서는 Face_Base를 복제한 뒤 버텍스 위치만 변경해서 각 표정을 제작한다.
Face_Base.Vertex[i]
↕
Face_Smile.Vertex[i]
따라서 Base와 각 Morph 사이의 vertex correspondence를 명확하게 유지할 수 있다.
3. 얼굴 영역은 Head Bone 100%
이 구조를 단순하게 만들기 위한 핵심 전제는 분리된 얼굴 영역 전체를 Head Bone 100% Weight 영역으로 제한하는 것이다.
Face Vertex
│
└── Head Bone = 1.0
따라서 DCC 단계에서 얼굴에 복잡한 Skin Weight를 관리할 필요가 없다.
Unreal Editor Tool에서 최종 Skeletal Mesh에 얼굴을 합성할 때 모든 얼굴 버텍스에 다음 정보를 자동으로 부여한다.
BoneIndex = Head
Weight = 1.0
4. 얼굴 분리 경계 규칙
얼굴과 Body의 분리선 역시 Head 100% 영역 안에 있어야 한다.
피해야 하는 구조:
Face
────────────── ← 절단선
Head 70%
Neck 30%
──────────────
Body
이 경우 Face는 Head 100%로 움직이지만 Body 쪽 경계는 Head/Neck Blend Skinning을 하므로 애니메이션 시 서로 다른 변형이 발생해 틈이나 미끄러짐이 생길 수 있다.
권장 구조:
Face
Head 100%
│
──── 절단선 ────
│
Head 100%
│
Skin Weight 전환
Head ↔ Neck
│
Body
즉, Face와 Body 양쪽 경계가 모두 Head 100%인 위치에서 분리한다.
5. Blender Shape Key 직접 Import 방식은 사용하지 않음
Blender에서는 Armature가 없는 일반 Mesh에도 Shape Key를 만들 수 있다.
하지만 이를 Unreal에 Static Mesh로 Import한다고 해서 Shape Key가 일반적인 Unreal Morph Target으로 들어오는 것은 아니다. Unreal의 표준 Morph Target은 Skeletal Mesh 쪽 데이터다.
한때 다음과 같은 방식도 검토했다.
Face
├─ Shape Keys
└─ 임시 Armature
└─ Head
이 방식으로 Skeletal Mesh로 Import하면 표준 Morph Target 파이프라인을 사용할 수 있지만, 기존 캐릭터 Skeleton을 사용할 경우 bone hierarchy, reference pose, bind pose 등의 호환성을 관리해야 해서 제작 파이프라인이 번거로워진다.
따라서 최종적으로 이 방식은 사용하지 않는다.
최종 파이프라인
DCC
DCC에서는 Skeleton을 신경 쓰지 않고 순수 geometry만 제작한다.
Face_Base
│
├── 복제 → Face_Smile
├── 복제 → Face_Blink
├── 복제 → Face_Angry
└── 복제 → Face_XXX
규칙:
- Topology 변경 금지
- Vertex Position만 변경
Unreal Editor Tool
Face_Base
+
Face_Morph
│
▼
Vertex Delta 계산
Delta[i] = Morph[i] - Base[i]
│
▼
Face에 Head Bone 100% Weight 생성
│
▼
기존 Body Skeletal Mesh에 Face Geometry 합성
│
▼
계산한 Delta를 Morph Target으로 생성
│
▼
최종 Skeletal Mesh
Body
+
Face (Head 100%)
+
Morph Targets
├─ Smile
├─ Blink
├─ Angry
└─ ...
즉, DCC는 순수 geometry 제작만 담당하고 Skeleton / Skinning / Morph Target 변환은 Unreal Editor Tool이 담당한다.
6. 이음매(Seam) 처리
위치
Face와 Body 경계가 다음 조건을 만족하면 애니메이션에 의해 경계가 서로 다르게 움직이는 문제를 피할 수 있다.
- 동일한 위치
- 양쪽 모두 Head 100% Weight
Normal / Tangent
Face와 Body를 별도로 처리하고 Normal을 각각 자동 계산하면 경계에서 Normal이 달라질 가능성이 있다.
Body Face
Normal ↖ ↗ Normal
────────● ●────────
↑ 동일 위치
이 경우 조명에서 seam이 보일 수 있다.
현재 단계에서는 자동 계산된 Normal을 우선 사용하고 실제 결과를 확인한다.
문제가 확인되면 Editor Tool에 후처리 기능을 추가한다.
경계 Vertex 검색
↓
Body ↔ Face 대응
↓
Normal 동기화 / 평균화
↓
필요하면 Tangent도 처리
Normal/Tangent 문제 때문에 초기 파이프라인을 복잡하게 만들지 않고 후순위로 둔다.
핵심 규칙
얼굴은 Head Bone 100% 영역에서 분리한 독립 Static Mesh로 관리한다. DCC에서는 Base Face의 topology를 고정하고 각 Morph는 vertex position만 수정한다. Unreal Editor에서 얼굴을 Head 100% Skeletal Geometry로 변환하여 Body에 합성하고, Base와 변형 Static Mesh의 vertex delta로 Morph Target을 생성한다. Seam의 Normal/Tangent 문제는 필요할 경우 후처리한다.