2016-10-03 11 views
-2

.objファイルを解析しようとしていますが、ファイルを解析しvec3とintベクトルにそれぞれ格納しました。ベクトルインデックスを別のベクトルで参照しているときにエラーが発生しました: 'std :: out_of_range in memory location'

しかし、私がaitVertex構造体を作成するときに、頂点と法線に対応する面を使ってすべてをリンクすると、次の "std :: out_of_range in memory location"が得られます。ここで

は、関連するコードです:

bool aitMesh::loadFromObj(std::string path) 
{ 
//Setup vars etc... 
//std::vector<float> tempVertices; 
//std::vector<float> tempNormals; 
float Vertex[3]; 
float Normal[3]; 
int Index[6]; 

std::vector<glm::vec3> tempVertices; 
std::vector<glm::vec3> tempNormals; 
std::vector<int> tempIndices; 


if (name == "v") 
{ 
    //sscanf_s matches a sequence of non-whitespace characters 
    //line.c_str returns a pointer to an array that contains a string.. 
    //in this case and stores in Vertex[1,2,3] 
    sscanf_s(line.c_str(), "%*s %f %f %f", &Vertex[0], &Vertex[1], &Vertex[2]); 
    std::cout << "Line: " << line << "\n"; 
    std::cout << "Name: " << name << "\n"; 

    //Adds to tempVertices Array 
    //tempVertices.push_back(Vertex[0]); 
    //tempVertices.push_back(Vertex[1]); 
    //tempVertices.push_back(Vertex[2]); 

    tempVertices.push_back(glm::vec3(Vertex[0], Vertex[1], Vertex[2])); 
    continue; 
} 
if (name == "vn") 
{ 
    sscanf_s(line.c_str(), "%*s %f %f %f", &Normal[0], &Normal[1], &Normal[2]); 
    std::cout << "Line: " << line << "\n"; 
    std::cout << "Name: " << name << "\n"; 

    //tempNormals.push_back(Normal[0]); 
    //tempNormals.push_back(Normal[1]); 
    //tempNormals.push_back(Normal[2]); 

    tempNormals.push_back(glm::vec3(Normal[0], Normal[1], Normal[2])); 
    continue; 
} 
if (name == "s") 
{ 
    continue; 
} 
if (name == "f") 
{ 
    sscanf_s(line.c_str(), "%*s %d//%d %d//%d %d//%d", &Index[0], &Index[1], &Index[2], &Index[3], &Index[4], &Index[5]); 
    std::cout << "Line: " << line << "\n"; 
    std::cout << "Name: " << name << "\n"; 

    tempIndices.push_back(Index[0]); 
    tempIndices.push_back(Index[1]); 
    tempIndices.push_back(Index[2]); 
    tempIndices.push_back(Index[3]); 
    tempIndices.push_back(Index[4]); 
    tempIndices.push_back(Index[5]); 

} 
    for (int i = 2; i <= tempIndices.size(); i++) 
    { 
     if (i % 2 == 0) 
     { 
      vertices.push_back(aitVertex(tempVertices.at(tempIndices[i-2]), tempNormals.at(tempIndices[i-1]))); 
     } 
    } 

私のプログラムは、上の破壊された行は

vertices.push_back(aitVertex(tempVertices.at(tempIndices[i-2]), tempNormals.at(tempIndices[i-1]))); 

である私は、私はその上tempIndices[i-2]を印刷しようとするとtempIndicesを参照するときに問題があると思いますそれは上に印刷する必要があります..
私はちょうどそれを間違って参照していますか?

+2

この行は 'tempIndices.size()== 0 'なので、実際には実行されません。ここに表示されるコードでは変更されません。私は[mcve]を作成する方法をお読みください – user463035818

+0

Apologies @ tobi303私は説明するためのコードを追加する必要があります。 上記を編集してより多くを含めると、tempIndicesに値が設定されていることを確認でき、tempIndices.size()を独自に出力して6を期待通りに出力できます。 ご返信ありがとうございます –

答えて

1

私は本当にあなたのコードを理解していません。それはまだMCVEではありません(リンクをお読みください!)。

name == "v" 
    tempVertices gets populated 
name == "vn" 
    tempNormals gets populated 
name == "f" 
    tempIndices gets populated 
and then... 
    you access all three vectors (if tempIndices.size() >= 2) 

は、このように、少なくともname == "f"の場合、あなたはベクトルインデックスにアクセスするのサイズを超えている。しかし、エラーの原因である可能性がありますあなたが唯一nameのある特定の場合には、各ベクトルを移入ということですベクトル。

continueは何をすべきですか? continueはループ内でのみ意味があり、なぜそこに置くのか分かりません。これはまだ実際のコードではないでしょうか?

+0

コードを理解するために努力していますが、+1 – UKMonkey

関連する問題