[UE4] Engine에 Skeletal Mesh를 넣을 때 주의사항
[UE4] Engine에 Skeletal Mesh를 넣을 때 주의사항
개요
1. 문제 인식
2. 문제 파악
3. 해결 과정과 방법
4. 추가 및 개선 사항
- Reset Script 포함
문제 인식
- 3DS MAX에서 작업한 Character를 UE5에 Import를 했는데, MAX에서 작업한 것과 다르게 늘어지는 부분들이 존재함.
문제 파악
- MAX에서 작업물 확인을 해보았지만 이상이 없음.
- UE5에서 넣어서 보니, 날개, 치마, 머리 옆 액세사리가 늘어나 있음.
해결 과정과 방법
- Unity에 같은 DATA를 넣고, Generic과 Humanoid로 확인함. // 같은 현상이 일어남.
> UE5와 Unity에 DATA를 넣어 본 결과 같은 결과가 나오는 것으로 보아, Engine의 문제는 아닌 것으로 생각됨.
- 혹시나 하는 마음에, 3D Viewer에도 넣어서 확인함.
- 비교 분석 시작함.
> 먼저 Engine에서 Skeleton tree에서 정상적으로 나오는 부분과, 비정상적으로 나오는 부분을 비교함.
> 비교해 보니, Bone의 Scale이 다르다는 것을 확인 함.
> 정상적으로 나오는 부분의 Bone은 Scale 값이 전부 1로 되어 있음.
> 비정상적으로 나오는 부분의 Bone의 경우 Scale 값이 1이 아닌 값을 하고 있음.
>> Scale 값이 문제인 것으로 추정하여 3DS MAX에서 Bone의 Scale 값 확인 결과, Engine에서와 같은 현상이었음.
- 정상적으로 작동하는 DATA를 UE5와 Unity에 넣어 보고 같은 부분 확인 함.
- 날개 중 한 부분을 Scale 값을 MAX에서는 100, Engine에서는 1로 맞추어 Engine에 넣음.
> MAX에서 Export 했을 때와 같은 모습을 UE5에서 확인할 수 있었음.
- MAX에서 나머지 부분 또한 각 Bone의 Scale 값을 100으로 맞춰줌. // UE5에서는 1로 됨.
- 전부 MAX에서 Export 한 값과 같게 나옴.
- 결과물 검수를 위하여, MAX에서 간단한 Animation을 잡아, Anim 파일로 UE5에 넣음.
- 정상적으로 나옴을 확인함.
- UE5에서 스켈레톤 트리를 열어서 모든 Scale 값이 1로 되어 있는지 확인.
- 결과적으로 좋은 리소스를 얻기 위해서는 Bone, 조인트의 스케일 값은 수정하지 말고, Bone tool에서 사이즈를 조절해야 함.
- 연출파트에 문제점을 전달하고, Bone Scale Reset 방법 전달 및 스크립트 제작 배포
추가 및 개선 사항
- MAX가 아닌 UE5에서 Bone의 Scale 값을 1로 수정 할려고 하니, XYZ축의 Scale값중 하나를 수정 하면, 다른 두 축의 값이 따라 변하기 때문에 수정 할 수 없는 상황이 발생함.
- 결국 MAX에서 작업할 수 밖에 없음.
- 3DS MAX에서 Bone Tools를 이용하여 Scale 값을 모두 초기화 시킬 수 있음.
- Reset Stretch와 Reset Scale 버튼을 클릭하면 되는데, 이것저것 한 번에 하려고, 많은 Bone을 선택 시, 버튼들이 활성화가 되지 않을 수 있는데, Bone On 버튼을 한번 해제하면 활성화가 됨.
- Freeze Length와 Auto-Align 체크 해제 후, Reset 버튼 클릭하는 순서.
- Bone Scale Reset Script
> Root Bone이나 원하는 Bone 선택 후, "RescaleBone" 버튼 클릭.
Script Code
try( destroydialog RescaleBone_rollout )catch()
rollout RescaleBone_rollout "RescaleBone"
(
fn collectChildrenObjs &objs Obj =
(
if objs.count == 0 do
append objs obj
c = obj.children
if c.count == 0 do return undefined
for i in c do
(
append objs i
collectChildrenObjs &objs i
)
)
pickbutton RootBone_pb "pick RootBone"
on RootBone_pb picked val do
(
objs =#()
RootObj = val
collectChildrenObjs &objs RootObj
for i in objs do
i.scale = [1,1,1]
)
)
createdialog RescaleBone_rollout