прочитать текстовое имя файла из fbx с помощью fbx sdk переполнение стека

Я застрял при попытке получить информацию из файла fbx с помощью fbx sdk. Я создал модель fbx в Maya с текстурой на ней. все, что я хочу сделать, это найти полное имя файла для используемой текстуры в коде …

вот некоторый код:

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
}

Может ли кто-нибудь помочь мне понять, что я делаю неправильно?

Спасибо!

2

Решение

Должен привести свою fbxtexture к fbxfiletexture … затем getfilename

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]