2016-11-28 37 views
1

我想用OpenGL做一些簡單的圖形處理,但我遇到了兩個對象,其中一個是靜態的,另一個是移動的。這些物體是一個簡單的立方體和一個代表地板的正方形。我希望立方體向下移動,直到碰到地板(彷彿正在移動)。我可以自己渲染落下的立方體,並且我可以獨立發言。但是當我想讓他們都在同一場景中時,我遇到了問題,因爲他們都跌倒了(立方體行爲),或者兩者都停留在同一個地方(樓層行爲)。發生這兩種選擇中的哪一種是由於我是否推動和彈出我的模型矩陣 - 當我彈出和推動時,它們保持靜止,當我不這樣做時,它們掉下來(我想這在我畫地板時很有意義然後立方體如何在OpenGL中有多個獨立移動的對象

這是我在節目中的抽獎階段代碼:

//Clear the screen to the colour specified earlier, as well as the depth 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glUseProgram(programID); // Use our shader 
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]); 

//RENDER THE FLOOR 
pushMat(Model); //PUSH - WHEN ACTIVE, CUBE AND FLOOR FALL. WHEN COMMENTED OUT, BOTH FLOOR AND CUBE ARE STATIC 
    MVP = Projection * View * Model; //These are all matrices 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, floorVertexBuffer); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    //FLOOR COLOURS 
    glEnableVertexAttribArray(1); 
    glBindBuffer(GL_ARRAY_BUFFER, colorbuffer2); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
    glDrawArrays(GL_TRIANGLES, 0, 2*3); //2 triangles, of 3 vertices each 

Model = popMat(); //POP - WHEN ACTIVE, CUBE AND FLOOR FALL. WHEN COMMENTED OUT, BOTH FLOOR AND CUBE ARE STATIC 

glDisableVertexAttribArray(0); 
glDisableVertexAttribArray(1); 


//RENDER THE CUBE 
pushMat(Model); //PUSH - WHEN ACTIVE, CUBE AND FLOOR FALL. WHEN COMMENTED OUT, BOTH FLOOR AND CUBE ARE STATIC 
    Model = translate(Model, vec3(0.0f, deltaY, 0.0f)); //deltaY is the change in the y position of the cube, it is calculated earlier in this draw loop 
    MVP = Projection * View * Model; 

    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, cubeVertexBuffer); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    //CUBE COLOURS 
    glEnableVertexAttribArray(1); 
    glBindBuffer(GL_ARRAY_BUFFER, colorbuffer); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    //DRAW CUBE 
    glDrawArrays(GL_TRIANGLES, 0, 12 * 3); //12 triangle, of 3 vertices each 
Model = popMat(); //FINAL POP - WHEN ACTIVE, CUBE AND FLOOR FALL. WHEN COMMENTED OUT, BOTH FLOOR AND CUBE ARE STATIC 

glDisableVertexAttribArray(0); 
glDisableVertexAttribArray(1); 

代碼爲我的push和pop功能:如何我得到它

stack<mat4> modelViewStack; //This is initialised with the identity matrix in the main function 

void pushMat(mat4 m) 
{ 
    modelViewStack.push(m); 
} 

mat4 popMat() 
{ 
    mat4 temp = modelViewStack.top(); 
    modelViewStack.pop(); 
    return temp; 
} 

任何線索所以地板停留在一個地方,立方體向下移動?我很樂意幫助解釋任何代碼,提供更多的c頌歌,或回答一般問題。謝謝你的幫助。

回答

2
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]); 

在每次致電glDrawArrays之前,需要出現此呼叫。現在,在渲染所有內容之前,它只會被調用一次,這意味着兩個對象都接收到相同的MVP矩陣。

另外,我會重新考慮使用矩陣堆棧實現這個邏輯的邏輯。這就是它在Legacy OpenGL中的工作原理(因爲一切都依賴於Global State和其他一些原因),但目前並不明顯,這是最好的解決方案,我們可以簡單地將矩陣與單個對象相關聯,並根據需要簡單地綁定它們。

+0

嗨,感謝您的幫助,解決了這個問題。也感謝您對堆棧實現的評論。我知道它不再是最好的方法(因此爲什麼刪除了這個功能),但是我不完全理解你所建議的替代方法。如果可能,你能否詳細說明這意味着什麼。謝謝 – infraed

+0

@infraed這不僅僅是一種代碼的東西,而是一種設計。通常當我們編寫渲染代碼時,我們將把所有的頂點,紋理和着色器組織成一個維護所有這些東西的單個對象。你可能會捆綁的東西之一是模型矩陣(或者有時候是整個MVP矩陣)。如果您需要更多信息,請查找一些人們在OpenGL中構建渲染引擎的資源:它們可能會有更清晰的構建模型來模擬我正在討論的內容。 – Xirema

+0

這個清除了一點,我會看看渲染引擎。再次感謝。 – infraed