【问题标题】:Wavefront OBJ Parsing - why do I keep getting incorrect data as output?Wavefront OBJ Parsing - 为什么我不断收到不正确的数据作为输出?
【发布时间】:2026-01-15 16:50:01
【问题描述】:

我正在编写 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){\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,虽然我不确定这是否相关。

【问题讨论】:

    标签: c++ linux parsing opengl mesh


    【解决方案1】:

    据我了解:

    1. 您将一行放入缓冲区 - fgets( line, BUFF_LEN, filePtr );
    2. 但是你使用fscanf 来读取向量的值...你使用filepointer

    我认为您应该使用sscanfline 缓冲区中读取数据。

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

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

    • 将一行读入某个缓冲区
    • 解析那个缓冲区(那行)
    • 再读一行

    更多信息opengl totorial about OBJ, OBJ loader

    【讨论】:

      最近更新 更多