모델 로드, 애니메이션 재생 과정에서 생기는 버그가 너무 재밌다

2026. 1. 15. 10:16게임 개발 공부 기록/게임을 만들고 싶은 이유

현재 내가 모작하고 있는 게임인 Who's at the door의 등장 캐릭터 모델이다. 제일 처음 fbx 파일을 로드했을 때 저렇게 떴었다.

하지만 fbx 파일을 매번 로드하는 것은 비용과 시간이 상당히 많이 필요하고, 모델 로드에 사용 중인 assimp 라이브러리가 메모리 누수를 유발한다고 공식적으로 알려진 사실이기 때문에 라이브 프로젝트에서는 assimp를 활용하지 않고 fbx 파일에서 필요한 정보만 추출해서 binary로 내보낸 파일을 로드해야 했다. 처음에는 메쉬와 머터리얼의 정보만 추출해서 로드했었는데, bone 정보를 포함해서 추출하고 로드하면서부터 이상한 현상이 발생하기 시작했다. 

 

모델이 무너져버렸다.

마치 녹아내린 듯한 모습, 왜 이렇게 되는지 모르겠어서 골치가 아프면서도 이 모습 자체가 우스꽝스러워서 재미있었다.

 

정말 기괴하다.

바이너리화 과정에서 bone index를 잘못 주고 있었던게 아닐까 싶어서 변경해보았는데 훨씬 더 끔찍해졌다.


이제는 정상적으로 잘 나오는 모습. 이전에 모델이 괴상한 모습으로 뭉개지거나 했던 이유는 뼈 하나하나마다의 로컬 트랜스폼을 부모 뼈의 행렬과 차례로 곱해주어야 하는데, 이 연산이 적용되고 있지 않아서 모든 뼈가 로컬에 존재했던 것이다. 문제를 해결한 후 디버깅 용으로 Bone을 잇는 라인도 그려보았는데 실제로 사용되는 뼈가 아니라 Node 연결용으로 사용되는 Bone까지 이어주니 저렇게 밖으로 튀어나온 선이 만들어졌다.

 

이렇게 Bone의 정보까지 정상적으로 추출, 로드한 모델을 그린 이후에 애니메이션을 추가해보기로 했다.

 

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 

세상에 이럴수가

 

끔찍하고 심각한 버그이지만 이 장면을 보자마자 너무 웃겨서 웃음을 참기 힘들었다...

원인은 바로 이 함수에서 발생하고 있었다. 애니메이션의 키프레임에 따라 갱신된 로컬 트랜스폼을 새로 대입만 해주면 되는 것을 기존의 로컬 트랜스폼에 곱해주고 있었다. 결국 결과가 (기존 로컬 x 변경된 로컬)을 대입한게 되면서 저렇게 이상한 현상이 발생한 것.

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 

수정해주고 나니 잘 적용된다.

요즘 뼈라는 개념을 이용해서 모델을 움직이고 애니메이션을 재생하고 그에 맞는 이벤트를 추가하는 과정을 진행 중인데,  어려운 내용이고 각종 버그도 많이 발생하지만 그 과정에서 너무 재밌는 헤프닝이 많이 발생해서 공부를 이어가는데 중요한 원동력이 되고있다 ㅎㅎㅎ