代码之家  ›  专栏  ›  技术社区  ›  motz

使用fbx-sdk-c从fbx读取纹理文件名++

  •  5
  • motz  · 技术社区  · 12 年前

    我在尝试使用fbx-sdk从fbx文件中获取信息时被卡住了。我在maya中创建了一个带有纹理的fbx模型。我只想在代码中找到所用纹理的完整文件名。。。

    以下是一些代码:

    void Model::GetFbxInfo(FbxNode* Node)
    {
    int numKids = Node->GetChildCount();
    FbxNode* childNode = 0;
    
    for (int i = 0; i < numKids; i++)
    {
        childNode = Node->GetChild(i);
        FbxMesh* mesh = childNode->GetMesh();
    
        if (mesh != NULL)
        {
            // get vertices, indices, uv, etc
            // some more code...
            // get vertices, indices, uv, etc
    
            //================= Texture ========================================
    
            int materialCount = childNode->GetSrcObjectCount<FbxSurfaceMaterial>();
    
            for (int index = 0; index < materialCount; index++)
            {
                FbxSurfaceMaterial* material = (FbxSurfaceMaterial*)childNode->GetSrcObject<FbxSurfaceMaterial>(index);
    
                if (material != NULL)
                {
                    LOG(INFO) << "\nmaterial: " << material->GetName() << std::endl;
                    // This only gets the material of type sDiffuse, you probably need to traverse all Standard Material Property by its name to get all possible textures.
                    FbxProperty prop = material->FindProperty(FbxSurfaceMaterial::sDiffuse);
    
                    // Check if it's layeredtextures
                    int layeredTextureCount = prop.GetSrcObjectCount<FbxLayeredTexture>();
    
                    if (layeredTextureCount > 0)
                    {
                        for (int j = 0; j < layeredTextureCount; j++)
                        {
                            FbxLayeredTexture* layered_texture = FbxCast<FbxLayeredTexture>(prop.GetSrcObject<FbxLayeredTexture>(j));
                            int lcount = layered_texture->GetSrcObjectCount<FbxTexture>();
    
                            for (int k = 0; k < lcount; k++)
                            {
                                FbxTexture* texture = FbxCast<FbxTexture>(layered_texture->GetSrcObject<FbxTexture>(k));
                                // Then, you can get all the properties of the texture, include its name
                                const char* textureName = texture->GetName();
                                LOG(INFO) << textureName;
                            }
                        }
                    }
                    else 
                    {
                        // Directly get textures
                        int textureCount = prop.GetSrcObjectCount<FbxTexture>();
                        for (int j = 0; j < textureCount; j++)
                        {
                            FbxTexture* texture = FbxCast<FbxTexture>(prop.GetSrcObject<FbxTexture>(j));
                            // Then, you can get all the properties of the texture, include its name
                            const char* textureName = texture->GetName();
                            LOG(INFO) << textureName;
    
                            FbxProperty p = texture->RootProperty.Find("Filename");
                            LOG(INFO) << p.Get<FbxString>() << std::endl;
    
    
                            HRESULT hr;
                            D3DX11CreateTextureFromFile(Game::GetInstance()->GetRenderer()->GetDevice(), textureName, 0, 0, &m_texture, &hr);
                            if(FAILED(hr))
                            {
                                std::string message;
                                message.append("Load Texture: ");
                                message.append(texture->GetName());
                                message.append(" failed");
                                SHOWMESSAGEBOX(hr, message.c_str());
                            }
                        }
                    }
                }
            }
    
            this->GetFbxInfo(childNode);
        }
    }
    

    }

    这是一个漫反射的无层纹理。。。所以其他分支很重要。。。textureCount为1-因此可以找到纹理,但filename和纹理getname只返回“file1”

    这是我正在加载的ascii fbx文件中的一段数据

    Video: 900530112, "Video::file1", "Clip" {
        Type: "Clip"
        Properties70:  {
            P: "Path", "KString", "XRefUrl", "", "D:/Dropbox/Projects/MyModel/MyTexture.jpg"
        }
        UseMipMap: 0
        Filename: "D:/Dropbox/Projects/MyModel/MyTexture.jpg"
        RelativeFilename: "MyTexture.jpg"
    }
    Texture: 785759328, "Texture::file1", "" {
        Type: "TextureVideoClip"
        Version: 202
        TextureName: "Texture::file1"
        Properties70:  {
            P: "CurrentTextureBlendMode", "enum", "", "",0
            P: "UVSet", "KString", "", "", "map1"
            P: "UseMaterial", "bool", "", "",1
        }
        Media: "Video::file1"
        FileName: "D:/Dropbox/Projects/MyModel/MyTexture.jpg"
        RelativeFilename: "MyTexture.jpg"
        ModelUVTranslation: 0,0
        ModelUVScaling: 1,1
        Texture_Alpha_Source: "None"
        Cropping: 0,0,0,0
    }
    

    有人能帮我理解我做错了什么吗?

    谢谢!

    1 回复  |  直到 12 年前
        1
  •  6
  •   jags    12 年前

    必须将你的fbxtexture转换为fbxfiletexture。。。然后获取文件名