Wavefront OBJ解析-为什么我总是得到不正确的数据作为输出

Wavefront OBJ Parsing - why do I keep getting incorrect data as output?

本文关键字:不正确 数据 输出 解析 OBJ 为什么 Wavefront      更新时间:2023-10-16

我正在编写一个Wavefront.OBJ网格解析器。虽然我已经为此工作了大约3周,但我决定重写它的大部分内容,因为我正在逐个字符地解析它(我觉得这最终会带来太多的复杂性,而且无论如何都无法正常工作)。现在我已经一行一行地分析了它,我觉得我得到了更糟糕的结果。

下面是我的输出示例:

( 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

}

为了简单起见,我目前不分析索引(这些索引是以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){nn", lineCount );
        fgets( line, BUFF_LEN, filePtr );

        // append NULL term, since fgets does not
        // return one.
        line[ BUFF_LEN - 1 ] = '';
        // 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 %fn", &v[ 0 ], &v[ 1 ], &v[ 2 ] );
                    printf( "( %i )'%f %f %f'nn",
                            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

我认为您应该使用sscanf来读取line缓冲区。

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

一般来说,从文件中读取包括:

  • 将一行读取到某个缓冲区
  • 解析那个缓冲区(那个行)
  • 读取另一行

关于OBJ,OBJ加载程序的更多信息