我想用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頌歌,或回答一般問題。謝謝你的幫助。
嗨,感謝您的幫助,解決了這個問題。也感謝您對堆棧實現的評論。我知道它不再是最好的方法(因此爲什麼刪除了這個功能),但是我不完全理解你所建議的替代方法。如果可能,你能否詳細說明這意味着什麼。謝謝 – infraed
@infraed這不僅僅是一種代碼的東西,而是一種設計。通常當我們編寫渲染代碼時,我們將把所有的頂點,紋理和着色器組織成一個維護所有這些東西的單個對象。你可能會捆綁的東西之一是模型矩陣(或者有時候是整個MVP矩陣)。如果您需要更多信息,請查找一些人們在OpenGL中構建渲染引擎的資源:它們可能會有更清晰的構建模型來模擬我正在討論的內容。 – Xirema
這個清除了一點,我會看看渲染引擎。再次感謝。 – infraed