以不同方式旋转立方体

rotating cubes differently

我有 25 个立方体,我想以不同的方式旋转每个立方体这是我在 x 轴和 y 轴上的代码

我试过使用 rand() 但它一直奇怪地旋转它们,而且所有的旋转方向都相同

这是在游戏循环中

for (unsigned int i = 0; i < 25; i++)
{
    glm::mat4 model = glm::mat4(1.0f);
    model = glm::translate(model, cubePositions[i]);
    view = glm::translate(model, glm::vec3(0.0f, 0.0f, -10.0f));
    float angle = 20.0f * i;

    angle = glfwGetTime() * 20.0f;

    model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.0f, 0.5f));
    GLint modelLoc = glGetUniformLocation(ourShader.Program, "model");
    glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
    GLint viewLoc = glGetUniformLocation(ourShader.Program, "view");
    glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
    GLint projLoc = glGetUniformLocation(ourShader.Program, "projection");
    glUniformMatrix4fv(projLoc, 1, GL_FALSE, 
    glm::value_ptr(projection));

    glDrawArrays(GL_TRIANGLES, 0, 36);
}

由于没有实际问题,我尝试对发布的代码进行一些评论 这可以解释生成程序的意外行为。

  1. angle 变量被初始化,然后立即分配一个新的 价值 ;只有这个新值是相关的,那么立方体应该全部旋转 以每秒 20 度的速度。 (这不是问题)
  2. view 矩阵被重新分配 每个 对象的新值!这是 这不太可能是你想要的。
    就像在绘制单帧时,将相机移动到 正在绘制的每个对象;如果你以同样的方式移动相机和物体, 然后所有内容都显示在渲染帧中的同一位置。 (我认为这是主要问题)
    您应该为所有 view 矩阵(以及 projection 整个帧的矩阵)。

其他一些评论,没有直接关系:

  • 您应该在循环之前一次性检索统一位置 (甚至在程序开始时)因为它们不会改变多久 因为你使用相同的着色器程序。
  • glUniformMatrix4fv() 要求 projectionview 应该 在循环之前永远发生一次;只有 model 矩阵从 一个对象到另一个对象。

可能看起来像这样

  GLint modelLoc = glGetUniformLocation(ourShader.Program, "model");
  GLint viewLoc = glGetUniformLocation(ourShader.Program, "view");
  GLint projLoc = glGetUniformLocation(ourShader.Program, "projection");

  glm::mat4 projection = ... already known ...
  glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));

  glm::mat4 view = glm::mat4(1.0f);
  // adjust to the layout of your scene
  view = glm::translate(view, glm::vec3(0.0f, 0.0f, -10.0f));
  glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));

  for(unsigned int i = 0; i < 25; i++)
  {
    glm::mat4 model = glm::mat4(1.0f);
    model = glm::translate(model, cubePositions[i]);

    // the same rotation rate but a different offset for each object
    float angle = 20.0f * i;
    angle += std::fmod(glfwGetTime() * 20.0f, 360.0f);
    // choose x or y rotation axis
    auto axis=(i%2) ? glm::vec3(1.0f, 0.0f, 0.0f) : glm::vec3(0.0f, 1.0f, 0.0f);
    model = glm::rotate(model, glm::radians(angle), axis);

    glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));

    glDrawArrays(GL_TRIANGLES, 0, 36);
  }