如何在FBXSDK C++中提取骨骼对应的顶点组信息?
解决FBX骨骼对应顶点提取问题
- 你用
bone_node->GetNodeAttribute()转FbxMesh返回nullptr是正常的——骨骼节点的属性类型是FbxSkeleton,并非网格。要提取骨骼对应的顶点,得从模型的网格节点入手,具体步骤如下:
先获取带顶点数据的主网格节点,拿到
FbxMesh对象:FbxMesh* mesh = FbxCast<FbxMesh>(mesh_node->GetNodeAttribute()); if (!mesh) return;遍历网格的皮肤变形器(Skin Deformer),每个变形器对应一组骨骼绑定关系:
int skin_deformer_count = mesh->GetDeformerCount(FbxDeformer::eSkin); for (int i = 0; i < skin_deformer_count; i++) { FbxSkin* skin = FbxCast<FbxSkin>(mesh->GetDeformer(i, FbxDeformer::eSkin)); if (!skin) continue; // 遍历当前皮肤绑定的所有骨骼簇 int cluster_count = skin->GetClusterCount(); for (int j = 0; j < cluster_count; j++) { FbxCluster* cluster = skin->GetCluster(j); if (!cluster) continue; // 获取当前簇对应的骨骼节点 FbxNode* target_bone = cluster->GetLink(); // 可通过骨骼节点名称匹配你已获取的动画骨骼 // 提取该骨骼影响的顶点索引与权重 int cp_count = cluster->GetControlPointIndicesCount(); const int* cp_indices = cluster->GetControlPointIndices(); const double* weights = cluster->GetControlPointWeights(); // 遍历记录每个受影响的顶点 for (int k = 0; k < cp_count; k++) { int vertex_idx = cp_indices[k]; double weight = weights[k]; // 这里可存储顶点索引与权重,后续结合骨骼动画矩阵计算顶点位置 } } }核心说明:
- 骨骼与顶点的绑定关系是存储在网格的皮肤变形器中,而非骨骼节点本身,因此必须从网格节点读取。
FbxCluster是骨骼和顶点的绑定桥梁,通过它能直接获取骨骼影响的顶点列表及权重值。- 你已拿到的骨骼动画关键帧,可直接对应这里的
target_bone,用骨骼的变换矩阵驱动顶点位置计算。
内容的提问来源于stack exchange,提问作者John Sall
相关产品推荐
相关产品推荐

