Разбираемся с FbxAnimStack в Fbx без сетки
Я загрузил несколько файлов MIXAMO, чтобы провести небольшое тестирование. У меня есть YBot, который включает Mesh (Vertices), Layer (UVs, Normals) и Skin (Transform, LinkTransform и Bone Weights).
Также скачал несколько анимаций без скина. Таким образом, они содержат Skeleton + AnimStack + Frames.
Данные сетки и рендеринг позы работают хорошо, но, поскольку я изучаю это по ходу дела, а формат FBX, кажется, не очень четко документирован с точки зрения использования в игровых движках, я немного застрял. У меня есть следующие данные, извлеченные из обоих файлов:
- Mesh (Vertices + UVs + Normals) - файл #1
- Скелет (костная структура) - файл №1
- Кожа (Mesh + Bone Combo = Cluster/Deforms = Transforms/BoneWeights) - файл №1
- Анимация (кадр + скелет + вычисление * преобразование () с использованием времени кадра) - файл №2
(структура узла Skeleton - это связь между двумя файлами)
И это данные, связанные со скелетом / анимацией, которые я храню:
// mesh file #1
// I use FBXSDK_TIME_INFINITE here as this is the static part of the data
XMMATRIX aMeshGeometricTransform, // (mesh) aFbxNode->GetGeometric*() combo
XMMATRIX aMeshNodeGlobalTransform, // (mesh) lFbxNode->EvaluateGlobalTransform(FBXSDK_TIME_INFINITE)
XMMATRIX aMeshNodeLocalTransform, // (mesh) lFbxNode->EvaluateLocalTransform(FBXSDK_TIME_INFINITE)
XMMATRIX aClusterTransformMatrix, // (cluster) lFbxCluster->GetTransformMatrix()
XMMATRIX aClusterTransformLinkMatrix, // (cluster) lFbxCluster->GetTransformLinkMatrix()
XMMATRIX aClusterNodeGlobalTransform, // (cluster) lFbxClusterNode->EvaluateGlobalTransform(FBXSDK_TIME_INFINITE)
XMMATRIX aClusterNodeLocalTransform, // (cluster) lFbxClusterNode->EvaluateLocalTransform(FBXSDK_TIME_INFINITE)
// animation file #2
// here are the animation frames (lTime = FbxTime.SetFrame(#Frame, FbxTime::EMode::eFrames60))
XMMATRIX aFrameSkeletonGlobalTransform, // (take/frame) lFbxNode->EvaluateGlobalTransform(lTime)
XMMATRIX aFrameSkeletonLocalTransform // (take/frame) lFbxNode->EvaluateLocalTransform(lTime)
Затем я использую эти промежуточные точки данных для объединения в Vertex/Constant Buffer
. Также запуститеFbxSystemUnit::m.ConvertScene
+ DirectX.DeepConvertScene
+ Triangulate
против сцены.
Как мне объединить все эти переменные, чтобы правильно разместить анимированную вершину? Мне нужно извлечь больше данных, чтобы анимация работала? Должен ли я загружать файлы анимации со скинами и извлекать анимацию, пройдя черезAnimStack/Mesh/Deformer/Cluster
даже если бы я предпочел просто разделить их?