OpenGL - 将矢量数据动画化为单独的帧
OpenGL - animating the data of the vector as separate frames
我将计算结果的输出(基本上是特定旋转的一定数量的长方体)存储在 std::vector Box 中,基于它我正在创建用于 OpenGl 可视化的模型矩阵:
std::vector<glm::mat4> modelMatrices;
for (int32_t i = 0; i < Box.number_of_cuboids(); i++)
{
float rx, ry, rz, teta;
Box.cuboid(i).get_rotation(rx, ry, rz, teta, j);
float x, y, z;
Box.cuboid(i).position(x, y, z, j);
glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(x, y, z))
* glm::rotate(glm::mat4(1.0f), teta, glm::vec3(rx, ry, rz))
* glm::scale(glm::mat4(1.0f), glm::vec3(
Box.cuboid(i).width(), Box.cuboid(i).length(j), Box.cuboid.height()));
modelMatrices.push_back(model);
}
}
我可以像这样成功地想象它们:
while (!glfwWindowShouldClose(window))
{
processInput(window, Box.size_x(), Box.size_y(), Box.size_z());
glClearColor(0.95f, 0.95f, 0.95f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* shaders part <...>*/
for (int32_t i = 0; i < modelMatrices.size(); i++)
{
ourShader.setMat4("model", modelMatrices[i]);
glDrawArrays(GL_TRIANGLES, 0, 36);
}
glfwSwapBuffers(window);
glfwPollEvents();
}
我的问题是Box已经是计算的最终输出了。我想看看所有的迭代步骤,所以基本上我想做的是:
function ManyCalculations (std::vector<Box>)
{
at every iteration I save the current status Box in the vector, i.e.
}
所以基本上在假设 10000 次迭代之后我最终得到相同数量的 Box 元素,现在我想 运行 在我的 OpenGl 函数中 frames/animation(视频?)这样的向量, 所以我可以看到内容的演化计算。
要用每一帧为您的对象设置动画,您需要不断更新顶点缓冲区对象 (VBO)。
您可以继续为每个新框添加一个框架或更改转换矩阵。
然后在绘制之前在 VBO 中设置新数据。
如果您知道这种情况下数据的最大大小,您可以构建一个大型 VBO 并使用 glBufferSubData 不断更新数据。
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glBufferData(GL_ARRAY_BUFFER, Box.number_of_cuboids() * sizeof(cuboids), &Box[0], GL_DYNAMIC_DRAW);
我将计算结果的输出(基本上是特定旋转的一定数量的长方体)存储在 std::vector Box 中,基于它我正在创建用于 OpenGl 可视化的模型矩阵:
std::vector<glm::mat4> modelMatrices;
for (int32_t i = 0; i < Box.number_of_cuboids(); i++)
{
float rx, ry, rz, teta;
Box.cuboid(i).get_rotation(rx, ry, rz, teta, j);
float x, y, z;
Box.cuboid(i).position(x, y, z, j);
glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(x, y, z))
* glm::rotate(glm::mat4(1.0f), teta, glm::vec3(rx, ry, rz))
* glm::scale(glm::mat4(1.0f), glm::vec3(
Box.cuboid(i).width(), Box.cuboid(i).length(j), Box.cuboid.height()));
modelMatrices.push_back(model);
}
}
我可以像这样成功地想象它们:
while (!glfwWindowShouldClose(window))
{
processInput(window, Box.size_x(), Box.size_y(), Box.size_z());
glClearColor(0.95f, 0.95f, 0.95f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* shaders part <...>*/
for (int32_t i = 0; i < modelMatrices.size(); i++)
{
ourShader.setMat4("model", modelMatrices[i]);
glDrawArrays(GL_TRIANGLES, 0, 36);
}
glfwSwapBuffers(window);
glfwPollEvents();
}
我的问题是Box已经是计算的最终输出了。我想看看所有的迭代步骤,所以基本上我想做的是:
function ManyCalculations (std::vector<Box>)
{
at every iteration I save the current status Box in the vector, i.e.
}
所以基本上在假设 10000 次迭代之后我最终得到相同数量的 Box 元素,现在我想 运行 在我的 OpenGl 函数中 frames/animation(视频?)这样的向量, 所以我可以看到内容的演化计算。
要用每一帧为您的对象设置动画,您需要不断更新顶点缓冲区对象 (VBO)。
您可以继续为每个新框添加一个框架或更改转换矩阵。
然后在绘制之前在 VBO 中设置新数据。
如果您知道这种情况下数据的最大大小,您可以构建一个大型 VBO 并使用 glBufferSubData 不断更新数据。
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glBufferData(GL_ARRAY_BUFFER, Box.number_of_cuboids() * sizeof(cuboids), &Box[0], GL_DYNAMIC_DRAW);