Importing and Displaying .fbx files in OpenGl

c++, fbx, import, opengl

Solution

2) How should I display the vertices?

Questions like these indicate, that you should work through some OpenGL tutorials. Those are the basics and you need to know them.

This is a good start regarding your problem, but you'll need to work through the whole tutorial http://opengl.datenwolf.net/gltut/html/Basics/Tut01%20Following%20the%20Data.html

1) What exactly are those indices ?

You have a list of vertices. The index of a vertex is the position at which it is in that list. You can draw vertex arrays by its indices using `glDrawElements`

Update due to comment

Say you have a cube with shared vertices (uncommon in OpenGL, but I'm too lazy for writing down 24 vertices).

I have them in my program in an array, that forms a list of their positions. You load them from a file, I'm writing them a C array:

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},
};

This gives the vertices indices (position in the array), in the picture it looks like

To draw a cube we have to tell OpenGL in which vertices, in which order make a face. So let's have a look at the faces:

We're going to build that cube out of triangles. 3 consecutive indices make up a triangle. For the cube this is

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}
};

You can draw this then by pointing OpenGL to the vertex array

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

and issuing a batches call on the array with vertices. There are 6*2 = 12 triangles, each triangle consisting of 3 vertices, which makes a list of 36 indices.

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

Problem

I have been trying to import and display an fbx file using the `FBX SDK.Untill`. I managed to load in the file, but I got stuck at the part where I have to display it. The questions: - What exactly are those indices? - How should I display the vertices? Here is the class that I made: `3dModelBasicStructs.h` ``` struct vertex { float x,y,z; }; struct texturecoords { float a,b; }; struct poligon { int a,b,c; }; ``` `Model.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 ``` `Model.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); } ``` Sadly , When i try to use drawelements i get this error: Unhandled exception at 0x77e215de in A new begging.exe: 0xC0000005: Access violation reading location 0xcdcdcdcd.

Original source