FBX SDK Returns 4 个顶点,期望 3 个
FBX SDK Returns 4 Vertices When Expecting 3
我正在尝试使用 AutoDesk FBX SDK 导入一些模型,如下所示。
void SearchNodes(fbxsdk::FbxNode* Node, std::vector<fbxsdk::FbxNode*>& Nodes) {
for (int i = 0; i < Node->GetChildCount(); i++) {
fbxsdk::FbxNode* Child = Node->GetChild(i);
fbxsdk::FbxNodeAttribute* Attribute = Child->GetNodeAttribute();
if (Attribute == NULL) {
SearchNodes(Child, Nodes);
}
else {
FbxNodeAttribute::EType AttributeType = Attribute->GetAttributeType();
if (AttributeType != FbxNodeAttribute::eMesh) {
SearchNodes(Child, Nodes);
}
else {
Nodes.push_back(Child);
SearchNodes(Child, Nodes);
}
}
}
}
void Import(const char* File) {
FbxImporter* Importer = FbxImporter::Create(_FbxManager, "");
if (!Importer->Initialize(File, -1, _FbxManager->GetIOSettings())) {
printf("FBX Import Initialize Failed: %s", Importer->GetStatus().GetErrorString());
return;
}
FbxScene* Scene = FbxScene::Create(_FbxManager, "NewScene");
Importer->Import(Scene);
Importer->Destroy();
FbxNode* RootNode = Scene->GetRootNode();
if (RootNode) {
std::vector<fbxsdk::FbxNode*> Nodes;
SearchNodes(RootNode, Nodes);
printf("Nodes Size: %i (%i)\n", RootNode->GetChildCount(true), Nodes.size());
std::vector<Vertex> OutVertices = {};
for (auto Node : Nodes) {
FbxMesh* Mesh = (FbxMesh*)Node->GetNodeAttribute();
FbxVector4* Vertices = Mesh->GetControlPoints();
for (int j = 0; j < Mesh->GetPolygonCount(); j++) {
int NumVerts = Mesh->GetPolygonSize(j);
printf("NumVerts: %i\n", NumVerts);
//if (NumVerts != 3 ) { continue; }
for (int k = 0; k < NumVerts; k++) {
int VertID = Mesh->GetPolygonVertex(j, k);
Vertex NewVertex{};
NewVertex.pos.x = (float)Vertices[VertID].mData[0];
NewVertex.pos.y = (float)Vertices[VertID].mData[1];
NewVertex.pos.z = (float)Vertices[VertID].mData[2];
OutVertices.push_back(NewVertex);
}
}
}
printf("Out Vertex Count: %i\n", OutVertices.size());
}
}
我将每个 .fbx 文件扔到这个 returns 4 个顶点而不是 3 个。
我想弄清楚为什么我得到 4 个顶点以及我需要做什么来处理额外的顶点。是否提供了这条额外的信息以便我可以处理索引?还是关于多边形的其他信息?
printf("NumVerts: %i\n", NumVerts);
显示每个多边形有多少个顶点,90% 显示 4,偶尔我会看到几个 3。
我的下一步是加载模型的索引和顶点,所以如果这些多边形的额外顶点与索引有关,那就更好了。我只需要知道它为什么会发生以及如何处理它。
我没看到你在任何地方对网格进行三角测量。您可以像这样对其进行三角剖分:
FbxGeometryConverter clsConverter( sdkManager );
clsConverter.Triangulate( Scene, true );
它应该可以解决您的问题。在 Importer->Import(Scene);
和 Importer->Destroy();
之间添加
我正在尝试使用 AutoDesk FBX SDK 导入一些模型,如下所示。
void SearchNodes(fbxsdk::FbxNode* Node, std::vector<fbxsdk::FbxNode*>& Nodes) {
for (int i = 0; i < Node->GetChildCount(); i++) {
fbxsdk::FbxNode* Child = Node->GetChild(i);
fbxsdk::FbxNodeAttribute* Attribute = Child->GetNodeAttribute();
if (Attribute == NULL) {
SearchNodes(Child, Nodes);
}
else {
FbxNodeAttribute::EType AttributeType = Attribute->GetAttributeType();
if (AttributeType != FbxNodeAttribute::eMesh) {
SearchNodes(Child, Nodes);
}
else {
Nodes.push_back(Child);
SearchNodes(Child, Nodes);
}
}
}
}
void Import(const char* File) {
FbxImporter* Importer = FbxImporter::Create(_FbxManager, "");
if (!Importer->Initialize(File, -1, _FbxManager->GetIOSettings())) {
printf("FBX Import Initialize Failed: %s", Importer->GetStatus().GetErrorString());
return;
}
FbxScene* Scene = FbxScene::Create(_FbxManager, "NewScene");
Importer->Import(Scene);
Importer->Destroy();
FbxNode* RootNode = Scene->GetRootNode();
if (RootNode) {
std::vector<fbxsdk::FbxNode*> Nodes;
SearchNodes(RootNode, Nodes);
printf("Nodes Size: %i (%i)\n", RootNode->GetChildCount(true), Nodes.size());
std::vector<Vertex> OutVertices = {};
for (auto Node : Nodes) {
FbxMesh* Mesh = (FbxMesh*)Node->GetNodeAttribute();
FbxVector4* Vertices = Mesh->GetControlPoints();
for (int j = 0; j < Mesh->GetPolygonCount(); j++) {
int NumVerts = Mesh->GetPolygonSize(j);
printf("NumVerts: %i\n", NumVerts);
//if (NumVerts != 3 ) { continue; }
for (int k = 0; k < NumVerts; k++) {
int VertID = Mesh->GetPolygonVertex(j, k);
Vertex NewVertex{};
NewVertex.pos.x = (float)Vertices[VertID].mData[0];
NewVertex.pos.y = (float)Vertices[VertID].mData[1];
NewVertex.pos.z = (float)Vertices[VertID].mData[2];
OutVertices.push_back(NewVertex);
}
}
}
printf("Out Vertex Count: %i\n", OutVertices.size());
}
}
我将每个 .fbx 文件扔到这个 returns 4 个顶点而不是 3 个。
我想弄清楚为什么我得到 4 个顶点以及我需要做什么来处理额外的顶点。是否提供了这条额外的信息以便我可以处理索引?还是关于多边形的其他信息?
printf("NumVerts: %i\n", NumVerts);
显示每个多边形有多少个顶点,90% 显示 4,偶尔我会看到几个 3。
我的下一步是加载模型的索引和顶点,所以如果这些多边形的额外顶点与索引有关,那就更好了。我只需要知道它为什么会发生以及如何处理它。
我没看到你在任何地方对网格进行三角测量。您可以像这样对其进行三角剖分:
FbxGeometryConverter clsConverter( sdkManager );
clsConverter.Triangulate( Scene, true );
它应该可以解决您的问题。在 Importer->Import(Scene);
和 Importer->Destroy();