gpt4 book ai didi

c++ - 在 OpenGl 中导入和显示 .fbx 文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:58:01 25 4
gpt4 key购买 nike

我一直在尝试使用 FBX SDK.Untill 导入和显示 fbx 文件。我设法加载了文件,但卡在了必须显示文件的部分。问题:

  1. 这些指标到底是什么?
  2. 我应该如何显示顶点?

这是我制作的类(class):

3dModelBasicStructs.h

struct vertex
{
float x,y,z;
};

struct texturecoords
{
float a,b;
};

struct poligon
{
int a,b,c;
};

模型.h

#ifndef MODEL_H
#define MODEL_H
#define FBXSDK_NEW_API

#define MAX_VERTICES 80000
#define MAX_POLIGONS 80000


#include <fbxsdk.h>
#include "3dModelBasicStructs.h"
#include <iostream>
#include <GL/glut.h>
using namespace std;

class Model
{

public:

Model(char*);
~Model();

void ShowDetails();

char* GetModelName();
void SetModelName( char* );
void GetFbxInfo( FbxNode* );
void RenderModel();
void InitializeVertexBuffer( vertex* );

private:

char Name[25];

vertex vertices[MAX_VERTICES];
poligon poligons[MAX_POLIGONS];

int *indices;
int numIndices;

int numVertices;


};


#endif

模型.cpp

#include "Model.h"






Model::Model(char *filename)
{
cout<<"\nA model has been built!";

numVertices=0;
numIndices=0;

FbxManager *manager = FbxManager::Create();

FbxIOSettings *ioSettings = FbxIOSettings::Create(manager, IOSROOT);
manager->SetIOSettings(ioSettings);

FbxImporter *importer=FbxImporter::Create(manager,"");
importer->Initialize(filename,-1,manager->GetIOSettings());

FbxScene *scene = FbxScene::Create(manager,"tempName");

importer->Import(scene);
importer->Destroy();

FbxNode* rootNode = scene->GetRootNode();
this->SetModelName(filename);
if(rootNode) { this->GetFbxInfo(rootNode); }

}

Model::~Model()
{
cout<<"\nA model has been destroied!";
}


void Model::ShowDetails()
{
cout<<"\nName:"<<Name;
cout<<"\nVertices Number:"<<numVertices;
cout<<"\nIndices which i never get:"<<indices;

}

char* Model::GetModelName()
{
return Name;
}

void Model::SetModelName(char *x)
{
strcpy(Name,x);
}

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 ====================================
int numVerts = mesh->GetControlPointsCount();

for ( int j=0; j<numVerts; j++)
{
FbxVector4 vert = mesh->GetControlPointAt(j);
vertices[numVertices].x=(float)vert.mData[0];
vertices[numVertices].y=(float)vert.mData[1];
vertices[numVertices++].z=(float)vert.mData[2];
cout<<"\n"<<vertices[numVertices-1].x<<" "<<vertices[numVertices- 1].y<<" "<<vertices[numVertices-1].z;
this->InitializeVertexBuffer(vertices);
}
//================= Get Indices ====================================
int *indices = mesh->GetPolygonVertices();
numIndices+=mesh->GetPolygonVertexCount();
}
this->GetFbxInfo(childNode);
}
}

void Model::RenderModel()
{
glDrawElements(GL_TRIANGLES,36,GL_INT,indices);
}
void Model::InitializeVertexBuffer(vertex *vertices)
{
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,0,vertices);
//glDrawArrays(GL_TRIANGLES,0,36);
}

可悲的是,当我尝试使用 drawelements 时,我得到了这个错误:A new begging.exe 中 0x77e215de 处未处理的异常:0xC0000005:访问冲突读取位置 0xcdcdcdcd。

最佳答案

2) How should I display the vertices?

像这样的问题表明,您应该学习一些 OpenGL 教程。这些是基础知识,您需要了解它们。

这是解决您的问题的良好开端,但您需要完成整个教程 http://opengl.datenwolf.net/gltut/html/Basics/Tut01%20Following%20the%20Data.html

1) What exactly are those indices ?

你有一个顶点列表。顶点的索引是它在该列表中的位置。您可以使用 glDrawElements

按索引绘制顶点数组

因评论而更新

假设您有一个共享顶点的立方体(在 OpenGL 中不常见,但我懒得写下 24 个顶点)。

Cube Vertices

我将它们放在我的程序中的数组中,形成它们位置的列表。你从一个文件加载它们,我正在给它们写一个 C 数组:

GLfloat vertices[3][] = {
{-1,-1, 1},
{ 1,-1, 1},
{ 1, 1, 1},
{-1, 1, 1},
{-1,-1,-1},
{ 1,-1,-1},
{ 1, 1,-1},
{-1, 1,-1},
};

这给出了顶点索引(数组中的位置),在图片中它看起来像

Cube Vertices with Indices

要绘制立方体,我们必须告诉 OpenGL 哪些顶点、哪些顺序构成一个面。那么让我们看看这些面孔:

Cube with face edges

我们将用三角形构建立方体。 3 个连续的指数组成一个三角形。对于立方体,这是

GLuint face_indices[3][] = {
{0,1,2},{2,3,0},
{1,5,6},{6,2,1},
{5,4,7},{7,6,5},
{4,0,3},{3,7,4},
{3,2,6},{6,7,2},
{4,5,0},{1,0,5}
};

然后您可以通过将 OpenGL 指向顶点数组来绘制它

glVertexPointer(3, GL_FLOAT, 0, &vertices[0][0]);

并对带有顶点的数组发出批处理调用。有 6*2 = 12 个三角形,每个三角形由 3 个顶点组成,这构成了一个包含 36 个索引的列表。

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, &face_indices[0][0]);

关于c++ - 在 OpenGl 中导入和显示 .fbx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14094837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com