2014-03-28 112 views
0

所以我寫我自己的代碼來加載一個obj文件。 但我試圖分裂這個格式的字符串:(2例)劃分字符串

˚F1/2/3 4/5/6 7/8/9

˚F13/45/767776分之445/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(); 

編輯:要解決的問題這裏的評論是一個可能的解決方案:

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

問題是0的第二個參數。它應該是長度,而不是輸入字符串中的位置。

+0

請包括外部資源的最重要的點。外部資源可能會脫機,突然燃燒起來,變成冰激凌銷售網站或重定向到您最喜歡的subreddit。 – Zeta

+0

試圖包含應該回答問題的部分。 – puelo

+0

好吧,幫助,我現在這樣做。更簡單,更高效。但是現在出於好奇,我將如何分割那樣的字符串? –

1

我沒有評論帖子的推yet,我的道歉。

我肯定會推薦將這些分成不同的行。 即使將buffer.find部分並將其設置爲apporpriate位置名稱。 調試起來會稍微容易一些,而且易於閱讀。

如果一些額外的int太多,然後將它們合併回來,一旦你的調試完成。

你可以嘗試的另一件事是分隔緩衝線上的空格,只保留「x/y/z」,調用「拆分'/'的功能,然後將它們存儲到適當的變量。我認爲.obj文件的「f頂點/紋理/正常頂點/紋理/正常....」。

+0

+1轉到您的評論聲譽基金。 – CodeAngry