Bonjour,
J'essaye de créer un loader de fichier 3D OBJ. Le format est un format texte qui se présente comme ceci pour un simple cube :
Chaque vertice est définit par v suivi d'un espace et des trois couplets x, y, z, tandis que les faces par f.o 1
# Vertex list
v -0.539683 0 0.031746
v 0.52381 0 0.031746
v 0.52381 0 -1
v -0.539683 0 -1
v -0.539683 0 0.031746
v 0.52381 0 0.031746
v 0.52381 0 -1
v -0.539683 0 -1
v -0.539683 0.899706 0.031746
v 0.52381 0.899706 0.031746
v 0.52381 0.899706 -1
v -0.539683 0.899706 -1
# Face list
g
usemtl Default
f 2 3 4 1
g
f 8 7 6 5
g
f 6 10 9 5
g
f 7 11 10 6
g
f 12 11 7 8
g
f 9 12 8 5
g
f 10 11 12 9
# End
Je voudrais simplement récupérer ces valeurs, mais j'ai beaucoup de mal à comprendre comment ça fonctionne (ça a toujours été mon point faible, les fichiers).
J'ai pour ceci dans ma classe :
CVector * vertices;
stPolygon * polyList;
Je pense qu'il est mieux d'utiliser des vector mais obn, on verra ça après. Donc j'ai réussi à récupérer le nombre de faces et le nombres de vertices avec ce code :
Toutefois, je ne sais pas du tout comment faire pour récuperer les autres valeurs que je veux...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 std::ostringstream buffer; std::string strBuffer; buffer << fichier.rdbuf(); strBuffer = buffer.str (); std::string ligne; for (unsigned int i = 0 ; i < strBuffer.size () - 1; ++i) { if (strBuffer [i] == 'v' && strBuffer [i+1] == ' ') totalVertices++; if (strBuffer [i] == 'f' && strBuffer [i+1] == ' ') totalFaces++; }
Par exemple je voudrais faire ça :
if (strBuffer [i] == 'v' && strBuffer [i+1] == ' ')
{
GLfloat x, y, z;
x = la valeur d'x;
y = la valeur d'y;
z = la valeur d'z;
vertices = new CVector (x, y, z);
totalVertices++;
}
J'avias pensé à un getline pour récuperer touta la ligne (je fais le if, si c'est bon, je récupère toute la ligne avec getline, et je récupère les valeurs), mais je suis incapable de le faire.
Merci.
Partager