Wavefront OBJ Parsing — почему я продолжаю получать неверные данные в качестве вывода?

Я пишу анализатор сетки 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, хотя я не уверен, что это актуально.

2

Решение

Насколько я понимаю:

  1. Вы берете строку в буфер — fgets( line, BUFF_LEN, filePtr );
  2. но тогда вы используете fscanf читать значения для вектора … вы используете filepointer

Я думаю, что вы должны использовать sscanf читать из line буфер.

После того, как указатель файла первого шага перемещен, поэтому при использовании второго шага вы читаете некоторые другие данные из файла.

Обычно чтение из файла включает в себя:

  • прочитать одну строку в некоторый буфер
  • разобрать этот буфер (эту строку)
  • прочитайте другую строку

немного больше информации OpenGL Totorial о OBJ, OBJ погрузчик

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]