MMD (미쿠미쿠댄스) 프로그램에서 사용되는 확장자인 .pmx 파일로 만들어진 모델파일을
언리얼엔진에서 불러와 적용해보려고 한다.
추가로 .vmd 파일 (Vocaloid Motion Data) 파일도 적용하여 MV 영상 을 제작해 내는것을 목표로 한다.
언리얼 엔진에서는, 비공식적으로 플러그인을 통해 .pmx 파일을 임포트 할 수 있는 기능을 제공했다.
하지만 지금은 개발이 중단됬는지 4.16 버전 까지만 나왔고, 현재 필자가 사용하는 4.24.1에 대응하는
플러그인은 없었다.
따라서, 아래 절차를 거쳐서 pmx 파일을 임포트 할 필요가 있다.
1. .pmx 파일을 .fbx 파일로 변환 한다.
2. 변환 할 때, .vmd 파일을 애니메이션으로 변환한다.
3. 엔진에 소환.
fbx 파일로 변환 할 때, 대부분 강좌들에서는 blender 를 활용하는 모습을 보았다.
실제로 필자도 시도해보았고, 큰 문제는 없었다. 다만 이번 강좌에서는 블렌더를 사용하지 않는다.
그 이유는 아래와 같다.
1. .fbx 로 변환 했을 때, 텍스쳐 정보가 빠짐 (정확하게는 이번 강좌에서도 텍스쳐는 못불러왔습니다.)
2. 더 가볍고 쉬운 방법이 여기 있음.
우선, 이번 강좌를 따라하게 되면 얻게 되는 결과물에 대해 알아본다.
완성 후 작품
시네마틱 기능을 활용해서 촬영도 해봤다
위치를 잘못설정해서 그런지.. 짤린다.
.pmx 파일 찾기
이 글을 읽고 있는 독자라면 이미 .pmx 파일을 구했을거라고 생각한다.
혹시 모를 독자를 위해, 가볍게 추천링크라도 달듯 좋은 사이트를 남기려고 한다.
니코니코 동화에서 3D 모델 데이터를 공유하는 사이트가 있다.
필자는 아래 모델 데이터를 선택했다.
애니메이션 데이터도 적용해야 하기 때문에, 이미 작동이 검증된 모델을 선택했다.
https://3d.nicovideo.jp/works/td35863
압축을 풀어둔다. .pmx 파일과 텍스쳐 파일이 있는지 확인 하고, 다음은 모션 데이터를 다운로드 하도록 하자.
참고로, 애니메이션 없이 모델 데이터만 불러오고자 하면 굳이 다운로드 할 필요 없다.
.vmd 파일 찾기
유튜브에서 MMD 를 통해 만든 영상들은 모션 데이터를 을 다운로드 할 수 있도록 공유 하기도 한다.
(물론 안할수도 있다. 잘 찾아보자)
필자는 운 좋게, HIBIKASE (울려퍼져라) 라는 MV 영상의 모션 데이터를 쉽게 찾을 수 있었다.
만약 찾기 어려운 독자는 아래 다운로드 링크를 참고하자.
https://www.patreon.com/posts/public-gift-mmd-25985225
참고로, 저 사이트 접속할 때 R-18 물어보는데, 이상한 사이트 아니니 무시해도 된다.
(위에 사진이 좀 그렇긴 한데,적당히 피하시길..)
만약, 언리얼 시네마틱의 대한 지식과 레벨 디자이닝, 라이팅에 소질이 있다면
아래 영상과 같은 완벽한 수준의 MV 영상 제작도 가능하다.
이번 강좌에서는, 시네마틱과 라이팅은 다루지 않으므로 가능성만 확인하고 넘어간다.
파일을 모두 다운로드 했다면, .vmd 파일을 찾을 수 있을 것이다.
.pmx 파일을 .fbx 파일로 변환
Pmx2Fbx 라는 프로그램을 사용하여 .fbx 파일로 변환하고자 한다.
아래 파일을 다운로드 하자.
출처는 아래와 같다.
다만 필자는 필요없는 파일을 빼서 다시 업로드 했을 뿐 이다.
만약 위에 다운로드가 작동하지 않는다면 아래 드라이브에서 다운로드 하자.
https://drive.google.com/file/d/1EMdlILUmMZy0GSC8fKYgeklreIX2cZgZ/view
다운로드를 마쳤다면 압축을 풀고 명령프롬프트를 열어 다운로드 한 파일의 경로로 이동한다.
여기서, 아래 명령어를 실행하는데, 자신의 파일 경로에 맞게 입력해줘야 한다. (당연한 것)
만약 .vmd 파일이 없다면 두번째 인잣값은 입력하지 않아도 된다.
Pmx2Fbx.exe Path/To/Pmx Path/To/Vmd
오류가 발생하나요?
파일 이름 또는 경로에 일본어가 적혀있으면 안된다.
다 영어로 치환해주고 다시 시도해보자.
대충 위 처럼 실행된다.
애니메이션에 따라서 시간이 걸릴 수 있으니 기다리도록 하자.
완료되었다면, .pmx 파일이 있었던 곳에 아래와 같은 파일이 있을 것 이다.
이로써, pmx 파일과 vmd 파일을 하나의 fbx 파일로 변환하였다.
조망간 이 작업을 쉽게 해줄 수 있는 사이트를 하나 만들어볼 생각.
자주 변환할텐데.. 생각보다 귀찮더라.
언리얼 엔진으로 임포트
적당히 프로젝트를 생성 (이미 있다면 연다) 한다.
간단한 MV 영상을 만들고자 하여, 필자는 샘플 맵을 가져왔다.
본 강좌와는 무관한 작업이므로 간단하게 어떤 샘플인지만 남기고 넘어가겠다.
이제, 언리얼 프로젝트에서 새 폴더를 만들고 이전에 뽑은 FBX 파일을 임포트 한다.
임포트 할 때 설정해야할 몇가지 사항을 짚고 넘어가겠다.
Skeletal Mesh | 체크 |
Skeletal Mesh 의 경우 체크해야 한다. |
Import Morgh Targets | 체크 | https://docs.unrealengine.com/ko/Engine/Content/FBX/MorphTargets/index.html
표정을 처리하기 위해 사용한다. |
Import Animations | 체크 | 만약 애니메이션이 없다면 할 필요 없다. |
머티리얼 임포트 메서드 | 생성 하지 않음 | 머티리얼은 만들어봐야 비어있으므로 의미가 없다. |
Import Texture | 체크 해제 | 텍스처는 호환성 문제로 인해 읽을 수 없어 의미가 없다. |
크기(Scale) 은 모델마다 다 다르지만 대게 크게 나온다.
블렌더 기준이지만 0.2로 설정하면 적당했다. 임포트 해보고 크기가 너무 차이난다면 임포트한 파일을 지우고
크기를 조정하여 다시 임포트 하자.
머티리얼 연결하기
총 4개 (애니메이션이 없다면 3개) 의 에셋이 임포트 됨을 확인 한다.
하지만 모델에는 머티리얼과 텍스쳐가 없으므로, 열어보면 기본 머티리얼이 적용된것을 알 수 있다.
이전에 pmx 파일이 있던 폴더로 가보면, 텍스쳐 파일이 있을 것 이다.
없다면? 아쉽지만 그 모델은 사용 할 수 없다.
이미지 파일을 모두 언리얼엔진에 임포트 한다.
몇번 작업을 해보면 알겠지만, 일부 텍스쳐 파일은 쓰이지 않는다는것을 알 수 있다.
(위 이미지에서는 Sph_Fur.png ~ Toon_Face.png 까지 사용하지 않는다.)
다만, 사용되고 되지 않고는 모델마다 다 달라서 특정 파일을 빼라고 말 할 수는 없다는 점을 참고하길 바란다.
이제, 머티리얼을 하나 만들고 파일을 연다.
(필자는 머티리얼의 이름을 MT_Miku 로 하였다)
텍스쳐를 입력받는 TextureSample 과 Constant3Vector 노드(3 키 누르고 클릭하면 만들 수 있다) 를 추가 한다.
우리는 이 머티리얼을 기반으로 하여, 머티리얼 인스턴스를 생성, 각각 부위별로 인스턴스를 만들어
적용할 생각이다.
만약 각 부위별로 머티리얼을 만들게 되면 큰 노가다 때문에 지칠것이다.
그리고.. 머티리얼을 컴파일하는데도 시간이 많이 걸린다.
생성한 3개의 노드를 파라미터로 변환하고, 이름을 각각 Texture, Diffuse, Ambient 로 설정 한다.
(이름은 자유롭게 해도 좋다)
머티리얼 설정으로 이동하여, 아래 표와같이 설정을 마친다.
Blend Mode | Masked |
Shading Model | Subsurface |
Two Sided | 체크 |
위 사진을 참고하여 노드 구성을 마치도록 한다.
Texture 부분에는 아무 텍스쳐나 적용해뒀다. 그렇지 않으면 오류가 발생한다.
Diffuse 에는 기본값을 적용했다. 곧 어떤 기본값을 써야 하는지 적겠다.
Ambient 도 마찬가지로, 기본값을 적용해두었다.
저장하고, 창을 닫는다.
머티리얼 인스턴스 생성
이제 가장 중요한 부분에 도착했다.
위에서 생성한 머티리얼을 기반으로, 머티리얼 인스턴스를 만들고 각 부위에 적용하는 작업이다.
가장 중요하고 어렵다. 약간의 눈치도 있어야 하므로
집중해서 할 필요가 있다.
위에서 업로드해둔 파일을 열어보면, PMX2FBX Materials Render 라는 프로그램이 있다.
이를 실행한다.
FBX 로 변환 작업을 했을 때, FBX 파일과 XML 파일이 같이 만들어진걸 알 수 있다.
만약 변환작업을 블렌더로 했을 경우, XML 파일이 없어서 머티리얼을 만들때 꽤나 힘들어진다.
만약 블렌더로 했다면, 변환작업을 거치고 XML 파일만 따로 뽑아와도 된다.
이 파일을 열면...
왼쪽은 텍스쳐, 오른쪽은 해당 텍스쳐가 적용되는 부위를 나타낸다.
가장 첫번째 텍스쳐를 선택해보면, 이름에서 추론하듯 얼굴에 관련된 텍스쳐임을 알 수 있다.
그리고, 오른쪽에 보면 MT_Face 라는 부위와 MT_FaceParts 라는 부위에 해당 텍스쳐가 적용된다는것도 알 수 있다.
이를 확인하고, 엔진으로 돌아와 방금 만든 머티리얼(MT_Miku) 을 기반으로 하는 머티리얼 인스턴스를 생성한다.
머티리얼에서 파라미터로 설정했던 부분에 새로운 값을 넣을 수 있도록 되어 있다.
방금 확인했듯, Dif_Face.png 라는 텍스쳐는 MT_Face 라는 부위와 MT_FaceParts 라는 부위에 적용되야 한다.
텍스쳐에 Dif_Face 를 선택한다.
Diffuse 의 기본값과, Ambient 의 기본값은 여기에 나타나있다.
아마, 모델마다 다 값이 다를텐데, 머티리얼로 이동하여 (인스턴스 아님) 자신의 값에 맞게 기본값을 바꿔주면
훨씬 수월 할 것이다.
머티리얼 인스턴스를 만들었다면, 임포트한 Skeletal Mesh 로 이동하여
값을 적용하면 된다.
여기서, 약간 눈치가 있어야 하는데.
위 xml 파일의 자료가 완벽히 맞아 떨어지지는 않는다. 필자도 몇번 해본 결과
몇개는 비어있을때도 있다.
이럴때는 적당히 눈치껏 파일을 끼워넣어서 내가 원하는 결과와 최대한 비슷하게 만들어야 한다.
필자의 경우, 두번째 파일에는 아무것도 없다.
이럴때는 그냥 생략하고 넘어가도 된다.
이 작업을 모든 텍스쳐에 대해 반복하여, 머티리얼을 적용한다.
순서는 아래와 같다.
1. xml 에서 텍스쳐와, 머티리얼 이름, 적용될 부위를 파악
2. 머티리얼 인스턴스 생성 및, Texture 적용
3. 생성된 머티리얼 인스턴스를 스켈레탈 매쉬 부위에 적용
최종적으로 아래와 같이 머티리얼 인스턴스가 만들어진다.
모델 데이터에 따라 다 다르므로, 참고만 한다.
모든 머티리얼 슬롯에는 값이 채워져있어야 한다.
비어있다면, 수작업으로 하나씩 맞춰줘야 한다.
거의 완료되었다. 이제 모델을 맵에 배치해보자.
모델 배치
애니메이션 파일을 맵에 배치하면 성공적으로 적용되는것을 볼 수 있다.
여기에 배경음악까지 깔게 되면 마치 음악에 따라서 춤을 추는 것 처럼 보이게 할 수 있다.
최종 결과
완성하고 보니...
- 머리카락 물리 버그
- 타이밍 버그
가 있다. 이 해결은 독자에게 맡긴다.
지금까지 따라온 것에 감사를 표하며, 여기서 글을 마친다.
'볼봇의 코딩 생활 > 언리얼한 엔진' 카테고리의 다른 글
[UE4] 웹 동영상 재생하는 플러그인 개발 (WebMediaPlayer) (0) | 2020.05.06 |
---|---|
UE4 렌더 타깃을 사용하여 CCTV 를 만들어보자 (0) | 2020.04.07 |
[UE4] SteamVR 모션 컨트롤러가 작동하지 않을 때 (0) | 2020.02.02 |
[UE4] License for package Android SDK Build-Tools not accepted. 오류 해결 (0) | 2019.12.25 |
[UE4] VisualStudio 를 위한 인텔리센스 구성 (5) | 2019.12.18 |