5.7에서 특정 상황에 스켈레탈 메시의 노멀이 한쪽으로 밀리는것같은 현상이 발생함

똑같은 메시인데 링크 구조가 바뀌는경우 해당 현상이 나타남
해당 조건은 꽤나 독특한데
조건은 메시가 별도이고(예를들면 무기) 바이패드(예를들면 핸드 혹은 풋 등) >본 > 본 의 구조로 이루어져있을 경우다
위 이미지를보면 칼처럼 보이는 오브젝트는 바디에 어태치 해둔상태 메시가 별도가 아닙니다
그래서 노멀이 정상으로 나오고 있오 원형으로 보이는 오브젝트는 분리된 메시 입니다.

빠른 결론 → 새로 추가된 임포트 모듈(인터챈스모듈)이 문제였음
1안 → 기존 레거시 모듈로 전환후 해결됨(Interchange.FeatureFlags.Import.FBX 0)
2안 → 버그 루트를 타지 않게 무기와 중간본을(바이패드 핸드 전의 본)무기스킨에 넣고
재바인딩(맥스기준의 AlwaysDeform 재설정)
이후는 문제를 파악하는 상세 과정
처음에 어떤문제인지 파악하기위해 링크등을 변경해보았다
가장 이상했던 현상은
무기를 두개를 세팅하고 둘다 바이패드에 직 링크를 했을 경우는 문제가 없음(맨위처럼 정상노멀이 나옴)
그중 하나라도 핸드에 바로 링크하는게 아닌 중간본을 넣으면 직링크된 다른 한쪽도 같이 이상하게
노멀이 밀리는 현상이 발생함
그래서 이건 맥스의 데이터나 익스포트의 문제가 아닌 임포트의 문제라고 판단을하게됨
게다가
SkeletalMesh] Imported skeletal mesh has some invalid bind poses. Skeletal mesh skinning has been rebind using the time zero pose.
바인딩된 포즈가 유효하지 않아 재생성한다는 오류메세지가 떠서 어떤 오류인지 확인해보기로함
바인드 오류는 직링크 혹은 중간본 사용시 둘다 뜹니다.(중요 엔트리포인트)
먼저 알아야할게 스켈레탈 메시의 바인딩이란 무엇인가
바인딩은 최초의 포즈를 기억한레퍼런스 포즈라고 볼 수 있다
맥스에서도 바인딩 포즈(기본포즈)를 기억하고 스킨데이터에 포함시켜 익스포트 시키고있다
바인드포즈는 기본적으로 뼈대와 메시를 묶을때(skin 모디파이어를 얹을때) 시점을 기억해 내보낸다

맥스에서 always Deform 을 재설정하는것으로 바인드 포즈를 특정 프레임으로 변경할 수 있다
스킨을 지우고 다시 씌워도 변경 가능함
언리얼에서 임포트 할때
저 바인드 포즈와 임포트된 본등을 처리하는 로직이 있는데
위 로그는 해당 바인드포즈가 유효하지 않기때문에(본갯수나 링크 구조가 달라) 0포즈로 새로 만들고 진행하겠다는 내용입니다.
위 메세지가 힌트이므로 찾아봅니다.

저 메세지가 뜬다는건 bUseTimeZeroAsBindPose 를 강제하고 있네요
호출함수는 빌드 메시 레퍼런스니까 임포트 초기에 생성하는 단계같습니다(예상)

다행이 분기가 7개뿐이니 후딱 살펴봅니다.
일단 노멀 / 탄젠트 등이 문제니 전체 분기나 사용되는 함수중에
노멀등을 연산하는부분이 있나 확인해봅니다.(노멀 임포트 포함)
혹은 여기서 recompute normal 의 분기를 찾아도되는데 일단 눈으로 먼저 찾아보도록 합니다.
노멀은 사용되는데가 좀 있을거같아서 탄젠트로 진행

탄젠트를 찾으니 일단 기본 값을 집어넣는함수가 나오고 18개나 되니 끝까지 확인해봅니다.

마지막 사용처도 같은 함수니
분명 저 함수안에서 무언가 이루어져 노멀이 망가지는거라고 판단했습니다.
이제 이 긴 함수를 위에서부터 봐야하는데 적당히 모르는 부분은 넘어가면서 보게되었습니다.(너무 길어서)

함수안에 노멀연산부는 딱 저곳이고 저기가 문제의 원인이 맞나 확인하기위해
에셋임포트 테스트를 진행했습니다.
실제로 문제가 있는 에셋과 문제가 없는에셋의 차이를 봐야하니까

문제 있는 에셋의경우는 저 루트로 들어오고
문제가 없다면 해당 함수를 호출하지 않는것을 확인했습니다.
여기서 어떤 이유때문에 여기로 오는지를 확인을 잠시만 하도록합니다.(긴글주의)

스켈레탈이고 bSkinControlPointToTimeZero 여야 하네요
const bool bSkinControlPointToTimeZero
= ImportAssetObjectLODData.bUseTimeZeroAsBindPose && ImportAssetObjectLODData.bDiffPose;
ㅇ 글 초반에 중요 엔트리 포인트라고 적은곳이 있는데 거기서
정상 임포트 / 비정상 임포트 둘다 bUseTimeZeroAsBindPose 변수는 둘다 강제로 참으로 만들었습니다.
맨처음 언리얼 로그에 나오는 내용을 찾자 마자 나온내용입니다.
그렇다면 둘을 가르는 분기는
ImportAssetObjectLodData.bDiffPose
변수가 되는거로 확인이 되며
해당 변수는 검색을 해도 Set이 존재하지 않습니다(이런경우 좀 스트레스 받음..)
사용된 함수들을 Inout 으로 되있는지도 보고 인자들을 살펴보다보면

저 함수내부에서 특정조건에 bOutDiffPose 로 값이 씌여지는걸 확인할 수 있음

위조건들은 하나하나 찾기 어려워서 에셋임포트로 검증함

불량 임포트시 nearlzero 에 걸림(정상은 안걸림)

W_R_D - 웨폰에 스킨된 본입니다.
바인딩 로케이션
{Translation={X=0.85048174312963487 Y=-0.36804727737349957 Z=38.883235931396477} Rotation={X=0.33921411608841712 Y=-0.16172751672948488 Z=0.33921411608841712 W=-0.16172751672948488}}
로컬포즈 로케이션
{Translation={X=38.883371666364226 Y=18.641527393620734 Z=-61.644611361509256} Rotation={X=0.33921408285022142 Y=-0.16172665870835876 Z=0.85048212838932025 W=-0.36804679478224639}}
값이 달라서 실제로 위 분기를 타게 됩니다.
다시 본론으로
처음에 노멀함수들을 전부 살펴보는데 이상한점을 못찾았음
이상한점을 찾으셧나요?
한참보니
노멀은 FVector3f 형인데
마지막에 Fvector4f 형으로 집어넣습니다

뭔가 이상해서
일단 다른 코드를 살펴봤습니다.
이렇게 포지션 바이노멀은 형을 명시적으로 맞춰주고 있고
탄젠트와 노멀을 둘다 똑같이 vector3 형에 vector4 를 넣고 있는것을 확인했습니다.
아마 둘은 암시적으로 변환이 일어날것이고

벡터 변환 함수를 보니 정히 다 이해할순 없었지만(내용자체가 좀 깁니다..)
W성분에 의해서 벡터가 바뀌는걸 확인했습니다.
이제 값을 실증하기위한 테스트를 진행
저 함수 이후 값이 이상해지는지 확인을 진행
노멀값
함수 통과전 = {X=-0.454708904 Y=0.889200449 Z=-0.0506199673}
통과후 = {X=-0.639536321 Y=0.00490738358 Z=0.768745184}


이제 버그인것도 확인했고 엔진수정없이 진행할수 있는 방법을 찾아 보았습니다.
일단 위에서 찾은 힌트중
바인딩 포즈가 동일하면 버그성 분기를 타지 않아 테스트 진행
무기용 스킨에 무기본→중간본→바이패드 핸드 까지 전부 추가해두고
재바인딩 처리를 하면 오류가 사라짐
이방법은 유효하나 쓰지 않는 본도 스킨본에 묶이기때문에 다른방법을 더찾아봄
임포터가 원래있던 단일이 아닌
스태틱 / 스켈레탈 에셋을 통합하는 임포터로 바뀐건 인지하고 있기에
기존 임포터를 사용할 수 있나 확인함

임포트시 사용되는 스켈레탈메시임포트 의 내부 변수명을 검색하니
이렇게 임포터가 하나더나왔다


이렇게 인터챈스의 임포터 / 제네릭 에셋 임포터라는 다른종류의 임포터가 별도로 존재하고
현재 쓰고있는 임포터는 인터챈스 임포터? 이런 이름이엇고(로그에 찍힘)

그럼 인터챈스가 아닌 다른건 레거시? 이런이름이엇을거같다고 추정하며

콘솔창에 검색하니 저렇게 모든 에셋의 임포터를 끄거나 켤수 있는 콘솔이 나옴
해서 스켈레탈메시의 임포터를 꺼주면 기존 버그코드가 있는 임포터 라인을 타지 않습니다.

반가운 기존 임포터 창 등장

위 임포터를 상요하면
해당 버그코드는 지나지 않기때문에 문제 없이 진행되지만
해당 레거시 임포터는 디플리케이트 예정이므로 엔진이 업데이트되길 기대해 봅니다.
'unreal > Unreal ETC' 카테고리의 다른 글
| [Unreal_ETC]런타임 머터리얼 파라메터 변경 (0) | 2026.10.12 |
|---|---|
| Unreal_컨텐츠 폴더 하위 에셋 탐색하기 (0) | 2026.08.14 |
| Unreal_언리얼에서 파이썬을 사용해보자! (0) | 2026.08.11 |
| Unreal_5.44 안드로이드 vulkan 모바일에 렌더독붙이기 (0) | 2026.01.20 |
| [Unreal_Editor] 툴바에 UMG열기 버튼 추가 (0) | 2025.02.25 |