본문 바로가기
Unreal Engine 5/devlog: 카툰액션게임

언리얼 카툰 액션 게임 Devlog 3: 모델 가져오기 작업 - Material 적용

by 니키티스 2025. 4. 27.

요약

개발 일자: 25.3.11~3.16, 3.27~3.28

  • 플레이어를 위한 FBX 모델 가져오기 및 오류 해결
  • 모델의 Material 데이터를 직접 매핑해 주기
  • 캐릭터 모델의 리깅 확인하기

여러 가지로 일이 많아 작성이 늦어졌다…

개발하면서 자꾸 막혀서 일지가 좀 쌓이고 나서야 작성할 수가 있는데, 블로그에 일지를 자주 정리해서 지금 개발 중인 로그를 바로바로 올릴 수 있도록 노력해야 할 것 같다.

1. 모델 가져오기

1.1 블루아카이브 모델(FBX) 임포트 하기

저번 시간에 알아봤듯이, 플레이어 캐릭터로는 블루아카이브의 미야코 모델을 사용하기로 했다.

모델 링크: https://www.fab.com/listings/e9dfe6b0-71f7-4c31-80f8-28eb0755cd9b

넥슨의 게임 ‘블루아카이브’의 캐릭터 미야코에 대한 캐릭터를 플레이어 캐릭터로 활용하기로 했다.

저작권 문제는 지난 글 “언리얼 카툰 액션 게임 Devlog 2: 캐릭터 및 게임모드 설정 및 캐릭터 모델 허가 요청(블루아카이브)”에서 다루었으므로, 여기서는 생략한다.

1.2 FBX 임포트 과정

fbx 파일을 import 하려고 하니 여러 옵션이 떴다.

하나씩 살펴보자.

이를 위해 UE 5.5 공식 문서 ‘언리얼 엔진의 FBX 임포트 옵션 레퍼런스’를 참고하였다.

(참고: https://dev.epicgames.com/documentation/ko-kr/unreal-engine/fbx-import-options-reference-in-unreal-engine).

캐릭터를 다룰 때 Bone 기반의 애니메이션을 활용하려면, Skeletal Mesh로 처리해야 한다. 따라서 최상단의 Mesh > Skeletal Mesh를 체크해 주자.

1.3 ‘Degenerate Polygons’ error

import 할 때 오류 메시지가 나타났다.

No smoothing group information … 로 되어 있는 경고 메시지는 작동에 큰 영향을 주지 않으므로 무시하였다. 그러나 그 아래에 뜬 다음과 같은 오류 메시지는 분석이 필요했다.

[…] could not be created because all of its polygons are degenerate.

Unreal Engine에서 FBX 파일을 import 할 때 발생하는 "degenerate polygons" 오류는 메시의 일부 또는 전체가 손상되었거나, 너무 얇거나, 법선 정보가 손실된 경우 발생할 수 있습니다. 이 문제를 해결하기 위해 아래 방법을 시도해 보세요. (생략) - GPT 답변

GPT에서 찾아본 결과, 메시가 손상되어서 그런 것으로 보인다.

좀 더 구체적으로 정리하자면, Degenerate Polygons 오류는 다음 세 경우로 설명할 수 있다고 한다.

  • 면이 너무 작거나 선처럼 얇다: 삼각형(폴리곤)의 세 점이 거의 같은 위치에 있거나, 너무 좁아서 Unreal Engine이 이를 제대로 해석하지 못함.
  • 겹친 면(Faces)이나 점(Vertex)들이 있다: 같은 위치에 중복된 면이 있어서 Blender에선 보이지만, Unreal Engine에선 깨지는 경우.
  • 법선(Normals) 방향이 꼬였다: 3D 모델의 표면 방향이 뒤집히거나 잘못 계산된 경우.

위와 같은 문제로 인해 폴리곤이 제대로 생성되지 않았다고 보면 되겠다.

보통 이 문제는 메시를 전체 선택하여 상단 메뉴에서 "Mesh" → "Clean Up" → "Degenerate Dissolve"를 누르면 자동으로 해결된다고 한다.

혹은, 너무 가까운 Vertex를 Merge By Distance로 합치고, Recalculate Outside로 법 선을 정리하는 등의 방법을 시도할 수 있다고 한다.

이 문제를 해결하려면 FBX를 재생성해야 하다 보니, 이번 기회에 무료 3D 편집 프로그램 Blender를 설치하게 되었다.

다만 모델을 좀 살펴본 결과, 근본적으로 모델의 ‘입 부분’으로 인해 문제가 생길 가능성이 높아 보였다. 위 그림에서 모델에서 입 부분을 보면 동그란 무언가가 있는 걸 볼 수 있는데, 이는 캐릭터가 여러 가지 표정을 지으면서 입을 벌릴 때 보이는 ‘입 안 부분’이 되겠다.

이때 입을 벌릴 수 있게 하기 위해서 입의 윗부분, 아랫부분이 분리되어야 하기 때문에, 입 위쪽 정점과 입 아래쪽 정점이 겹쳐 보일 수밖에 없다.

위 사진은 import 한 모델의 입 부분인데, 실제로 입술 부분에 vertex가 많이 집중되어 있는 걸 볼 수 있다.

정확한 건 아니지만, 이 부분이 정점이 너무 빽빽하기 때문에 문제가 생길 수도 있지 않을까 우려되었다.

일단, 여러 가지 시도를 해보고 import 해보니 별 다른 문제 없이 작동이 되어서, Degenerate Polygons 문제와 이 문제는 넘어가기로 했다.

2. 모델의 Material 가져오기

2.1 Material 데이터가 손실되었다

위 챕터에서 정점 오류를 해결해 보고, 이를 다시 언리얼에 import 하였다.

그 결과는 아래와 같다.

보면 아마도 알겠지만, 색상이나 반사 정보, 텍스처 등 모델에 관련된 정보가 손실되었다. 즉, 모델에서 Material 정보가 제대로 안 가져와졌다.

Blender에서 Unreal Engine 5로 import를 잘못해서 생긴 문제일 수도 있어 여러 importing 튜토리얼을 보며(ex: https://www.youtube.com/watch?si=oO9h6wm0IAnfJtKH&v=9q0Jrgu6wEw&feature=youtu.be) 참고해 보았는데, 제대로 해결되지 않았다.

실제로 잘못 export 하면 이렇게 데이터가 손실되는 경우가 있다고 하는데, 예를 들어 Blender에서 Export 할 때 Material이 가져와지지 않는 원인 중 하나는 파일 Path를 Unreal에서 제대로 읽어오지 못해서이다.

이를 해결하려면 두 가지 해결책이 필요하다.

  • Path Mode를 Copy로 설정해주어야 한다. 이렇게 해주어야 export 한 파일에 대해 텍스처 등의 File Path가 export 된 파일을 잘 가리키게 된다.
  • Embed Textures 옵션 체크하기: Path Mode의 우측을 보면 체크할 수 있는 그림 하나가 있는데, 이것이 바로 이 옵션이다. 텍스처를 FBX 파일 안에 내장시킬 수 있다.

또한 이 export를 하기 전에, Camera나 Light 같은 부가적인 오브젝트는 고르지 말고, 필요한 오브젝트만 선택한 다음에 FBX로 내보내야 한다.

그러나 나는 위 방법을 모두 시도했음에도 FBX 파일을 import 하였을 때 Material이 할당되지 않은 상태로 가져와졌다.

즉, 해당 모델에 무언가 문제가 있는 게 분명했다.

2.2 문제: Blender는 Principled BSDF 쉐이더를 사용하는 Material만 export 할 수 있다

여러 모로 살펴보니, 문제는 바로 ‘쉐이더 그래프’였다.

해당 모델은 잘 보면 카툰 스타일로 그려지고 있다. 그 점이 마음에 들어서 FABS에서 해당 모델을 사용하기로 했는데, 그 점이 export 시 문제가 되었다.

Shading을 체크해서 살펴보니, Principled BSDF 이외에 다양한 커스텀 노드(ex: NPRILMDiffuse)를 사용하고 있었다.

그것이 왜 문제가 되냐 하면, Blender에서는 export 시에 물리 기반의 쉐이더 노드 Principled BSDF를 사용하는 경우에만 내보낼 수 있기 때문이다.

BSDF는 빛을 받아들였을 때 빛을 처리하는 방식을 의미하는데, Blender에서 principled BSDF는 기본으로 주어지는 쉐이더로 PBR 기반으로 표준화된 쉐이더를 말한다.

PBR이란 Physically based rendering의 약자로, 실제 빛의 물리적인 알고리즘에 기반해 색상을 계산한다. 그래픽스에서 처음에 배우는 Phong Shading이 현실에 가까운 빛을 계산한다면, PBR은 Phong Shading에서 무시하는 실제 물질의 물리적 특성을 고려하여 여러 가지 물리 현상을 구현하는 방법이 되겠다.

이것이 문제가 되는 이유는, 카툰 렌더링은 비실사 렌더링 방식에 해당한다는 점이다. 그로 인해 PBR 방식의 Principled BSDF는 카툰 렌더링 방식의 ‘미야코’ 모델에 맞지 않았다.

확인해 보니 해당 모델에서는 Toon BSDF와 NPRILMDiffuse라는 커스텀 Lighting 노드를 사용하였고, 이게 Blender와 호환이 되지 않아 언리얼 엔진으로 export가 불가능했던 것이다.

NPRILMDiffuse 노드의 구현.

2.3 해결 방법: 손수 할당하기 vs. Material Baking 하기

이 문제를 해결하려면 여러 가지 방법이 있다.

  1. Unreal Engine에서 Material을 손수 할당해 준다: 실제로 많이 사용하는 방법이라고 한다. 특히나 해당 모델에서 사용하는 Toon Shader는 라이팅을 고려하지 않기 때문에, 결국 언리얼에서 다시 처리해 줄 필요가 있다.
  2. Material을 Baking 해서 내보내기: 모델에 절차적으로 생성한 Material(Prodecurally generated material)이 있으면 자동으로 내보낼 수 없다. 따라서 Material을 베이킹해서 export 하면 된다.

이때 2번, Material을 Baking 해서 내보내는 방법은 다음 영상에서 잘 설명하고 있어서, 자세한 설명을 이를 참고하자.

Material Baking 방법: https://youtu.be/JE2Zmy088zc?si=IfYMOotvhZNyXRi1

Material을 Baking 하게 되면 현재 모델에 입혀진 이미지를 BaseColor, Roughness 등에 대한 Texture 형태로 내보내게 된다.

그런데 내 상황에서는 이미 모델을 제작한 아티스트가 아래와 같이 Texture 이미지를 제공하고 있어, 굳이 Baking 하는 작업이 필요하지 않았다. 다만 이 Texture가 자동으로 매핑되지 않아서 문제가 발생한 것이다.

Texture 자체는 위와 같이 있지만, Material에 자동으로 연결이 안 되었다.

또 위 영상에서 Material을 Baking하는 방법에는 단점이 있는데, 말 그대로 Material을 하나의 Texture로 내보낸다는 점이다. 카툰 렌더링을 위해서는 광원의 위치나 밝기, 방향에 따라 음영이 달라져야 하는데, 여기에서는 하나의 고정된 이미지로 내보내진다. 당연히 이미지를 씌운다고 해서 실시간으로 카툰 렌더링이 처리되지는 않는다.

그래서 내가 내린 결론은, 일단 Material을 직접 매핑해 준 다음 툰 느낌이 나도록 언리얼 엔진에서 따로 커스텀하는 것이다.

다만 여기서 고민하다 보니 발견한 문제점인데, 바로 맵과 캐릭터가 어울리지 않는 문제점이다. 캐릭터가 툰 스타일이라면 맵도 함께 툰 스타일로 설계해야 한다. 또한, 현재에는 미야코 캐릭터만 있지만 나중에 여러 몬스터에 대한 모델을 가져오더라도 툰 스타일로 그려지지 않으면 어색하게 보일 것이다.

이 부분은 진행하면서 안되면 바꿔볼 예정이다.

2.4 Material을 옮기자 : Blender to UE5

이야기가 길었지만, 결론적으로 손수 Material에 Texture를 할당하기로 했다.

Material은 20개나 있었지만, 의외로 작업 자체는 금방 끝나게 되었다.

이렇게 아무 것도 할당되지 않은 Material에 Textures를 할당해주어야 했다.
20개 Material에 대해 텍스처를 할당한 후, 폴더를 정리해주었다.
각 Material마다 Base Color, Roughness, Normal(몇 개에 대해서만 있었음) 텍스처를 할당해주었다.
결과 캐릭터, 카툰 렌더링 방식이 아니라서 얼굴이 과도하게 반짝거린다.

결과물은 위와 같은데, 얼굴이 너무 강렬하게 빛나는 문제, 캐릭터의 얼굴이 너무 동글동글해 보이는 문제가 있었다.

두 문제 다 카툰 렌더링 방식으로 쉐이더를 바꾸면 해결될 문제 같으니, 여기에서는 넘어가기로 했다.

다만 다른 부분은 괜찮았는데, 미야코 캐릭터의 ‘헤일로’ 부분이 문제였다.

미야코 캐릭터 이미지, 머리 부분을 보면 헤일로가 있다.
원 모델에서 헤일로는 반짝이는 색상(Emission)이 적용되어 있다.
원 모델의 쉐이더 그래프를 보면, 헤일로에 Emission이 적용되어 있다.

그러나 현재 import 한 모델에는 Emission 효과가 적용되지 않은 상태라 직접 효과를 추가하기로 했다.

Halo 부분에 대한 Blender의 쉐이더 그래프

그런데 Blender에서 UE5로 옮기면서 정확히 대응되는 노드가 없어, UE5에서 재설정하는 방법을 살펴보았다.

  • Emission Node (Blender) : Emissive Color(UE5)에 연결한다.
  • Transparent BSDF(Blender): 투명도를 설정하려면 Blend Mode(UE5)를 Translucent로 설정해줘야 한다.
  • Disable Shadow(Blender): Material 속성에서 Cast shadow 설정을 체크 해제한다(UE5).
설정이 끝난 모습. 헤일로가 예쁘게 빛나는 모습을 볼 수 있다!

3. 리깅 확인하기

이 정도면 기본적인 모델 가져오기 작업은 끝난 것 같다.

다만 애니메이션을 적용하려면 한 가지 확인할 점이 있는데, 바로 리깅(Rigging)이다.

3.1 카툰 렌더링에 맞게 어떻게 적용할 것인가?

모델에서 확인해야 하는 점은 두 가지 정도가 있었는데, (1) 모델이 잘 움직일 수 있게 관절이 심어져 있는지와 (2) 헤어, 치마 부분이 어떻게 처리되어 있는지였다.

(1) 번은 당연히 애니메이션을 적용하기 위해 필요한 부분으로, 리깅이 되어 있어야 본을 움직여 캐릭터를 움직일 수 있다.

(2) 번은 조금 고민하고 나서야 생각이 난 부분인데, 캐릭터가 움직일 때 머리카락과 옷, 특히 치마 부분은 물리 연산에 의해 움직이게 된다.

(2) 번에서 먼저 머리카락부터 살펴보자. 일반적으로 언리얼 엔진에서 작업할 때, 머리카락은 별도 오브젝트로 분리하여 Groom으로 Hair Simulation을 진행한다고 한다. 다만 해당 방식은 지나치게 현실적인 물리 처리를 보여주기 때문에, 해당 프로젝트에서 사용할 카툰 스타일 렌더링(Stylized rendering)에는 적합하지 않다.

현재 캐릭터 모델엔 이미 머리카락이 존재하므로, groom으로 처리하기는 어려워 보였다.

두 번째로 옷을 시뮬레이션할 때에는 옷에 Kinetic Collider를 부착하여 Cloth Simulation을 할 수 있다고 한다(Chaos Cloth). 그러나 이것도 어려운 점이, 옷 자체를 별도 오브젝트로 분리해서 부착해야 했다. 미야코 모델은 아예 옷까지 하나의 모델로 합쳐져 있으므로 이것도 적용하기 어려웠다.

Chaos Cloth 기반 Cloth Simulation Tutorial: https://www.youtube.com/watch?v=QW7LEY5JA88

 

위 사항은 모두 지금처럼 옷이나 머리카락까지 폴리곤으로 구성되어 하나로 합쳐진 카툰 캐릭터에는 적용하기 어려워 보였다.

그래서 어떻게 처리해야 할지 찾아본 결과, 머리카락이나 옷에 Bone이 있을 경우 Rigid body Simulation으로 시뮬레이션이 가능하다고 한다. 애니메이션 블루프린트에서 Rigidbody 노드를 활용하면 된다(참고: https://dev.epicgames.com/documentation/ko-kr/unreal-engine/animation-blueprint-rigid-body-in-unreal-engine).

Rigidbody 노드를 활용하여 머리카락, 옷 등의 물리 시뮬레이션이 가능하다(출처: 언리얼 공식문서)

실제 이를 다룬 튜토리얼 영상이 아래에 있는데, 필요하다면 참고하면 좋을 것 같다.

튜토리얼 영상: https://youtu.be/NVKa_EWjuHE?si=QwqdKIM_QeOPBOT-

 

실제로 Blender에서 확인해 보니, 이미 meta rig라는 이름으로 머리카락, 치마를 포함하여 리깅이 되어 있었다. 즉, 위 영상처럼 Rigidbody 노드를 이용해 물리 시뮬레이션을 하기에 좋은 환경이었다.

meta rig의 이름으로 옷, 머리카락에도 이미 리깅이 되어 있었다.

3.2 캐릭터 모델의 리깅 확인하기

최종 검수를 위해, 직접 import 한 모델에 본이 잘 포함되어 있는지 확인해 보자.

Skeleton 에셋을 열고 중앙의 Scene View에서 Character → Bones → All Hierarchy를 누른다.

fbx 모델을 Skeletal Mesh로 import하면 위 세 개 파일이 나오는데, 이 중 Skeleton을 열자.

그러면 아래와 같이 모든 Bone을 시각화하여 볼 수 있는데, 잘 보면 머리카락과 치마 등 meta rig에 있었던 bone까지 정상적으로 import 되었음을 확인할 수 있다.

다만 실제로 다른 모델들이 갖는 애니메이션을 적용하려면 IK Rig를 활용하여 Animation Retargeting이라는 작업을 거쳐야 한다.

예를 들어, UE5의 기본 캐릭터 Mannequins의 애니메이션을 이번에 import 한 Miyako 캐릭터에 적용하려고 하면 오류가 나타난다. 왜냐하면 두 캐릭터 사이에는 Skeleton 구조가 다르기 때문이다.

Mannequins의 Skeleton.
Miyako 모델의 Skeleton. 언리얼 모델과는 구조가 달라 Rig 단에서 Retargeting이 필요하다.

이 부분은 다음에 Rigging 작업을 할 때 다룰 예정이다.

 

댓글