Импорт и отображение файлов .fbx в OpenGl

Я пытался импортировать и отобразить файл FBX, используя FBX SDK.Untill, Мне удалось загрузить файл, но я застрял в той части, где я должен его отобразить.
Вопросы:

  1. Что именно эти показатели?
  2. Как я должен отображать вершины?

Вот класс, который я сделал:

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

К сожалению, когда я пытаюсь использовать drawelements, я получаю эту ошибку:
Необработанное исключение в 0x77e215de в A New begging.exe: 0xC0000005: Место чтения нарушения доступа 0xcdcdcdcd.

3

Решение

2) Как я должен отображать вершины?

Подобные вопросы указывают на то, что вы должны пройти через некоторые учебные пособия по OpenGL. Это основы, и вы должны их знать.

Это хорошее начало для вашей проблемы, но вам нужно будет пройти весь урок
http://opengl.datenwolf.net/gltut/html/Basics/Tut01%20Following%20the%20Data.html

1) Что именно это за показатели?

У вас есть список вершин. Индекс вершины — это позиция, в которой она находится в этом списке. Вы можете нарисовать массивы вершин по их индексам, используя glDrawElements

Обновление из-за комментария

Скажем, у вас есть куб с общими вершинами (необычно в OpenGL, но мне лень записывать 24 вершины).

Вершины куба

У меня они есть в моей программе в массиве, который формирует список их позиций. Вы загружаете их из файла, я пишу им массив 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},
};

Это дает индексы вершин (положение в массиве), на рисунке это выглядит так

Вершины куба с индексами

Чтобы нарисовать куб, мы должны сообщить OpenGL, в каких вершинах, в каком порядке сделать лицо. Итак, давайте посмотрим на лица:

Куб с гранями

Мы собираемся построить этот куб из треугольников. 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]);
13

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

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

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