Построить иерархию костей Assimp, начиная с корня

Я использую Assimp.net для импорта анимированных файлов .dae в свой движок OpenTK и пытаюсь создать удобную иерархическую структуру костей.

В руководстве, которому я следую, корневая кость, или "сустав", содержит список его детских суставов, а это список их детей и так далее.

Assimp возвращает каждый импортированный Mesh объект со списком Bone объектов, отображая Name, OffsetMatrix и VertexWeights кости, но ничего не говорит о его дочерних или родительских костях.

Scene, который содержит Mesh, действительно имеет список всех nodes (некоторые из которых являются костями), и у них действительно есть значение parentName, но построение иерархии с помощью рекурсивных сравнительных проверок быстро становится беспорядочным и далеко не функционирует.

Как я могу выделить корневую кость, потом ее потомков, потом их потомков и т. Д.?


person livin_amuk    schedule 07.07.2018    source источник


Ответы (1)


Оказывается, каждый узел содержит коллекцию своих дочерних узлов с именем children типа NodeCollection, и на основе этого я разработал следующее решение.

Чтобы найти корневую кость, переберите все node в scene и проверьте, найдено ли его имя в списке bones, содержащемся в mesh, а затем, если у этого node есть родительское имя, которого нет в bones list, то это должна быть корневая кость.

Чтобы построить иерархию костей, возьмите children из этого узла "корневой кости", найденного выше, затем найдите совпадающее имя в списке meshesbones и извлеките оттуда требуемые веса вершин и матрицу смещения. Затем рекурсивно выполните поиск по дочерним элементам этих дочерних элементов, используя тот же метод, что и выше: повторение каждого node в сцене до тех пор, пока не будет найдено совпадающее имя bone, затем извлеките данные из bone в списке bones и сделайте это в обратном порядке до тех пор, пока не будет найдено совпадение имени bone. детей не осталось.

Если есть способ получше, я бы хотел его услышать.

person livin_amuk    schedule 09.07.2018