gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:34:00 27 4
gpt4 key购买 nike

我正在编写 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 ):这为顶点生成了零

  • 以下代码中的当前实现:不生成零,但绝对不是存储的实际数据

代码

   //...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 读取 vector 的值...您使用 filepointer

我认为你应该使用 sscanfline 缓冲区中读取。

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

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

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

更多信息 opengl totorial about OBJ , OBJ loader

关于c++ - Wavefront OBJ 解析 - 为什么我总是得到不正确的数据作为输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17481373/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com