波面ファイルから3Dオブジェクトをロードして、事前定義した構造に保存しようとすると問題が発生します。セグメンテーション違反エラーが発生しました。どこかでポインタが間違っていると思います。構造は次のとおりです。
struct vertex
{
float x,y,z;
};
// the idea is to split each object into groups in order to animate
// them seperately
struct group
{
float xpos, ypos, zpos;
float xrot, yrot, zrot;
int numVertices;
int numFaces;
//all verteces
vertex vertices[MAX_NUM];
//faces-- a face is made up of one vertex from each of these arrays
vertex vertexOne[MAX_NUM];
vertex vertexTwo[MAX_NUM];
vertex vertexThree[MAX_NUM];
};
struct object
{
float xpos, ypos, zpos;
float xrot, yrot, zrot;
int numGroups;
group * groups[MAX_NUM];
};
これは、オブジェクトをロードする必要がある関数です。
object * loadObject(char * path)
{
object * obj;
obj = new object;
char str[1];
obj->numGroups = 0;
FILE * file = fopen(path, "r");
while(fscanf(file, "%s", str) != EOF)
{
if(str[0] == 'o')
{
obj->numGroups++;
obj->groups[obj->numGroups-1] = new group;
obj->groups[obj->numGroups-1]->numVertices = 0;
obj->groups[obj->numGroups-1]->numFaces = 0;
}
else if(str[0] == 'v' && str[1] == ' ')
{
obj->groups[obj->numGroups-1]->numVertices++;
sscanf(str, "v %f %f %f",
&(obj->groups[obj->numGroups-1]->vertices[obj->groups[obj->numGroups-1]->numVertices-1].x),
&(obj->groups[obj->numGroups-1]->vertices[obj->groups[obj->numGroups-1]->numVertices-1].y),
&(obj->groups[obj->numGroups-1]->vertices[obj->groups[obj->numGroups-1]->numVertices-1].z));
}
else if(str[0] == 'f')
{
int one, two, three;
obj->groups[obj->numGroups-1]->numFaces++;
sscanf(str, "f %i/%*i/%*i %i/%*i/%*i %i/%*i/%*i", &one, &two, &three);
obj->groups[obj->numGroups-1]->vertexOne[obj->groups[obj->numGroups-1]->numFaces-1] = obj->groups[obj->numGroups-1]->vertices[one-1];
obj->groups[obj->numGroups-1]->vertexTwo[obj->groups[obj->numGroups-1]->numFaces-1] = obj->groups[obj->numGroups-1]->vertices[two-1];
obj->groups[obj->numGroups-1]->vertexThree[obj->groups[obj->numGroups-1]->numFaces-1] = obj->groups[obj->numGroups-1]->vertices[three-1];
}
}
fclose(file);
return obj;
}
私はかなり長い間問題を見つけようとしましたが、エラーに関する情報がまったく得られません。頂点と面を割り当てる方法が少し面倒であることを私は知っています。きちんとしたコードの提案は大歓迎です。追加情報が必要な場合はお知らせください。よろしくお願いします。