Wavefront OBJparsing – 为什么我不断获取不正确的数据作为输出?

我正在编写Wavefront .OBJ网格分析器。 虽然我一直在研究这个问题已经有三个星期了,但是我决定重写它的大部分内容,因为我正在逐个字符地parsing它(我觉得最后引入了太多的复杂性,无论如何都不能正常工作)。 现在我一直在逐行parsing,我觉得我的结果越来越差。

以下是我的输出示例:

( STREAM ):# cube.obj } (LINE 2){ ( STREAM ):# } (LINE 3){ ( STREAM ): } (LINE 4){ ( STREAM ):g cube } (LINE 5){ ( STREAM ): } (LINE 6){ ( VERTEX: 1 )'-597028128851671121920.000000 0.000000 -597118763794171953152.000000' ( STREAM ):v 0.0 0.0 0.0 } (LINE 7){ ( VERTEX: 2 )'-597028128851671121920.000000 0.000000 -597118763794171953152.000000' ( STREAM ):v 0.0 0.0 1.0 } (LINE 8){ ( VERTEX: 3 )'-597028128851671121920.000000 0.000000 -597118763794171953152.000000' ( STREAM ):v 0.0 1.0 0.0 } (LINE 9){ ( VERTEX: 4 )'-597028128851671121920.000000 0.000000 -597118763794171953152.000000' ( STREAM ):v 0.0 1.0 1.0 } (LINE 10){ ( VERTEX: 5 )'-597028128851671121920.000000 0.000000 -597118763794171953152.000000' ( STREAM ):v 1.0 0.0 0.0 } (LINE 11){ ( VERTEX: 6 )'-597028128851671121920.000000 0.000000 -597118763794171953152.000000' ( STREAM ):v 1.0 0.0 1.0 } (LINE 12){ ( VERTEX: 7 )'-597028128851671121920.000000 0.000000 -597118763794171953152.000000' ( STREAM ):v 1.0 1.0 0.0 } (LINE 13){ ( VERTEX: 8 )'-597028128851671121920.000000 0.000000 -597118763794171953152.000000' ( STREAM ):v 1.0 1.0 1.0 } 

我不是在parsing当前的索引(这是以f开始的行),只是为了简单起见。

我到目前为止所尝试的(对于顶点数据)

  • strtof( pLine, &pLine ) :这产生了零点的顶点

  • current implementation within the following code :不生成零,但绝对不是实际存储的数据

  //...declare lineCount and vertexCount above // NOTE: BUFF_LEN == 200 while( !feof( filePtr ) ) { printf( "(LINE %i){\n\n", lineCount ); fgets( line, BUFF_LEN, filePtr ); // append NULL term, since fgets does not // return one. line[ BUFF_LEN - 1 ] = '\0'; // evaluate the first character switch( line[ 0 ] ) { case 'v': { if ( line[ 1 ] == ' ' ) { // we have a vertex, not a normal SIMD_VEC3 v; fscanf( filePtr, " %f %f %f\n", &v[ 0 ], &v[ 1 ], &v[ 2 ] ); printf( "( %i )\'%f %f %f\'\n\n", vertexCount, v[ 0 ], v[ 1 ], v[ 2 ] ); ++vertexCount; } } break; } //...printf out the current line parsed from fgets, increment line count } 

我正在使用C ++,但是正在寻找一种标准的C方法。 我也正在使用OpenGL和Linux,但我不确定这是相关的。

我认为:

  1. 你把一行放入一个缓冲区 – fgets( line, BUFF_LEN, filePtr );
  2. 但是然后你使用fscanf来读取矢量的值…你使用filepointer

我想你应该使用sscanfline缓冲区读取。

在第一步文件指针移动后,当你使用第二步时,你正在读取文件中的一些不同的数据。

一般来说,从文件中读取涉及:

  • 读一行到一些缓冲区
  • 解析该缓冲区(该行)
  • 读另一条线

关于OBJ , OBJ loader的更多信息请参考opengl