2011-05-22 109 views
1

目前我正试图呈现一个.obj模型,我加载到向量中。我试图将Vector3D对象从数组中拉出来,但它给我一个超出范围的错误。在数组崩溃之前,它只有五个,例如数组有12个对象。这是渲染的代码。std ::向量超出范围

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 ...。

+0

该错误对应哪一行?你确定矢量中有12个元素吗?你可以在循环前添加'std :: cout << mv3_faces.size()<< std :: endl;'来确认吗? – 2011-05-22 15:13:06

+0

另外,请注意,它被认为是很好的礼节*从您的代码片段中*删除*所有不相关的细节... – 2011-05-22 15:15:15

+0

哪个向量得到超出范围的错误 - 面或顶点? – 2011-05-22 15:15:54

回答

3

您还记得.OBJ文件中的顶点索引从1开始而不是从0开始?所以你必须在从“f”标签读取顶点索引后减1。

也作为一个小小的评论,我强烈建议使用[]而不是.at,虽然在这个例子中它是一个好主意,所以你有例外。但总的来说,范围检查开销并不值得,尤其是在这样一个高度优化循环的环境中。

+0

这就是我试过的,它工作得很好......谢谢。 – Jjack 2011-05-22 15:35:57

0

我的猜测是,除了来自mv3_vertices.at电话:indx应该在范围mv3_faces,因为这个循环是怎么制成的,所以也许它就是被存储在它里面,它不是为mv3_vertices有效的索引。

如果我是你,我会介入一个调试器来找出异常来自哪里(或者你可以在多个语句中拆分glVertex3f(...)行并添加一些日志记录),并跟踪哪些坏数据来自哪里。

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()?如果不是这样,那么你会超出范围例外。看看另外两个;即mv3_faces.at(indx).ymv3_faces.at(indx).z

当你使用std::vector::at()功能,确保您传递给at()该指数中的向量的大小的范围内,否则at()会抛出异常out_of_range。如果你不确定,那么使用try-catch块来处理这个异常和程序流的其余部分。