gpt4 book ai didi

c++ - 如何在 OpenGL 中拥有多个独立移动的对象

转载 作者:行者123 更新时间:2023-11-30 03:36:06 25 4
gpt4 key购买 nike

我正在尝试使用 OpenGL 进行一些简单的图形处理,但我遇到了 2 个对象的问题,其中一个是静态的,另一个是移动的。这些对象是一个简单的立方体和一个代表地板的正方形。我希望立方体向下移动直到它接触到地板(就像它在移动一样)。我可以自己渲染下落的立方体,也可以自己得到地板。但是当我想让它们都出现在同一个场景中时,我遇到了问题,因为它们要么都掉了下来(立方体行为),要么都留在同一个地方(地板行为)。出现这两个选项中的哪一个是由于我是否插入和弹出我的模型矩阵 - 当我弹出和插入时,它们保持静止,当我不这样做时,它们掉落(我想这在我画地板时是有道理的然后是立方体。

这是我在程序绘制阶段的代码:

//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);

我的推送和弹出功能的代码:

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;
}

关于我如何获得它以便地板停留在一个位置并且立方体向下移动的任何线索?我很乐意帮助解释任何代码、提供更多我的代码或回答任何一般性问题。感谢您的帮助。

最佳答案

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

此调用需要在每次调用 glDrawArrays 之前出现。现在,它只在渲染所有内容之前被调用一次,这意味着两个对象都接收到相同的 MVP 矩阵。

此外,我会重新考虑使用矩阵堆栈实现此逻辑的逻辑。这就是它在 Legacy OpenGL 中的工作方式(因为一切都取决于全局状态,以及其他一些原因)但是当我们可以简单地将矩阵与单个对象相关联并根据需要简单地绑定(bind)它们时,这并不是当今最好的解决方案。

关于c++ - 如何在 OpenGL 中拥有多个独立移动的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40848839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com