2014-11-25 2 views
0

Я экспортировал файл .obj, и я проанализировал информацию внутри в векторы вершин, uvs и нормалей (C++). Как я рисую эти данные в OpenGL. Обратите внимание, что я запускаю старую версию OpenGL, и я вынужден использовать полосы треугольников и квадранты. Код ниже показывает, что я до сих пор.Рисунок в OpenGL с использованием треугольных полосок или четырехполосных полос

OpenGLObject::OpenGLObject(std::string& fileName) { 
    std::ifstream inFile(fileName.c_str()); 
    if (!inFile.is_open()) { 
     std::string err = "[Error] Unable to open file " + fileName + "."; 
     throw(err); 
    } 

    std::vector<unsigned int> vertexIndices, uvIndices, normalIndices; 
    std::vector<glm::vec3> vertices; 
    std::vector<glm::vec2> uvs; 
    std::vector<glm::vec3> normals; 
    // Reading file contents 
    while (inFile.good()) { 
     std::string token; 
     inFile >> token; 

     // Parsing verticies 
     if (token == "v") { 
      glm::vec3 tempVect; 
      inFile >> tempVect.x; 
      inFile >> tempVect.y; 
      inFile >> tempVect.z; 
      vertices.push_back(tempVect); 
     } 
     // Parsing uvs 
     else if (token == "vt") { 
      glm::vec2 tempUv; 
      inFile >> tempUv.x; 
      inFile >> tempUv.y; 
      uvs.push_back(tempUv); 
     } 
     // Parsing normals 
     else if (token == "vn") { 
      glm::vec3 tempNormal; 
      inFile >> tempNormal.x; 
      inFile >> tempNormal.y; 
      inFile >> tempNormal.z; 
      normals.push_back(tempNormal); 
     } 
     // Parsing faces (Note: not robust for all .obj files) 
     else if (token == "f") { 
      unsigned int vertexIndex[4], uvIndex[4], normalIndex[4]; 
      for (unsigned int i = 0; i < 4; ++i) { 
       inFile >> vertexIndex[i]; 
       vertexIndices.push_back(vertexIndex[i]); 
       inFile.ignore(1, '/'); 
       inFile >> uvIndex[i]; 
       uvIndices.push_back(uvIndex[i]); 
       inFile.ignore(1, '/'); 
       inFile >> normalIndex[i]; 
       normalIndices.push_back(normalIndex[i]); 
      } 
     } 
    } 
    inFile.close(); 

    for (unsigned int i = 0; i < vertexIndices.size(); ++i) { 
     unsigned int vertexIndex = vertexIndices[i]; 
     glm::vec3 vertex = vertices[vertexIndex - 1]; 
     vertices_.push_back(vertex); 
    } 

    for (unsigned int i = 0; i < uvIndices.size(); ++i) { 
     unsigned int uvIndex = uvIndices[i]; 
     glm::vec2 uv = uvs[uvIndex - 1]; 
     uvs_.push_back(uv); 
    } 

    for (unsigned int i = 0; i < normalIndices.size(); ++i) { 
     unsigned int normalIndex = normalIndices[i]; 
     glm::vec3 normal = normals[normalIndex - 1]; 
     normals_.push_back(normal); 
    } 
} 
+0

В чем проблема? – Andreas

ответ

0

На самом деле в старых версиях OpenGL используется более широкий набор примитивов на выбор, чем в современном OpenGL. Поэтому я действительно не вижу твоей проблемы. Почему бы просто не рисовать, используя простые (индексированные) треугольники. Вы не ограничены примитивами …_STRIP. GL_TRIANGLESGL_QUADS!) Действительно доступны в OpenGL-2.1 и ранее.

+0

Я действительно новичок в OpenGL; Можете ли вы привести мне пример с указанием вершин и указаний? Я знаю, как простые фигуры, такие как кубы, используя только вертикулы, но я не понимаю, как знаки и вершины можно использовать для рисования более сложных объектов. – Akash

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