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

Posted

技术标签:

【中文标题】使用 fbx sdk c++ 从 fbx 读取纹理文件名【英文标题】:read texture filename from fbx with fbx sdk c++ 【发布时间】:2013-11-07 04:48:10 【问题描述】:

我在尝试使用 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);
    

这是一个漫反射非分层纹理...所以 else 分支很重要... textureCount 为 1 - 所以找到了纹理但文件名和纹理 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】:

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

【讨论】:

以上是关于使用 fbx sdk c++ 从 fbx 读取纹理文件名的主要内容,如果未能解决你的问题,请参考以下文章

某些加载的 FBX 文件的纹理映射失败

如何从 Unity 导出带有纹理的 fbx?

如何从 Blender 中导出 fbx 纹理以在 Monogame 中使用

将 .FBX 从 Blender 导入 Unity 时出现深色纹理

如何使用切线和纹理坐标从3DSMAX导出到FBX

Unity3D:通过 C# 脚本从 FBX 中提取纹理