Post

[CSEngine] 애니메이션

CSEngine은 DAE파일을 불러오는 것과 동시에 애니메이션도 에셋화를 진행합니다.

[CSEngine] 애니메이션

CSEngine은 DAE파일을 불러오는 것과 동시에 애니메이션도 에셋화를 진행합니다. 애니메이션 에셋을 다른 모델링에 적용하는 것 역시 가능합니다.


구현을 위한 여정

애니메이션이 구동되는 영상

애니메이션은 정말 밑바닥부터 작업을 해야했기 때문에 오래걸린 파트 중 하나입니다.

평소 같았으면 DirectX Sample에 포함된 스키닝 예제와 FBXSDK를 이용해서 이론만 알고있다면 큰 무리없이 작업이 되었을거라 생각합니다.

하지만 구현하던 당시엔 환경이 너무 제약적이라 리눅스에 OpenGL만 돌아가는 상황이였습니다. 따라서 플랫폼과 msvc 버전마다 큰 차이가 있는 FBXSDK부담스러운 용량을 가진 Assimp은 사용하기 힘들었습니다.

결국 모델 파싱부터 애니메이션까지 모두 직접 구현해야겠다고 마음을 먹고 작업을 하였습니다.

다행스럽게도 구현은 성공적으로 마무리 되었습니다.

하지만 구현에 너무 치중한 나머지 여러 애니메이션이 돌 때 연산이나 함수 호출이 꽤 많기도 하고, std::map을 남용해버려서 결국 성능에 큰 문제를 야기하였습니다.

현재 모든 std::map으로 구현된 모든 자료구조와 move semantics를 다시 공부하여 쓸데없이 재할당되는 현상도 수정했습니다. 덕분에 당시보다 훨씬 나아진 성능을 보여주고 있습니다.


파일 파싱 로직

daeloader.png

파일의 파싱은 위 다이어그램과 같이 진행하게 됩니다.
분홍색은 파싱을 위한 임시 객체, 파란색은 리소스 객체, 녹색은 컴포넌트 객체 입니다.


애니메이션 작동 원리

애니메이션을 위해선 Animation 오브젝트를 가진 Animator Component, 뼈대의 행렬을 담은 Joint Component가 필요합니다.

클래스와 해당 로직의 전반적인 구조는 소스코드는 아래의 문서에서 확인해주시면 감사하겠습니다.

CSEngine: C++ 문서

This post is licensed under CC BY 4.0 by the author.