2011-05-22 152 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塊來處理這個異常和程序流的其餘部分。