You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FBXSDK C++中提取骨骼对应的顶点组信息?

解决FBX骨骼对应顶点提取问题
  • 你用bone_node->GetNodeAttribute()转FbxMesh返回nullptr是正常的——骨骼节点的属性类型是FbxSkeleton,并非网格。要提取骨骼对应的顶点,得从模型的网格节点入手,具体步骤如下:
  1. 先获取带顶点数据的主网格节点,拿到FbxMesh对象:

    FbxMesh* mesh = FbxCast<FbxMesh>(mesh_node->GetNodeAttribute());
    if (!mesh) return;
    
  2. 遍历网格的皮肤变形器(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];
                // 这里可存储顶点索引与权重,后续结合骨骼动画矩阵计算顶点位置
            }
        }
    }
    
  3. 核心说明:

    • 骨骼与顶点的绑定关系是存储在网格的皮肤变形器中,而非骨骼节点本身,因此必须从网格节点读取。
    • FbxCluster是骨骼和顶点的绑定桥梁,通过它能直接获取骨骼影响的顶点列表及权重值。
    • 你已拿到的骨骼动画关键帧,可直接对应这里的target_bone,用骨骼的变换矩阵驱动顶点位置计算。

内容的提问来源于stack exchange,提问作者John Sall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:22:37