1

現在、ベクターにロードした.objモデルをレンダリングしようとしています。Vector3Dオブジェクトを配列から取得しようとしていますが、範囲外エラーが発生します。たとえば、配列に12個のオブジェクトがある場合、配列がクラッシュする前に5になります。レンダリングのコードは次のとおりです。

glBegin(GL_TRIANGLE_STRIP);

for (int indx = 0; indx < mv3_faces.size(); ++indx)
{
    if (mb_print_once)
    {
        std::cout << "Rendering Loop....Faces at 8: " << mv3_faces.at(5).x << " Current Index: " << indx << std::endl;
        std::cout << "Rendering Loop X: " << mv3_faces.at(indx).x << " Y: " << mv3_faces.at(indx).y << " Z: " << mv3_faces.at(indx).z << std::endl;
    }

    glColor4f(1.0f, 1.0f, 0.0f, 1.0f);

    glVertex3f(mv3_vertices.at(mv3_faces.at(indx).x).x, mv3_vertices.at(mv3_faces.at(indx).y).y, mv3_vertices.at(mv3_faces.at(indx).z).z);
}

mb_print_once = false;
glEnd();

デバッグ用のmb_print_once...は無視してください。

4

3 に答える 3

3

.OBJファイルの頂点インデックスが0ではなく1で始まることを覚えていますか?したがって、「f」タグから頂点インデックスを読み取った後、頂点インデックスを1つデクリメントする必要があります。

また、ちょっとしたコメントとして、の[]代わりに使用することを強くお勧めします.atが、この例ではそれは良い考えだったので、例外が発生しました。しかし、一般的に、範囲チェックのオーバーヘッドは、特にループを最適化するために非常に高度な場合には、それだけの価値はありません。

于 2011-05-22T15:17:38.907 に答える
0

私の推測では、例外はmv3_vertices.at呼び出しから発生します。ループがどのように作成されるかにより、のindx範囲内にある必要がありますmv3_faces。したがって、その中に格納されているのは、の有効なインデックスではない可能性がありますmv3_vertices

もし私があなたなら、デバッガーを使って例外がどこから来たのかを正確に見つけ(または、glVertex3f(...)行を複数のステートメントに分割してログを追加することができます)、不良データがどこから来たのかを追跡します。

于 2011-05-22T15:15:37.070 に答える
0
glVertex3f(mv3_vertices.at(mv3_faces.at(indx).x).x, mv3_vertices.at(mv3_faces.at(indx).y).y, mv3_vertices.at(mv3_faces.at(indx).z).z);

私はこの線を疑っています。

あなたはそれを確認しましたmv3_faces.at(indx).x < mv3_vertices.size()か?それが当てはまらない場合は、範囲外の例外が発生します。他の2つもチェックしてください。つまり、、、mv3_faces.at(indx).yおよびmv3_faces.at(indx).z

関数を使用するときは常にstd::vector::at()、渡すインデックスがat()ベクトルのサイズの範囲内にあることを確認してください。そうでない場合は、例外at()がスローされます。out_of_rangeそれがわからない場合は、try-catchブロックを使用して、この例外と残りのプログラムフローを処理してください。

于 2011-05-22T15:17:09.283 に答える