вращающиеся кубики по-разному - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть 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 Ответ

0 голосов
/ 02 ноября 2019

Поскольку актуальных вопросов нет, я попытаюсь дать некоторые комментарии к опубликованному коду, которые могут объяснить непредвиденное поведение результирующей программы.

  1. Инициализируется переменная angle, затем назначаетсянемедленно с новым значением;релевантно только это новое значение, тогда все кубики должны вращаться со скоростью 20 градусов в секунду. (это не проблема)
  2. Матрица view переназначается с новым значением для каждого объекта! Крайне маловероятно, что это то, что вам нужно.
    Это похоже на то, что, когда вы рисуете один кадр, вы перемещаете камеру перед каждым нарисованным объектом;если вы перемещаете камеру и объект одинаково, то все отображается в одном и том же месте в визуализированном кадре. (Я думаю, что это главная проблема)
    Вы должны выбрать один раз для всей матрицы view (а также матрицы projection) для всего кадра.

Некоторые другие комментарии, не имеет прямого отношения:

  • Вы должны получить одинаковые местоположения один раз для всех перед циклом (и даже в начале программы), поскольку они не изменятся, пока вы используете один и тот же шейдерprogram.
  • glUniformMatrix4fv() вызовы projection и view должны произойти один раз для всех перед циклом;только матрица 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);
  }
...