한 mixamo모델의 vertex를 3ds max sdk로 출력하면 대략 86000개가 나온다. 누락되는 거 없이 모든 face들을 순회해서 만든 것이다.
여기서 같은 모델을 assimp에 넣고 vertex를 출력해보았다. 대략 56000개가 나온다. 왜 이렇게 줄었을까 하고, 아마 vertex병합이 일어나지 않을까 생각해서 assimp의 오픈소스를 찾아보앗다. assimp 코드에 code/PostProcessing/JoinVerteicesProcess.cpp라는 코드가 있었다.
https://github.com/assimp/assimp/blob/master/code/PostProcessing/JoinVerticesProcess.cpp
pos, uv, normal,tangent가 거의 유사하다면 같은 것 취급하는 방식이다. 나도 이 방식을 차용해서 max sdk plugin에 넣었다. vertex가 100개정도는 줄긴했으나 의미가 없다. 괜히 코드만 길어졌다.
그런데 재밌는 점을 발견했다. assimp의 scene을 읽을때 aiProcess_JoinIdenticalVertices 플래그를 켜줘야 JoinVerticesProcess가 발동된다는것이다. 한번 켜보고 로그를 띄워봤다.

vertex가 56542에서 16338로 줄었다. 중복되는 vertex가 약 40000개라는 것이다. vertex자체의 수가 86000개가 아니라 56542인 이유는 비슷한 vertex를 병합해서가 아니라, 그냥 진짜 vertex가 56542개라는 것이다. 결론은 86000개의 버텍스를 assimp가 읽을 때 뾰족한 부분은 제거한다든지 가까운 vertex를 합쳐버린다든지 하는 알고리즘을 넣은 것 같다. 그 과정에서 vertex의 중복 현상이 많이 일어나서 병합 알고리즘까지 만들었을 것이다. 어쨌든 중복제거까지 해서 vertex를 크게 줄였으면 그 정도로 엄청난 효과다.
그럼 max sdk plugin을 만들 때 어떻게 처리해야하는가? max는 데이터를 뽑을 때 vertex를 누락시킨다거나 불필요하게 중복시킨다거나 하는 과정이 없다. 최종 vertex를 다 뽑아냈을때 비슷한 vertex를 병합한다 해도 거의 줄지 않는다. 뾰족하거나 불필요하게 vertex가 많은 부분은 아트하시는 분들께 정리해달라고 하거나, meshlab을 이용한 후 다시 뽑아내는게 좋다. 각자 상황에 맞게 잘 사용하시면 좋을 것 같다!