2014-03-28 4 views
0

Итак, я пишу свой собственный код для загрузки файла obj. Но я пытаюсь разделить строку в следующем формате: (2) ПримерыРазделительные строки

п 1/2/3 4/5/6 7/8/9

е 13/45/76 445/7776/5566 677/7/45

3 группы из 3 чисел с пробелами после каждого места, кроме промежутка между косами. На данный момент у меня есть этот код.

На данный момент в программе уже вытащил «F» прочь, но есть пространство перед строкой, так как его «1/2/3 4/5/6 7/8/9»

Вторая группа («g2») - единственная, которая не работает. он возвращается, «1/2/3 7/8»

буфер - это строка, которую я разделяю.

// Divide into groups 
       // Create groups of 1/1/1, 2/2/1, 3/3/1 Ex 
       // At this point the buffer = SPACEHEREx/y/z u/v/w xn/yn/zn 
       string g1 = buffer.substr(1, buffer.find(' ', 1) - 1); // Pos 1 - First space 
       string g2 = buffer.substr(buffer.find(' ', 1) + 1, buffer.find(' ', buffer.find(' ', 1) + 1) - 1); // First space - Second space 
       string g3 = buffer.substr(buffer.find(' ', buffer.find(' ', 1) + 1) + 1, buffer.size()); // Second space - End 
+1

** Изучите спецификации '.obj'. ** Строка' f' не гарантирует, что этот точный формат. Таким образом, разбивается на пробелы, а затем разбивается на '/'. [См. Здесь] (http://www.martinreddy.net/gfx/3d/OBJ.spec). – CodeAngry

ответ

0

Это может быть полезно для вас:

http://www.rastertek.com/dx11tut08.html

Он описывает, как загрузить и сделать файл .obj.

Вот отрывок о том, как читать строки из файла OBJ (в том числе лица («F») вы пытаетесь прочитать):

// Initialize the indexes. 
    vertexIndex = 0; 
    texcoordIndex = 0; 
    normalIndex = 0; 
    faceIndex = 0; 

    // Open the file. 
    fin.open(filename); 

    // Check if it was successful in opening the file. 
    if(fin.fail() == true) 
    { 
     return false; 
    } 

    // Read in the vertices, texture coordinates, and normals into the data structures. 
    // Important: Also convert to left hand coordinate system since Maya uses right hand coordinate system. 
    fin.get(input); 
    while(!fin.eof()) 
    { 
     if(input == 'v') 
     { 
      fin.get(input); 

      // Read in the vertices. 
      if(input == ' ') 
      { 
       fin >> vertices[vertexIndex].x >> vertices[vertexIndex].y >> vertices[vertexIndex].z; 

       // Invert the Z vertex to change to left hand system. 
       vertices[vertexIndex].z = vertices[vertexIndex].z * -1.0f; 
       vertexIndex++; 
      } 

      // Read in the texture uv coordinates. 
      if(input == 't') 
      { 
       fin >> texcoords[texcoordIndex].x >> texcoords[texcoordIndex].y; 

       // Invert the V texture coordinates to left hand system. 
       texcoords[texcoordIndex].y = 1.0f - texcoords[texcoordIndex].y; 
       texcoordIndex++; 
      } 

      // Read in the normals. 
      if(input == 'n') 
      { 
       fin >> normals[normalIndex].x >> normals[normalIndex].y >> normals[normalIndex].z; 

       // Invert the Z normal to change to left hand system. 
       normals[normalIndex].z = normals[normalIndex].z * -1.0f; 
       normalIndex++; 
      } 
     } 

     // Read in the faces. 
     if(input == 'f') 
     { 
      fin.get(input); 
      if(input == ' ') 
      { 
       // Read the face data in backwards to convert it to a left hand system from right hand system. 
       fin >> faces[faceIndex].vIndex3 >> input2 >> faces[faceIndex].tIndex3 >> input2 >> faces[faceIndex].nIndex3 
        >> faces[faceIndex].vIndex2 >> input2 >> faces[faceIndex].tIndex2 >> input2 >> faces[faceIndex].nIndex2 
        >> faces[faceIndex].vIndex1 >> input2 >> faces[faceIndex].tIndex1 >> input2 >> faces[faceIndex].nIndex1; 
       faceIndex++; 
      } 
     } 

     // Read in the remainder of the line. 
     while(input != '\n') 
     { 
      fin.get(input); 
     } 

     // Start reading the beginning of the next line. 
     fin.get(input); 
    } 

    // Close the file. 
    fin.close(); 

EDIT: Для решения вопроса в комментарии здесь является возможным решением:

std::string buffer = " 1/2/3 4/5/6 7/8/9"; 
    string g1 = buffer.substr(1, buffer.find(' ', 1) - 1); // Pos 1 - First space 
    string g2 = buffer.substr(buffer.find(' ', 1) + 1, g1.length()); // First space - Second space 
    string g3 = buffer.substr(buffer.find(' ', buffer.find(' ', 1) + 1) + 1, g1.length()); // Second space - End 

Рабочего примера: http://ideone.com/07aVQO

проблемы была вторым параметром substr(). Это должна быть длина, а не позиция во входной строке.

+0

Просьба указать наиболее важные пункты внешних ресурсов. Внешний ресурс может выйти в автономный режим, разразиться пламенем, перейти на сайт продажи мороженого или перенаправить на ваш любимый субреддит. – Zeta

+0

попытался включить часть, которая должна отвечать на вопрос. – puelo

+0

Хорошо, что помогло, и я делаю это сейчас. Легче и эффективнее.Но теперь из любопытства, как бы я разделил эту строку? –

1

У меня нет репутацией, чтобы комментировать сообщения, мои извинения.

Я бы определенно рекомендовал разделить их на разные линии. Даже беря детали buffer.find и устанавливая их в соответствующие имена позиций. Было бы немного легче отлаживать, а также легко читать.

И если несколько дополнительных int s - это слишком много, а затем объедините их обратно, как только ваша отладка будет выполнена.

Еще одна вещь, которую вы можете попробовать - это разделить буферную строку на пробелы и просто сохранить «x/y/z», вызвать функцию «split by//», а затем сохранить их в соответствующие переменные. Я думаю, что с .obj-файлами отображается его «f vertex/texture/normal vertex/texture/normal ....».

+0

+1 идет к вашему списку репутации фонда. – CodeAngry

Смежные вопросы