Я пишу анализатор сетки 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, хотя я не уверен, что это актуально.
Насколько я понимаю:
fgets( line, BUFF_LEN, filePtr );
fscanf
читать значения для вектора … вы используете filepointer
Я думаю, что вы должны использовать sscanf
читать из line
буфер.
После того, как указатель файла первого шага перемещен, поэтому при использовании второго шага вы читаете некоторые другие данные из файла.
Обычно чтение из файла включает в себя:
немного больше информации OpenGL Totorial о OBJ, OBJ погрузчик
Других решений пока нет …