0

私は本当に単純な obj ファイル リーダーを作成しようとしています。これは、obj ファイルからすべての頂点値を順番に 1 つのベクトルに書き込みます (既に実行済みです)。また、obj ファイルからの面の値によって参照される頂点値を別のベクトルに書き込みます。例:

v1 = 0.0 0.0 0.0

v2 = 1.0 0.0 0.0

v3 = 1.0 1.0 0.0

f1 = 3 2 1

私のプログラムは、すべての頂点値を最初のベクトルに順番に書き込み、次に、面を構成する頂点値を次のように 2 番目のベクトルに書き込みます: 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0

最初のベクトル (verticesCoordsXYZ) から値を取得して 2 番目のベクトル (faceCoords) に戻すまで、すべてがうまくいきました。コメントアウトしたコードがプログラムを壊します。最初のベクトルで検索している場所がベクトルのサイズよりも大きいようです (プログラムが中断すると、メモリ位置エラーで out_of_range が発生し、verticesCoordsXYZ のサイズが0)、すべての頂点値でベクトルを埋めましたが。

私は何を間違っていますか?ベクトルがどのように機能するかを理解していないのでしょうか。ベクトルの範囲外ですか? この問題を解決するにはどうすればよいですか?

    string line;
    while (getline(modelfile, line))
    {

        string s;
        istringstream iss(line);
        iss >> s;
        vector <float> verticesCoordsXYZ;
        vector <float> faceCoords;

        if (s == "v")
        {

            float x, y ,z;
            iss >> x >> y >> z;
            verticesCoordsXYZ.push_back(x);
            verticesCoordsXYZ.push_back(y);
            verticesCoordsXYZ.push_back(z);

            for (int i = 0; i < (int)verticesCoordsXYZ.size(); i++)
            {
                cout << verticesCoordsXYZ.at(i);
            }
            cout << endl;

        }

        if (s == "f")
        {
            int a, b, c;

            iss >> a >> b >> c;

            int aLocation = a * 3 - 3; //vertice locations in verticeCoordsXYZ that would make up faces
            int bLocation = b * 3 - 3;
            int cLocation = c * 3 - 3;

            for (int i = 0; i < 2; i++)
            {
                //faceCoords.push_back(verticesCoordsXYZ.at(aLocation+i));
            }
            for (int i = 0; i < 2; i++)
            {
                //faceCoords.push_back(verticesCoordsXYZ.at(bLocation+i));
            }
            for (int i = 0; i < 2; i++)
            {
                //faceCoords.push_back(verticesCoordsXYZ.at(cLocation+i));
            }

            for (int i = 0; i < (int)faceCoords.size(); i++)
            {
                cout << faceCoords.at(i) << "f";
            }



            cout << endl << a << b << c;
        }

    }

    modelfile.close();
4

2 に答える 2

1

whileベクターはループ内で宣言されているため、ループを介して毎回ベクターを再作成しています。これは、s == "f"それらがすべて空の場合を意味します。

whileを宣言するループの外でそれらを宣言する必要がありますline

于 2016-03-09T20:32:29.263 に答える
0

while ループ内で vector を宣言して、while ループが再びループするたびにベクトルがリセットされるようにします。

while ループの前にベクトルを宣言してみてください

于 2016-03-09T20:36:31.877 に答える